Full Code of yoshida-lab/XenonPy for AI

master 4b62835b6c05 cached
240 files
25.1 MB
6.6M tokens
980 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (26,370K chars total). Download the full file to get everything.
Repository: yoshida-lab/XenonPy
Branch: master
Commit: 4b62835b6c05
Files: 240
Total size: 25.1 MB

Directory structure:
gitextract_q28lv__2/

├── .github/
│   ├── config/
│   │   ├── check_env.sh
│   │   ├── linux_win_env.yml
│   │   ├── macos_env.yml
│   │   ├── matplotlibrc_agg
│   │   └── matplotlibrc_qtagg
│   ├── fetch_test.txt
│   └── workflows/
│       ├── deploy_pypi.yml
│       ├── mac.yml
│       ├── ubuntu.yml
│       └── win.yml
├── .gitignore
├── .pylintrc
├── .readthedocs.yml
├── .style.yapf
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── conda_env/
│   ├── cpu.yml
│   ├── cuda118.yml
│   ├── cuda121.yml
│   ├── devtools/
│   │   ├── extra_env.yml
│   │   └── rtd_env.yml
│   └── osx.yml
├── docker/
│   ├── cpu/
│   │   └── Dockerfile
│   ├── cuda10/
│   │   └── Dockerfile
│   ├── cuda11/
│   │   └── Dockerfile
│   └── cuda9/
│       └── Dockerfile
├── docs/
│   ├── Makefile
│   ├── make.bat
│   └── source/
│       ├── _static/
│       │   ├── css/
│       │   │   └── container.css
│       │   └── placehoder
│       ├── _templates/
│       │   ├── layout.html
│       │   └── placehoder
│       ├── api.rst
│       ├── books.rst
│       ├── changes.rst
│       ├── conf.py
│       ├── contact.rst
│       ├── contribution.rst
│       ├── copyright.rst
│       ├── features.rst
│       ├── index.rst
│       ├── installation.rst
│       ├── modules.rst
│       ├── setup.rst
│       ├── tutorial.rst
│       ├── tutorials/
│       │   ├── 1-dataset.rst
│       │   ├── 2-descriptor.rst
│       │   ├── 3-visualization.rst
│       │   ├── 4-random_nn_model_and_training.ipynb
│       │   ├── 5-pre-trained_model_library.ipynb
│       │   ├── 6-transfer_learning.ipynb
│       │   └── 7-inverse-design.ipynb
│       ├── xenonpy.contrib.extend_descriptors.descriptor.rst
│       ├── xenonpy.contrib.extend_descriptors.rst
│       ├── xenonpy.contrib.ismd.rst
│       ├── xenonpy.contrib.rst
│       ├── xenonpy.datatools.rst
│       ├── xenonpy.descriptor.rst
│       ├── xenonpy.inverse.iqspr.rst
│       ├── xenonpy.inverse.rst
│       ├── xenonpy.mdl.rst
│       ├── xenonpy.model.nn.rst
│       ├── xenonpy.model.rst
│       ├── xenonpy.model.training.dataset.rst
│       ├── xenonpy.model.training.extension.rst
│       ├── xenonpy.model.training.rst
│       ├── xenonpy.model.utils.rst
│       ├── xenonpy.rst
│       ├── xenonpy.utils.math.rst
│       ├── xenonpy.utils.rst
│       └── xenonpy.visualization.rst
├── hooks/
│   └── build
├── licences/
│   └── .gitkeep
├── mi_book/
│   ├── README.md
│   ├── common_setting.ipynb
│   ├── exercise_11.ipynb
│   ├── exercise_12.ipynb
│   ├── exercise_13.ipynb
│   ├── exercise_14.ipynb
│   ├── exercise_15.ipynb
│   ├── exercise_18.ipynb
│   ├── exercise_19.ipynb
│   ├── exercise_2-10.ipynb
│   ├── exercise_20.ipynb
│   ├── exercise_21.ipynb
│   ├── exercise_22.ipynb
│   ├── output/
│   │   └── .gitkeep
│   ├── retrieve_materials_project.ipynb
│   └── tools.ipynb
├── requirements.txt
├── samples/
│   ├── CSP_with_element_substitution.ipynb
│   ├── calculate_descriptors.ipynb
│   ├── custom_descriptor_calculator.ipynb
│   ├── data/
│   │   └── Dataset_I.csv
│   ├── dataset_and_preset.ipynb
│   ├── iQSPR.ipynb
│   ├── iSMD.ipynb
│   ├── kernel_neural_network.ipynb
│   ├── mp_ids.txt
│   ├── nn_model_build.ipynb
│   ├── pre-trained_model_library.ipynb
│   ├── predict_hypermaterials/
│   │   ├── OTHERS_data.csv
│   │   ├── QC_AC_data.csv
│   │   ├── model_training_and_vitural_screening.ipynb
│   │   ├── tools.ipynb
│   │   └── training_data.csv
│   ├── process_dataset_usgs.ipynb
│   ├── random_nn_model_and_training.ipynb
│   ├── sample_data_building.ipynb
│   ├── set1/
│   │   ├── data1.csv
│   │   ├── data1.msg
│   │   ├── data1.pd.xz
│   │   └── data1.pkl.z
│   ├── set2/
│   │   ├── data2.csv
│   │   ├── data2.msg
│   │   ├── data2.pd.xz
│   │   └── data2.pkl.z
│   ├── tools.ipynb
│   ├── transfer_learning.ipynb
│   └── visualization.ipynb
├── setup.cfg
├── setup.py
├── tests/
│   ├── contrib/
│   │   ├── descriptor/
│   │   │   └── test_mordred.py
│   │   └── ismd/
│   │       ├── test_reactant_pool.py
│   │       └── test_reactor.py
│   ├── datatools/
│   │   ├── ids.txt
│   │   ├── test_dataset.py
│   │   ├── test_preset.py
│   │   ├── test_scaler.py
│   │   └── test_splitter.py
│   ├── descriptor/
│   │   ├── 1.cif
│   │   ├── 2.cif
│   │   ├── test_base_desc.py
│   │   ├── test_crystal_graph.py
│   │   ├── test_elemental.py
│   │   ├── test_fingerprint.py
│   │   ├── test_frozen_feature.py
│   │   └── test_structures.py
│   ├── inverse/
│   │   ├── polymer_test_data.csv
│   │   ├── test_base_inverse.py
│   │   └── test_iqspr.py
│   ├── mdl/
│   │   └── test_mdl.py
│   ├── models/
│   │   ├── test_base_runner.py
│   │   ├── test_checker.py
│   │   ├── test_extension.py
│   │   ├── test_sequential.py
│   │   ├── test_trainer.py
│   │   ├── test_utils.py
│   │   └── test_wrapped.py
│   └── utils/
│       ├── test_gadget.py
│       ├── test_parameter_gen.py
│       └── test_product.py
└── xenonpy/
    ├── __doc__.py
    ├── __init__.py
    ├── __main__.py
    ├── _conf.py
    ├── conf.yml
    ├── contrib/
    │   ├── README.md
    │   ├── __init__.py
    │   ├── extend_descriptors/
    │   │   ├── README.md
    │   │   ├── __init__.py
    │   │   └── descriptor/
    │   │       ├── __init__.py
    │   │       ├── frozen_featurizer_descriptor.py
    │   │       ├── mordred_descriptor.py
    │   │       └── organic_comp_descriptor.py
    │   ├── ismd/
    │   │   ├── README.md
    │   │   ├── __init__.py
    │   │   ├── reactant_pool.py
    │   │   └── reactor.py
    │   └── sample_codes/
    │       ├── Binary_likelihood/
    │       │   └── binary_likelihood.ipynb
    │       ├── Fragment_Ngram/
    │       │   └── Fragment_Ngram.ipynb
    │       ├── README.md
    │       ├── Random_NN_structure/
    │       │   └── randNN_structures.ipynb
    │       ├── combine_fragments/
    │       │   └── combine_fragments.py
    │       └── iQSPR_V/
    │           ├── iQSPR_F.py
    │           ├── iQSPR_V.py
    │           └── iQSPR_VF.py
    ├── datatools/
    │   ├── __init__.py
    │   ├── dataset.py
    │   ├── mp_ids.txt
    │   ├── preset.py
    │   ├── splitter.py
    │   └── transform.py
    ├── descriptor/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── cgcnn.py
    │   ├── compositions.py
    │   ├── fingerprint.py
    │   ├── frozen_featurizer.py
    │   └── structure.py
    ├── inverse/
    │   ├── __init__.py
    │   ├── base.py
    │   └── iqspr/
    │       ├── __init__.py
    │       ├── estimator.py
    │       ├── iqspr.py
    │       ├── iqspr4df.py
    │       └── modifier.py
    ├── mdl/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── descriptor.py
    │   ├── mdl.py
    │   ├── method.py
    │   ├── model.py
    │   ├── modelset.py
    │   └── property.py
    ├── model/
    │   ├── __init__.py
    │   ├── cgcnn.py
    │   ├── extern.py
    │   ├── nn/
    │   │   ├── __init__.py
    │   │   ├── layer.py
    │   │   └── wrap.py
    │   ├── sequential.py
    │   ├── training/
    │   │   ├── __init__.py
    │   │   ├── base.py
    │   │   ├── checker.py
    │   │   ├── clip_grad.py
    │   │   ├── dataset/
    │   │   │   ├── __init__.py
    │   │   │   ├── array.py
    │   │   │   └── cgcnn.py
    │   │   ├── extension/
    │   │   │   ├── __init__.py
    │   │   │   ├── persist.py
    │   │   │   ├── tensor_convert.py
    │   │   │   └── validator.py
    │   │   ├── loss.py
    │   │   ├── lr_scheduler.py
    │   │   ├── optimizer.py
    │   │   └── trainer.py
    │   └── utils/
    │       ├── __init__.py
    │       └── metrics.py
    ├── utils/
    │   ├── __init__.py
    │   ├── math/
    │   │   ├── __init__.py
    │   │   └── product.py
    │   ├── parameter_gen.py
    │   ├── useful_cls.py
    │   └── useful_func.py
    └── visualization/
        ├── __init__.py
        └── heatmap.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/config/check_env.sh
================================================
#!/usr/bin/env bash

# pwd
# ls -al

python --version
python -c "import numpy; print('numpy %s' % numpy.__version__)"
python -c "import scipy; print('scipy %s' % scipy.__version__)"
python -c "import pandas; print('pandas %s' % pandas.__version__)"
python -c "import torch; print('pytorch %s' % torch.__version__)"
python -c "import pymatgen; print('pymatgen %s' % pymatgen.__version__)"
python -c "import rdkit; print('rdkit %s' % rdkit.__version__)"
python -c "from rdkit import Chem; print(Chem)"


================================================
FILE: .github/config/linux_win_env.yml
================================================
name: test
dependencies:
  - pandas>=1.1.3
  - seaborn
  - numpy
  - scipy
  - requests
  - rdkit=2020.09
  - scikit-learn
  - scipy
  - pytorch >=1.7.0,<2.0.0
  - cpuonly
  - pytest
  - pytest-cov
  - pymatgen>=2020.10.9
  - ruamel.yaml
  - tqdm
  - mordred
  - pip
  - pip:
      - OpenNMT-py==1.2
      - Deprecated


================================================
FILE: .github/config/macos_env.yml
================================================
name: test
dependencies:
  - pandas>=1.1.3
  - seaborn
  - numpy
  - scipy
  - requests
  - rdkit=2020.09
  - scikit-learn
  - scipy
  - pytorch >=1.7.0,<2.0.0
  - pytest
  - pytest-cov
  - pymatgen>=2020.10.9
  - ruamel.yaml
  - tqdm
  - mordred
  - pip
  - pip:
      - OpenNMT-py==1.2
      - Deprecated


================================================
FILE: .github/config/matplotlibrc_agg
================================================
backend: Agg


================================================
FILE: .github/config/matplotlibrc_qtagg
================================================
backend: Qt5Agg


================================================
FILE: .github/fetch_test.txt
================================================
Test xenonpy.utils.Loader._fetch_data

================================================
FILE: .github/workflows/deploy_pypi.yml
================================================
name: Deploy PiPy

on:
  push:
    tags:
      - v*

env:
  MPLBACKEN: "Agg"

jobs:
  test_ubuntu:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      max-parallel: 4
      matrix:
        python-version: [3.7]
        os: ["ubuntu-20.04"]

    steps:
      - uses: actions/checkout@v2

      - name: Install Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: conda-incubator/setup-miniconda@v2
        with:
          auto-update-conda: true
          auto-activate-base: false
          activate-environment: test
          mamba-version: "*"
          channels: pytorch,conda-forge,defaults
          environment-file: .github/config/linux_win_env.yml
          python-version: ${{ matrix.python-version }}

      - name: Check conda env
        shell: bash -l {0}
        run: .github/config/check_env.sh

      - name: Build a binary wheel and a source tarball
        shell: bash -l {0}
        run: |
          python setup.py bdist_wheel

      - name: Publish distribution 📦 to PyPI
        if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
        uses: pypa/gh-action-pypi-publish@master
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}


================================================
FILE: .github/workflows/mac.yml
================================================
name: MacOS

on:
  push:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"
  pull_request:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"

env:
  MPLBACKEN: "Agg"

jobs:
  test_macos:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      max-parallel: 6
      matrix:
        python-version: [3.7, 3.8, 3.9]
        os: ["macos-11.0", "macos-10.15"]

    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{github.event.pull_request.head.ref}}
          repository: ${{github.event.pull_request.head.repo.full_name}}

      - name: Install Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: conda-incubator/setup-miniconda@v2
        with:
          auto-update-conda: true
          auto-activate-base: false
          activate-environment: test
          mamba-version: "*"
          channels: pytorch,conda-forge,defaults
          environment-file: .github/config/macos_env.yml
          python-version: ${{ matrix.python-version }}

      - name: Check conda env
        shell: bash -l {0}
        run: .github/config/check_env.sh

      - name: Install XenonPy
        shell: bash -l {0}
        run: |
          pip install .

      - name: Test XenonPy
        shell: bash -l {0}
        env:
          api_key: ${{ secrets.api_key }}
        run: |
          pytest --cov=./ --cov-report=xml tests

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v1
        env:
          OS: ${{ matrix.os }}
          PYTHON: ${{ matrix.python-version }}
        with:
          env_vars: OS,PYTHON
          fail_ci_if_error: false


================================================
FILE: .github/workflows/ubuntu.yml
================================================
name: Ubuntu

on:
  push:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"
  pull_request:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"

env:
  MPLBACKEN: "Agg"

jobs:
  test_ubuntu:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      max-parallel: 6
      matrix:
        python-version: [3.7, 3.8, 3.9]
        os: ["ubuntu-18.04", "ubuntu-latest"]

    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{github.event.pull_request.head.ref}}
          repository: ${{github.event.pull_request.head.repo.full_name}}

      - name: Install Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: conda-incubator/setup-miniconda@v2
        with:
          auto-update-conda: true
          auto-activate-base: false
          activate-environment: test
          mamba-version: "*"
          channels: pytorch,conda-forge,defaults
          environment-file: .github/config/linux_win_env.yml
          python-version: ${{ matrix.python-version }}

      - name: Check conda env
        shell: bash -l {0}
        run: .github/config/check_env.sh

      - name: Install XenonPy
        shell: bash -l {0}
        run: |
          pip install .

      - name: Test XenonPy
        shell: bash -l {0}
        env:
          api_key: ${{ secrets.api_key }}
        run: |
          pytest --cov=./ --cov-report=xml tests

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v1
        env:
          OS: ${{ matrix.os }}
          PYTHON: ${{ matrix.python-version }}
        with:
          env_vars: OS,PYTHON
          fail_ci_if_error: false


================================================
FILE: .github/workflows/win.yml
================================================
name: Windows

on:
  push:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"
  pull_request:
    branches:
      - master
    paths-ignore:
      - "conda_env/**"
      - "devtools/**"
      - "docs/**"
      - "samples/**"
      - "licenses/**"
      - "hooks/**"
      - ".**"
      - "!.github/**"
      - "**.md"
      - "**.yml"
      - "**.txt"
      - "**.in"
      - "**.cfg"

env:
  MPLBACKEN: "Agg"

jobs:
  test_win:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      max-parallel: 3
      matrix:
        python-version: [3.7, 3.8, 3.9]
        os: ["windows-latest"]

    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{github.event.pull_request.head.ref}}
          repository: ${{github.event.pull_request.head.repo.full_name}}

      - name: Install Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: conda-incubator/setup-miniconda@v2
        with:
          auto-update-conda: true
          auto-activate-base: false
          activate-environment: test
          mamba-version: "*"
          channels: pytorch,conda-forge,defaults
          environment-file: .github/config/linux_win_env.yml
          python-version: ${{ matrix.python-version }}

      - name: Check conda env
        shell: bash -l {0}
        run: .github/config/check_env.sh

      - name: Install XenonPy
        shell: bash -l {0}
        run: |
          pip install .

      - name: Test XenonPy
        shell: bash -l {0}
        env:
          api_key: ${{ secrets.api_key }}
        run: |
          pytest --cov=./ --cov-report=xml tests

      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v1
        env:
          OS: ${{ matrix.os }}
          PYTHON: ${{ matrix.python-version }}
        with:
          env_vars: OS,PYTHON
          fail_ci_if_error: false


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
_build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
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/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# 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/

# custom
# *.csv
tags
.idea/
.vscode/
pyinstrument

.pytest_cache/
/playground/
.DS_Store


================================================
FILE: .pylintrc
================================================
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=

[DESIGN]
# custom
max-attributes=15
max-line-length=120

================================================
FILE: .readthedocs.yml
================================================
# Required
version: 2

# Build documentation in the docs/ directory with Sphinx
sphinx:
  configuration: docs/source/conf.py

conda:
  environment: conda_env/devtools/rtd_env.yml

build:
  os: "ubuntu-20.04"
  tools:
    python: "mambaforge-4.10"


================================================
FILE: .style.yapf
================================================
[style]
based_on_style = google

# The column limit.
column_limit=120


================================================
FILE: Dockerfile
================================================
FROM yoshidalab/base:cuda11

ARG key
ENV api_key=$key

# install xenonpy locally
WORKDIR /opt/xenonpy
COPY . .
RUN sudo chown -R user:user /opt && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf && \
    pip install --user -v .  && pytest tests -v && export api_key=""

EXPOSE 8888

WORKDIR /workspace
CMD [ "jupyter" , "lab", "--ip=0.0.0.0", "--no-browser", "--port=8888", "--allow-root"]


================================================
FILE: LICENSE
================================================
Copyright (c) 2021 TsumiNa. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * 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.
   * Neither the name of Google Inc. 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
OWNER 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.

================================================
FILE: MANIFEST.in
================================================
include *.rst LICENSE.rst docs/source/changes.rst requirement*.txt
recursive-include xenonpy *.py *.json *.yml *.txt
recursive-exclude tests/*.*
recursive-include licences *


================================================
FILE: Makefile
================================================
export SHELL := /bin/bash

doctest:
	pytest --doctest-modules xenonpy

unittest:
	pytest tests

lint:
	pylint xenonpy


================================================
FILE: README.md
================================================
<p align="center">
  <img height="200" src="https://github.com/yoshida-lab/XenonPy/blob/master/logo.png" alt="xenonpy">
</p>

# NOTES

> **To all those who have purchased the book [マテリアルズインフォマティクス](https://www.kyoritsu-pub.co.jp/book/b10013510.html) published by [KYORITSU SHUPPAN](https://www.kyoritsu-pub.co.jp/): The link to the exercises has changed to https://github.com/yoshida-lab/XenonPy/tree/master/mi_book. Please follow the new link to access all these exercises.**

> **Our XenonPy.MDL is under indefinite technical maintenance due to some security issues found during a server upgrade. Our current plan is to completely re-structure the model library server, but the completion time is unclear. In the mean time, if you would like to get access to the pretrained models, please contact us directly with your purpose of using the models and your affiliation. We will try to provide necessary aid to access part of the model library based on specific needs. Sorry for all the inconvenience. We will make further announcement here when a more concrete recovery schedule is available.**


**We apologize for the inconvenience** 🥺🙏🙇

# XenonPy project

[![MacOS](https://github.com/yoshida-lab/XenonPy/workflows/MacOS/badge.svg)](https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AMacOS)
[![Windows](https://github.com/yoshida-lab/XenonPy/workflows/Windows/badge.svg)](https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AWindows)
[![Ubuntu](https://github.com/yoshida-lab/XenonPy/workflows/Ubuntu/badge.svg)](https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AUbuntu)
[![Documentation Status](https://readthedocs.org/projects/xenonpy/badge/?version=latest)](https://xenonpy.readthedocs.io/en/latest/?badge=latest)
[![codecov](https://codecov.io/gh/yoshida-lab/XenonPy/branch/master/graph/badge.svg)](https://codecov.io/gh/yoshida-lab/XenonPy)
[![Version](https://img.shields.io/github/tag/yoshida-lab/XenonPy.svg?maxAge=360)](https://github.com/yoshida-lab/XenonPy/releases/latest)
[![Python Versions](https://img.shields.io/pypi/pyversions/xenonpy.svg)](https://pypi.org/project/xenonpy/)
[![Downloads](https://pepy.tech/badge/xenonpy)](https://pepy.tech/project/xenonpy)
![PyPI - Downloads](https://img.shields.io/pypi/dm/xenonpy.svg?label=PiPy%20downloads)

**XenonPy** is a Python library that implements a comprehensive set of machine learning tools
for materials informatics. Its functionalities partially depend on PyTorch and R.
The current release provides some limited modules:

-   Interface to public materials database
-   Library of materials descriptors (compositional/structural descriptors)
-   Pre-trained model library **XenonPy.MDL** (v0.1.0.beta, 2019/8/7: more than 140,000 models (include private models) in 35 properties of small molecules, polymers, and inorganic compounds)
-   Machine learning tools.
-   Transfer learning using the pre-trained models in XenonPy.MDL

XenonPy inspired by matminer: https://hackingmaterials.github.io/matminer/.

XenonPy is a open source project https://github.com/yoshida-lab/XenonPy.

See our documents for details: http://xenonpy.readthedocs.io

## Publications

1. H. Ikebata, K. Hongo, T. Isomura, R. Maezono, and R. Yoshida, “Bayesian molecular design with a chemical language model,” J Comput Aided Mol Des, vol. 31, no. 4, pp. 379–391, Apr. 2017, doi: 10/ggpx8b.
2. S. Wu et al., “Machine-learning-assisted discovery of polymers with high thermal conductivity using a molecular design algorithm,” npj Computational Materials, vol. 5, no. 1, pp. 66–66, Dec. 2019, doi: 10.1038/s41524-019-0203-2.
3. S. Wu, G. Lambard, C. Liu, H. Yamada, and R. Yoshida, “iQSPR in XenonPy: A Bayesian Molecular Design Algorithm,” Mol. Inform., vol. 39, no. 1–2, p. 1900107, Jan. 2020, doi: 10.1002/minf.201900107.
4. H. Yamada et al., “Predicting Materials Properties with Little Data Using Shotgun Transfer Learning,” ACS Cent. Sci., vol. 5, no. 10, pp. 1717–1730, Oct. 2019, doi: 10.1021/acscentsci.9b00804.
5. S. Ju et al., “Exploring diamondlike lattice thermal conductivity crystals via feature-based transfer learning,” Phys. Rev. Mater., vol. 5, no. 5, p. 053801, May 2021, doi: 10.1103/physrevmaterials.5.053801.
6. C. Liu et al., “Machine Learning to Predict Quasicrystals from Chemical Compositions,” Adv. Mater., vol. 33, no. 36, p. 2102507, Sep. 2021, doi: 10.1002/adma.202102507.

## XenonPy images (deprecated)

> Docker has introduced a new [Subscription Service Agreement](https://www.docker.com/legal/docker-subscription-service-agreement) which requires organizations with more than 250 employees or more than $10 million in revenue to buy a paid subscription.
> Since the fact that Docker company has been changed their policy to business first mode, we decided to drop the prebuilt Docker images service.

[XenonPy base images](https://hub.docker.com/repository/docker/yoshidalab/base) packed a lot of useful packages for materials informatics using.
The following table list some core packages in XenonPy images.

| Package        | Version   |
| -------------- | --------- |
| `PyTorch`      | 1.7.1     |
| `tensorly`     | 0.5.0     |
| `pymatgen`     | 2021.2.16 |
| `matminer`     | 0.6.2     |
| `mordred`      | 1.2.0     |
| `scipy`        | 1.6.0     |
| `scikit-learn` | 0.24.1    |
| `xgboost`      | 1.3.0     |
| `ngboost`      | 0.3.7     |
| `fastcluster`  | 1.1.26    |
| `pandas`       | 1.2.2     |
| `rdkit`        | 2020.09.4 |
| `jupyter`      | 1.0.0     |
| `seaborn`      | 0.11.1    |
| `matplotlib`   | 3.3.4     |
| `OpenNMT-py`   | 1.2.0     |
| `Optuna`       | 2.3.0     |
| `plotly`       | 4.11.0    |
| `ipympl`       | 0.5.8     |

## Requirements

In order to use this image you must have Docker Engine installed. Instructions
for setting up Docker Engine are
[available on the Docker website](https://docs.docker.com/engine/installation/).

### CUDA requirements

If you have a CUDA-compatible NVIDIA graphics card, you can use a CUDA-enabled
version of the PyTorch image to enable hardware acceleration. This **only** can be
used in Ubuntu Linux.

Firstly, ensure that you install the appropriate NVIDIA drivers and libraries.
If you are running Ubuntu, you can install proprietary NVIDIA drivers
[from the PPA](https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa)
and CUDA [from the NVIDIA website](https://developer.nvidia.com/cuda-downloads).

You will also need to install `nvidia-docker2` to enable GPU device access
within Docker containers. This can be found at
[NVIDIA/nvidia-docker](https://github.com/NVIDIA/nvidia-docker).

## Usage

Pre-built xenonpy images are available on Docker Hub under the name
[yoshidalab/xenonpy](https://hub.docker.com/r/yoshidalab/xenonpy/). For example,
you can pull the CUDA 10.1 version with:

```bash
docker pull yoshidalab/xenonpy:cuda10
```

The table below lists software versions for each of the currently supported
Docker image tags .

| Image tag | CUDA | PyTorch |
| --------- | ---- | ------- |
| `latest`  | 11.0 | 1.7.1   |
| `cpu`     | None | 1.7.1   |
| `cuda11`  | 11.0 | 1.7.1   |
| `cuda10`  | 10.2 | 1.7.1   |
| `cuda9`   | 9.2  | 1.7.1   |

### Running XenonPy

It is possible to run XenonPy inside a container.
Using xenonpy with jupyter is very easy, you could run it with
the following command:

```sh
docker run --rm -it \
  --runtime=nvidia \
  --ipc=host \
  --publish="8888:8888" \
  --volume=$HOME/.xenonpy:/home/user/.xenonpy \
  --volume=<path/to/your/workspace>:/workspace \
  -e NVIDIA_VISIBLE_DEVICES=0 \
  yoshidalab/xenonpy
```

Here's a description of the Docker command-line options shown above:

-   `--runtime=nvidia`: Required if using CUDA, optional otherwise. Passes the
    graphics card from the host to the container. **Optional, based on your usage**.
-   `--ipc=host`: Required if using multiprocessing, as explained at
    <https://github.com/pytorch/pytorch#docker-image.> **Optional**
-   `--publish="8888:8888"`: Publish container's port 8888 to the host. **Needed**
-   `--volume=$Home/.xenonpy:/home/user/.xenonpy`: Mounts
    the XenonPy root directory into the container. **Optional, but highly recommended**.
-   `--volume=<path/to/your/workspace>:/workspace`: Mounts
    the your working directory into the container. **Optional, but highly recommended**.
-   `-e NVIDIA_VISIBLE_DEVICES=0`: Sets an environment variable to restrict which
    graphics cards are seen by programs running inside the container. Set to `all`
    to enable all cards. Optional, defaults to all.

You may wish to consider using [Docker Compose](https://docs.docker.com/compose/)
to make running containers with many options easier. At the time of writing,
only version 2.3 of Docker Compose configuration files supports the `runtime`
option.

## Copyright and license

©Copyright 2021 The XenonPy project, all rights reserved.
Released under the `BSD-3 license`.


================================================
FILE: conda_env/cpu.yml
================================================
channels:
  - pytorch
  - conda-forge
dependencies:
  # Number
  - numpy
  - scipy
  - pandas

  # Mol/Crystall
  - pymatgen
  - ase
  - rdkit
  - matminer
  - matid

  # Plotting
  - seaborn
  - matplotlib
  - plotly

  # Machine larning
  - scikit-learn
  - imbalanced-learn
  - optuna
  - umap-learn
  - pytorch >=2.0.0,<3.0.0
  - cpuonly
  - torchvision
  - torchaudio
  - transformers
  - diffusers

  # Others
  - nodejs
  - jupyterlab
  - jupyterlab-lsp
  - ipywidgets
  - python-lsp-server
  - shapely
  - requests
  - ruamel.yaml
  - joblib
  - tqdm
  - Deprecated
  - fsspec
  - emmet-core
  - peewee
  - pip
  - pip:
    - xenonpy


================================================
FILE: conda_env/cuda118.yml
================================================
channels:
  - pytorch
  - nvidia
  - conda-forge
dependencies:
  # Number
  - numpy
  - scipy
  - pandas

  # Mol/Crystall
  - pymatgen
  - ase
  - rdkit
  - matminer
  - matid

  # Plotting
  - seaborn
  - matplotlib
  - plotly

  # Machine larning
  - scikit-learn
  - imbalanced-learn
  - optuna
  - umap-learn
  - pytorch >=2.0.0,<3.0.0
  - pytorch-cuda=11.8
  - torchvision
  - torchaudio
  - transformers
  - diffusers

  # Others
  - nodejs
  - jupyterlab
  - jupyterlab-lsp
  - ipywidgets
  - python-lsp-server
  - shapely
  - requests
  - ruamel.yaml
  - joblib
  - tqdm
  - Deprecated
  - fsspec
  - emmet-core
  - peewee
  - pip
  - pip:
    - xenonpy


================================================
FILE: conda_env/cuda121.yml
================================================
channels:
  - pytorch
  - nvidia
  - conda-forge
dependencies:
  # Number
  - numpy
  - scipy
  - pandas

  # Mol/Crystall
  - pymatgen
  - ase
  - rdkit
  - matminer
  - matid

  # Plotting
  - seaborn
  - matplotlib
  - plotly

  # Machine larning
  - scikit-learn
  - imbalanced-learn
  - optuna
  - umap-learn
  - pytorch >=2.0.0,<3.0.0
  - pytorch-cuda=12.1
  - torchvision
  - torchaudio
  - transformers
  - diffusers

  # Others
  - nodejs
  - jupyterlab
  - jupyterlab-lsp
  - ipywidgets
  - python-lsp-server
  - shapely
  - requests
  - ruamel.yaml
  - joblib
  - tqdm
  - Deprecated
  - fsspec
  - emmet-core
  - peewee
  - pip
  - pip:
    - xenonpy


================================================
FILE: conda_env/devtools/extra_env.yml
================================================
channels:
  - conda-forge
dependencies:
  - yapf
  - pytest
  - pytest-cov
  - pylint
  - sphinx
  - sphinx_rtd_theme
  - nbconvert!=5.4
  - nbsphinx
  - sphinx-autodoc-typehints
  - pip:
      - Deprecated
      - OpenNMT-py==1.2


================================================
FILE: conda_env/devtools/rtd_env.yml
================================================
channels:
  - pytorch
  - conda-forge
dependencies:
  - python=3.8
  - rdkit=2020.09
  - pytorch >=1.7.0,<2.0.0
  - cpuonly
  - pandas>=1.1.3
  - scikit-learn>=0.23.0
  - scipy>=1.5.2
  - pymatgen>=2020.10.9
  - sphinx-autodoc-typehints
  - tqdm
  - numpy
  - seaborn
  - mordred
  - ruamel.yaml
  - nbsphinx
  - joblib
  - requests
  - pip
  - pip:
      - Deprecated
      # - --requirement rtd_requirements.txt


================================================
FILE: conda_env/osx.yml
================================================
channels:
  - pytorch
  - conda-forge
dependencies:
  # Number
  - numpy
  - scipy
  - pandas

  # Mol/Crystall
  - pymatgen
  - ase
  - rdkit
  - matminer
    # - mordred
  - matid

  # Plotting
  - seaborn
  - matplotlib
  - plotly

  # Machine larning
  - scikit-learn
  - imbalanced-learn
  - optuna
  - umap-learn
  - pytorch::pytorch >=2.0.0,<3.0.0
  - torchvision
  - torchaudio
  - transformers
  - diffusers

  # Others
  - nodejs
  - jupyterlab
  - jupyterlab-lsp
  - ipywidgets
  - python-lsp-server
  - shapely
  - requests
  - ruamel.yaml
  - joblib
  - tqdm
  - Deprecated
  - fsspec
  - emmet-core
  - peewee
  - pip
  - pip:
    - xenonpy


================================================
FILE: docker/cpu/Dockerfile
================================================
FROM yoshidalab/base:cpu

# install xenonpy locally
WORKDIR /opt/xenonpy
COPY . .
RUN sudo chown -R user:user /opt && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf && \
    pip install --user -v .

EXPOSE 8888

WORKDIR /workspace
CMD [ "jupyter" , "lab", "--ip=0.0.0.0", "--no-browser", "--port=8888", "--allow-root"]

================================================
FILE: docker/cuda10/Dockerfile
================================================
FROM yoshidalab/base:cuda10

# install xenonpy locally
WORKDIR /opt/xenonpy
COPY . .
RUN sudo chown -R user:user /opt && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf && \
    pip install --user -v .

EXPOSE 8888

WORKDIR /workspace
CMD [ "jupyter" , "lab", "--ip=0.0.0.0", "--no-browser", "--port=8888", "--allow-root"]

================================================
FILE: docker/cuda11/Dockerfile
================================================
FROM yoshidalab/base:cuda11

# install xenonpy locally
WORKDIR /opt/xenonpy
COPY . .
RUN sudo chown -R user:user /opt && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf && \
    pip install --user -v .

EXPOSE 8888

WORKDIR /workspace
CMD [ "jupyter" , "lab", "--ip=0.0.0.0", "--no-browser", "--port=8888", "--allow-root"]

================================================
FILE: docker/cuda9/Dockerfile
================================================
FROM yoshidalab/base:cuda9

# install xenonpy locally
WORKDIR /opt/xenonpy
COPY . .
RUN sudo chown -R user:user /opt && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf && \
    pip install --user -v .

EXPOSE 8888

WORKDIR /workspace
CMD [ "jupyter" , "lab", "--ip=0.0.0.0", "--no-browser", "--port=8888", "--allow-root"]

================================================
FILE: docs/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
SPHINXPROJ    = XenonPy
SOURCEDIR     = source
BUILDDIR      = build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

================================================
FILE: docs/make.bat
================================================
@ECHO OFF

pushd %~dp0

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
	set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
set SPHINXPROJ=XenonPy

if "%1" == "" goto help

%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
	echo.
	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
	echo.installed, then set the SPHINXBUILD environment variable to point
	echo.to the full path of the 'sphinx-build' executable. Alternatively you
	echo.may add the Sphinx directory to PATH.
	echo.
	echo.If you don't have Sphinx installed, grab it from
	echo.http://sphinx-doc.org/
	exit /b 1
)

%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end

:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%

:end
popd


================================================
FILE: docs/source/_static/css/container.css
================================================
#container {
    /* min-height: 100vh; */
    display: flex;
}
.left {
    width: 30vw;
    /* flex: 1; */
    padding: .5rem;
    overflow: auto;
}
.right {
    width: 70vw;
    /* flex: 1; */
    padding: 0.5rem;
    overflow: auto;
}

================================================
FILE: docs/source/_static/placehoder
================================================


================================================
FILE: docs/source/_templates/layout.html
================================================
{% extends "!layout.html" %}
{% set css_files = css_files + [ "_static/css/hatnotes.css" ] %}

================================================
FILE: docs/source/_templates/placehoder
================================================


================================================
FILE: docs/source/api.rst
================================================
------------------
Indices and tables
------------------
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`


================================================
FILE: docs/source/books.rst
================================================
========================================================================
Exercises in "Materials Informatics" (KYORITSU SHUPPAN, in Japanese)
========================================================================

.. raw:: html

    <div class="admonition note">
    <p class="admonition-title">Note</p>
    <p class="admonition-body">
        <div id="container">
            <div class="left">
                <a href="https://www.kyoritsu-pub.co.jp/book/b10013510.html">
                    <img src="https://hondana-image.s3.amazonaws.com/book/image/10013510/normal_efd4a971-dec1-47ca-8d29-d448f099d7f6.jpg" alt="マテリアルズインフォマティクス">
                </a>
            </div>
            <div class="right">
                <p>共立出版発行の書籍「<a class="reference external" href="https://www.kyoritsu-pub.co.jp/book/b10013510.html">マテリアルズインフォマティクス</a>」をご購入いただいた皆様へ:</p>
                <p>演習問題のリンクが <a class="reference external" href="https://github.com/yoshida-lab/XenonPy/tree/master/mi_book">https://github.com/yoshida-lab/XenonPy/tree/master/mi_book</a> に変更になりました。
                新しいリンクから練習問題にアクセスしてください。</p>
                <p>ご不便をおかけして申し訳ありません。</p>
            </div>
        </div>
    </div>


マテリアルズインフォマティクス: https://www.kyoritsu-pub.co.jp/book/b10013510.html

    * 著者: 伊藤 聡 編・ 吉田 亮 著・ 劉 暢 著・ Stephen Wu 著・ 野口 瑶 著・ 山田 寛尚 著・ 赤木 和人 著・ 大林 一平 著・ 山下 智樹 著 
    * 出版社: 共立出版
    * 発売日: 2022/08/22
    * ISBN: 9784320072022


.. _マテリアルズインフォマティクス: https://www.kyoritsu-pub.co.jp/book/b10013510.html
.. _KYORITSU SHUPPAN: https://www.kyoritsu-pub.co.jp/

================================================
FILE: docs/source/changes.rst
================================================
.. role:: raw-html(raw)
    :format: html

=======
Changes
=======

v0.6.2 ~ v0.6.3
===============
**Bug fix**

* some minor fixes.

v0.6.1
======

**Breaking change**

* ``GaussianNLLLoss`` has been removed from ``xenonpy.model.training.loss``. ( `#249`_ )

.. _#249: https://github.com/yoshida-lab/XenonPy/pull/249

v0.6.0
======

**Bug fix**

* Fix a bug in the ``Scaler`` class. ( `#243`_ )

**New features**

* Add ``average`` option to the ``classification_metrics`` function. Now users can decide how to calculate scores for multilabel tasks. ( `#240`_ )
* Add ``only_best_states`` option to the ``Persist`` class. If ``True``, ``Persist`` will only save the best state to reduce the storage space. ( `#233`_ )
* Add ``warming_up`` option to the ``Validator`` class. ( `#238`_ )

.. _#243: https://github.com/yoshida-lab/XenonPy/pull/243
.. _#240: https://github.com/yoshida-lab/XenonPy/pull/240
.. _#233: https://github.com/yoshida-lab/XenonPy/pull/233
.. _#238: https://github.com/yoshida-lab/XenonPy/pull/238

v0.5.2
======

**Bug fix**

* some minor fixes.

v0.5.1
======

**Bug fix**

* update the pip install dependencies in ``requirements.txt``. ( `#226`_ )

**Enhance**

* Add ``rdkit v2020.09`` support for fingerprint descriptors. ( `#228`_ )
* Add return probability support for ``model.extension.TensorConverter``. ( `#229`_ )

.. _#226: https://github.com/yoshida-lab/XenonPy/pull/226
.. _#228: https://github.com/yoshida-lab/XenonPy/pull/228
.. _#229: https://github.com/yoshida-lab/XenonPy/pull/229

v0.5.0
======

**Breaking change**

* Replace ``xenonpy.datatools.BoxCox`` with ``xenonpy.datatools.PowerTransformer``. ( `#222`_ )

**New features**

* Add ``xenonpy.datatools.PowerTransformer`` to provide *yeo-johnson* and *box-cox* transformation through the ``sklearn.preprocessing.PowerTransformer``. ( `#222`_ )
* Add new contribution ``ISMD`` by `Qi`_, a new class of ``BaseProposal`` that allows generation of molecules based on virtual reaction of reactants in a predefined reactant pool. ( `#208`_ )
* Add classifier training support for the ``xenonpy.model.Trainer``. ( `#184`_ )
* Add ``IQSPR4DF`` to support ``pandas.DataFrame`` input to iQSPR.
* Add ``LayeredFP``, ``PatternFP``, and ``MHFP`` (new rdkit fingerprints).

**Enhance**

* ``BaseFeaturizer.transform`` now supports ``pandas.DataFrame`` as input where relevant columns for descriptor calculation can be specified through ``target_col``.
* ``BaseDescriptor.transform`` and ``BaseLogLikelihoodSet.log_likelihood`` now automatically check if any group names occur in the input ``pandas.DataFrame`` column names. If not, the entire ``pandas.DataFrame`` will be passed to the corresponding ``BaseFeaturizer`` and ``BaseLogLikelihood``, respectively.
* Allow using custom elemental information matrix in ``xenonpy.descriptor.Compositions`` descriptor. ( `#221`_ )
* Use ``joblib.parallel`` as default parallel backend. ( `#191`_, `#220`_ )
* ``Splliter.split`` method now support python list as input. ( `#194`_ )
* Allow user specific index for ``DescriptorHeatmap``. ( `#44`_ )
* Allow control of number of layers to be extracted in ``FrozenFeaturizer``. ( `#174`_ )
* ``bit_per_entry`` option is added to ``RDKitFP`` and ``AtomPairFP`` to allow control of number of bits to represent one fingerprint entry.
* ``counting`` option is added to ``RDKitFP``, ``AtomPairFP``, ``TopologicalTorsionFP``, ``FCFP`` and ``ECFP`` to support returning counts of each fingerprint entry.
* Column names of ``DescriptorFeature`` is updated to be consistent with the rdkit naming.


**Infrastructure improve**

* Move CI to github action. ( `#195`_ )
* Move to readthedocs version 2. ( `#206`_ )

.. _Qi: https://github.com/qi-zh
.. _#222: https://github.com/yoshida-lab/XenonPy/pull/222
.. _#208: https://github.com/yoshida-lab/XenonPy/pull/208
.. _#221: https://github.com/yoshida-lab/XenonPy/pull/221
.. _#184: https://github.com/yoshida-lab/XenonPy/pull/184
.. _#195: https://github.com/yoshida-lab/XenonPy/pull/195
.. _#206: https://github.com/yoshida-lab/XenonPy/pull/206
.. _#191: https://github.com/yoshida-lab/XenonPy/pull/191
.. _#220: https://github.com/yoshida-lab/XenonPy/pull/220
.. _#194: https://github.com/yoshida-lab/XenonPy/pull/194
.. _#44: https://github.com/yoshida-lab/XenonPy/pull/44
.. _#174: https://github.com/yoshida-lab/XenonPy/pull/174


v0.4.2
======

**Bug fix**

* fix ``set_param`` method dose not set the children in ``BaseDescriptor`` and ``NGram``. ( `#163`_, `#159`_ )

**Enhance**

* Setting ``optimizer``, ``loss_func``, and etc. can be done in ``Trainer.load``. ( `#158`_ )
* Improve docs.  ( `#155`_ )

.. _#163: https://github.com/yoshida-lab/XenonPy/issues/163
.. _#159: https://github.com/yoshida-lab/XenonPy/issues/159
.. _#158: https://github.com/yoshida-lab/XenonPy/issues/159
.. _#155: https://github.com/yoshida-lab/XenonPy/issues/159


v0.4.0
======

**Breaking change**

* Remove ``xenonpy.datatools.MDL``.
* Remove ``xenonpy.model.nn`` modules. Part of them will be kept until v1.0.0 for compatible.

**New features**

* Add ``xenonpy.mdl`` modules for XenonPy.MDL access.
* Add ``xenonpy.model.training`` modules for model training.


v0.3.6
======

**Breaking change**

* Renamed ``BayesianRidgeEstimator`` to ``GaussianLogLikelihood``.
* Removed the ``estimators`` property from ``BayesianRidgeEstimator``.
* Added ``predict`` method into ``GaussianLogLikelihood``.


v0.3.5
======

**Enhanced**

* Added version specifiers to the *requirements.txt* file.

v0.3.4
======

**Bug fix**

* Fixed a critical error in ``BayesianRidgeEstimator`` when calculating the loglikelihood. ( `#124`_ )

.. _#124: https://github.com/yoshida-lab/XenonPy/issues/124

v0.3.3
======

**Bug fix**

* fix *mp_ids.txt* not exist error when trying to build the sample data using ``preset.build``.

v0.3.2
======

**Enhanced**

* Updated sample codes.
* Added progress bar for ngram training. ( `#93`_ )
* Added error handling to NGram when generating new SMILES. ( `#97`_ )

**CI**

* Removed python 3.5 support. ( `#95`_ )
* Added Appveyor CI for windows tests. ( `#90`_ )

.. _#93: https://github.com/yoshida-lab/XenonPy/issues/93
.. _#97: https://github.com/yoshida-lab/XenonPy/issues/97
.. _#95: https://github.com/yoshida-lab/XenonPy/issues/95
.. _#90: https://github.com/yoshida-lab/XenonPy/issues/90


v0.3.1
======

**Enhanced**

* Added tutorials for main modules. ( `#79`_ )

.. _#79: https://github.com/yoshida-lab/XenonPy/issues/79


v0.3.0
======

**Breaking changes**:

* Removed Built-in data ``mp_inorganic``, ``mp_structure``, ``oqmd_inorganic`` and ``oqmd_structure``. ( `#12`_, `#20`_ )
* Renamed ``LocalStorage`` to ``Storage``.

**Enhanced**

* Added error handling for ``NGram`` training. ( `#75`_, `#86`_ )
* Added error handling for ``IQSPR``. ( `#69`_ )
* Added error handling for ``BaseDescriptor`` and ``BaseFeaturizer``. ( `#73`_ )
* Added featurizer selection function. ( `#47`_ )

**New Features**

* Added sample data building function for ``preset``. ( `#81`_, `#84`_ )


.. _#12: https://github.com/yoshida-lab/XenonPy/issues/12
.. _#20: https://github.com/yoshida-lab/XenonPy/issues/20
.. _#75: https://github.com/yoshida-lab/XenonPy/issues/75
.. _#73: https://github.com/yoshida-lab/XenonPy/issues/73
.. _#86: https://github.com/yoshida-lab/XenonPy/issues/86
.. _#69: https://github.com/yoshida-lab/XenonPy/issues/69
.. _#81: https://github.com/yoshida-lab/XenonPy/issues/81
.. _#84: https://github.com/yoshida-lab/XenonPy/issues/84
.. _#47: https://github.com/yoshida-lab/XenonPy/issues/47




v0.2.0
======

**Descriptor Generator**:

* Added ``xenonpy.descriptor.Fingerprint`` descriptor generator. ( `#21`_ )
* Added ``xenonpy.descriptor.OrbitalFieldMatrix`` descriptor generator. ( `#22`_ )


**API Changes**:

* Allowed ``BaseDescriptor`` class to use anonymous/renamed input. ( `#10`_ )

.. _#10: https://github.com/yoshida-lab/XenonPy/issues/10
.. _#21: https://github.com/yoshida-lab/XenonPy/issues/21
.. _#22: https://github.com/yoshida-lab/XenonPy/issues/22


================================================
FILE: docs/source/conf.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#  Copyright (c) 2021. yoshida-lab. All rights reserved.
#  Use of this source code is governed by a BSD-style
#  license that can be found in the LICENSE file.

#
# XenonPy documentation build configuration file, created by
# sphinx-quickstart on Mon Jan 15 16:41:55 2018.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys

sys.path.insert(0, os.path.abspath('../../'))

import xenonpy as package

language = 'en'
# -- General configuration ------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
    'nbsphinx', 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.napoleon', 'sphinx_autodoc_typehints',
    'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode',
    'sphinx.ext.githubpages', 'sphinx.ext.autosectionlabel'
]

exclude_patterns = ['_build', '**.ipynb_checkpoints']
nbsphinx_execute = 'never'

# config autosectionlabel
autosectionlabel_prefix_document = True

# config autodoc
autoclass_content = 'both'
autodoc_member_order = 'groupwise'

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = package.__name__
copyright = '2022, yoshida-lab'
author = 'TsumiNa'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = package.__version__
# The full version, including alpha/beta/rc tags.
release = package.__release__

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# If true, todo and todoList produce output, else they produce nothing.
todo_include_todos = True

# -- Options for HTML output ----------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#
# html_theme = 'alabaster'
html_theme = "sphinx_rtd_theme"

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {
    'logo_only': True,
}

# favicon
html_favicon = 'favicon.ico'

# read the docs banner
html_logo = '_static/logo_readthedocs.png'

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']

# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# This is required for the alabaster theme
# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars
html_sidebars = {
    '**': [
        'relations.html',  # needs 'show_related': True theme option to display
        'searchbox.html',
    ]
}

# -- Options for HTMLHelp output ------------------------------------------

# Output file base name for HTML help builder.
htmlhelp_basename = 'XenonPydoc'

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
    # The paper size ('letterpaper' or 'a4paper').
    #
    # 'papersize': 'letterpaper',

    # The font size ('10pt', '11pt' or '12pt').
    #
    # 'pointsize': '10pt',

    # Additional stuff for the LaTeX preamble.
    #
    # 'preamble': '',

    # Latex figure (float) alignment
    #
    # 'figure_align': 'htbp',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
#  author, documentclass [howto, manual, or own class]).
latex_documents = [
    (master_doc, 'XenonPy.tex', 'XenonPy Documentation', 'TsumiNa', 'manual'),
]

# -- Options for manual page output ---------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, 'XenonPy', 'XenonPy Documentation', [author], 1)]

# -- Options for Texinfo output -------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
    (master_doc, 'XenonPy', 'XenonPy Documentation', author, 'XenonPy', 'One line description of project.',
     'Miscellaneous'),
]

# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
    'https://docs.python.org/3': None,
    'pandas': ('https://pandas.pydata.org/pandas-docs/stable', None),
    'numpy': ('https://numpy.org/doc/stable', None),
    'scipy': ('https://docs.scipy.org/doc/scipy/reference', None),
    'matplotlib': ('https://matplotlib.org', None),
    'torch': ('https://pytorch.org/docs/stable/', None)
}

nbsphinx_execute = 'never'


def skip(app, what, name, obj, skip, options):
    if name == "__call__":
        return False
    return skip


def setup(app):
    app.add_css_file("css/container.css")
    app.connect("autodoc-skip-member", skip)


================================================
FILE: docs/source/contact.rst
================================================
========
Contact
========

* For issues_
* For Gitter_

.. _issues: https://github.com/yoshida-lab/XenonPy/issues
.. _Gitter: https://gitter.im/yoshida-lab/XenonPy


================================================
FILE: docs/source/contribution.rst
================================================
=======================
Contribution guidelines
=======================

1. Fork it ( https://github.com/yoshida-lab/XenonPy/fork )
2. Extend your python environment to support XenonPy development (See: :ref:`installation:installing in development mode`)
3. Create your feature branch (git checkout -b my-new-feature)
4. Commit your changes (git commit -am 'Add some feature')
5. Push to the branch (git push origin my-new-feature)
6. Create a new Pull Request

When contribute your codes, please do the following

* Discuss with others
* Use `Numpy style`_ for Docstring.
* Check codes with Pylint_ based on `.pylintrc`_.
* Format codes with YAPF_ based on `.style.yapf`_.
* Write tests if possible


.. _Numpy style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
.. _Pylint: https://pylint.readthedocs.io/
.. _YAPF: https://github.com/google/yapf
.. _.pylintrc: https://github.com/yoshida-lab/XenonPy/blob/master/.pylintrc
.. _.style.yapf: https://github.com/yoshida-lab/XenonPy/blob/master/.style.yapf

================================================
FILE: docs/source/copyright.rst
================================================
=========
Copyright
=========

Copyright © 2021 The XenonPy task force, all rights reserved.
Released under the `BSD-3 license`_.

.. _BSD-3 license: https://opensource.org/licenses/BSD-3-Clause



================================================
FILE: docs/source/features.rst
================================================
.. role:: raw-html(raw)
    :format: html

========
Features
========


-----------
Data access
-----------
.. _data-access:

**Dataset** is an abstraction of the local file system.
Users can add their local dirs into this system then load data that under these dirs in a convenient way.

XenonPy also uses this system to provide some built-in data.
Currently, two sets of element-level property data are available out-of-the-box (``elements`` and ``elements_completed`` (imputed version of ``elements``)).
These data were collected from `mendeleev`_, `pymatgen`_, `CRC Hand Book`_ and `Magpie`_.

.. _CRC Hand Book: http://hbcponline.com/faces/contents/ContentsSearch.xhtml
.. _Magpie: https://bitbucket.org/wolverton/magpie
.. _mendeleev: https://mendeleev.readthedocs.io
.. _pymatgen: http://pymatgen.org/

``elements`` contains 74 element-level properties of 118 elements. Their missing values
were statistically imputed by performing the multiple imputation method [1]_ and stored as ``elements_completed``.
Because of the statistical unreliability of the imputation for a subset of properties and heavier atoms that contains many missing values in elements,
the ``elements_completed`` data set provides only 58 properties of 94 elements (from **H** to **Pu**). The following table shows the currently available elemental information.

.. table:: Element-level properties

    =================================   ===================================================================================
        feature                             description
    ---------------------------------   -----------------------------------------------------------------------------------
    ``period``                          Period in the periodic table
    ``atomic_number``                   Number of protons found in the nucleus of an atom
    ``mendeleev_number``                Atom number in mendeleev's periodic table
    ``atomic_radius``                   Atomic radius
    ``atomic_radius_rahm``              Atomic radius by Rahm et al
    ``atomic_volume``                   Atomic volume
    ``atomic_weight``                   The mass of an atom
    ``icsd_volume``                     Atom volume in ICSD database
    ``lattice_constant``                Physical dimension of unit cells in a crystal lattice
    ``vdw_radius``                      Van der Waals radius
    ``vdw_radius_alvarez``              Van der Waals radius according to Alvarez
    ``vdw_radius_batsanov``             Van der Waals radius according to Batsanov
    ``vdw_radius_bondi``                Van der Waals radius according to Bondi
    ``vdw_radius_dreiding``             Van der Waals radius from the DREIDING FF
    ``vdw_radius_mm3``                  Van der Waals radius from the MM3 FF
    ``vdw_radius_rt``                   Van der Waals radius according to Rowland and Taylor
    ``vdw_radius_truhlar``              Van der Waals radius according to Truhlar
    ``vdw_radius_uff``                  Van der Waals radius from the UFF
    ``covalent_radius_bragg``           Covalent radius by Bragg
    ``covalent_radius_cordero``         Covalent radius by Cerdero et al
    ``covalent_radius_pyykko``          Single bond covalent radius by Pyykko et al
    ``covalent_radius_pyykko_double``   Double bond covalent radius by Pyykko et al
    ``covalent_radius_pyykko_triple``   Triple bond covalent radius by Pyykko et al
    ``covalent_radius_slater``          Covalent radius by Slater
    ``c6``                              C_6 dispersion coefficient in a.u
    ``c6_gb``                           C_6 dispersion coefficient in a.u
    ``density``                         Density at 295K
    ``proton_affinity``                 Proton affinity
    ``dipole_polarizability``           Dipole polarizability
    ``electron_affinity``               Electron affinity
    ``electron_negativity``             Tendency of an atom to attract a shared pair of electrons
    ``en_allen``                        Allen's scale of electronegativity
    ``en_ghosh``                        Ghosh's scale of electronegativity
    ``en_pauling``                      Pauling's scale of electronegativity
    ``gs_bandgap``                      DFT bandgap energy of T=0K ground state
    ``gs_energy``                       DFT energy per atom (raw VASP value) of T=0K ground state
    ``gs_est_bcc_latcnt``               Estimated BCC lattice parameter based on the DFT volume
    ``gs_est_fcc_latcnt``               Estimated FCC lattice parameter based on the DFT volume
    ``gs_mag_moment``                   DFT magnetic momenet of T=0K ground state
    ``gs_volume_per``                   DFT volume per atom of T=0K ground state
    ``hhi_p``                           Herfindahl−Hirschman Index (HHI) production values
    ``hhi_r``                           Herfindahl−Hirschman Index (HHI) reserves values
    ``specific_heat``                   Specific heat at 20oC
    ``gas_basicity``                    Gas basicity
    ``first_ion_en``                    First ionisation energy
    ``fusion_enthalpy``                 Fusion heat
    ``heat_of_formation``               Heat of formation
    ``heat_capacity_mass``              Mass specific heat capacity
    ``heat_capacity_molar``             Molar specific heat capacity
    ``evaporation_heat``                Evaporation heat
    ``linear_expansion_coefficient``    Coefficient of linear expansion
    ``boiling_point``                   Boiling temperature
    ``brinell_hardness``                Brinell Hardness Number
    ``bulk_modulus``                    Bulk modulus
    ``melting_point``                   Melting point
    ``metallic_radius``                 Single-bond metallic radius
    ``metallic_radius_c12``             Metallic radius with 12 nearest neighbors
    ``thermal_conductivity``            Thermal conductivity at 25 C
    ``sound_velocity``                  Speed of sound
    ``vickers_hardness``                Value of Vickers hardness test
    ``Polarizability``                  Ability to form instantaneous dipoles
    ``youngs_modulus``                  Young's modulus
    ``poissons_ratio``                  Poisson's ratio
    ``molar_volume``                    Molar volume
    ``num_unfilled``                    Total unfilled electron
    ``num_valance``                     Total valance electron
    ``num_d_unfilled``                  Unfilled electron in d shell
    ``num_d_valence``                   Valance electron in d shell
    ``num_f_unfilled``                  Unfilled electron in f shell
    ``num_f_valence``                   Valance electron in f shell
    ``num_p_unfilled``                  Unfilled electron in p shell
    ``num_p_valence``                   Valance electron in p shell
    ``num_s_unfilled``                  Unfilled electron in s shell
    ``num_s_valence``                   Valance electron in s shell
    =================================   ===================================================================================

For more details on this system, see :doc:`tutorials/1-dataset`.

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/dataset_and_preset.ipynb to get a runnable script.


----------------------
Descriptor calculation
----------------------

Compositional descriptors
-------------------------

XenonPy can calculate 290 compositional features for a given chemical composition.
This calculation uses the information of the 58 element-level property data recorded in ``elements_completed``.
For example, let us consider a binary compound, :math:`A_{w_A}B_{w_B}`, whose element-level features are denoted by :math:`f_{A,i}` and :math:`f_{B,i} (i = 1, …, 58)`. Then, the 290 compositional descriptors are calculated: for :math:`i = 1, …, 58`,

* Weighted average (abbr: ave): :math:`f_{ave, i} = w_{A}^* f_{A,i} + w_{B}^* f_{B,i}`,
* Weighted variance (abbr: var): :math:`f_{var, i} = w_{A}^* (f_{A,i} - f_{ave, i})^2  + w_{B}^* (f_{B,i} - f_{ave, i})^2`,
* Geometric mean (abbr: gmean): :math:`f_{gmean, i} = \sqrt[w_A + w_B]{f_{A,i}^{w_A} * f_{V,i}^{w_B}}`,
* Harmonic mean (abbr: hmean): :math:`f_{hmean, i} = \frac{w_A +w_B}{\frac{1}{f_{A,i}}*w_A + \frac{1}{f_{B,i}}*w_B}`,
* Max-pooling (abbr: max): :math:`f_{max, i} = max{f_{A,i}, f_{B,i}}`,
* Min-pooling (abbr: min): :math:`f_{min, i} = min{f_{A,i}, f_{B,i}}`,
* Weighted sum (abbr: sum): :math:`f_{sum, i} = w_{A} f_{A,i} + w_{B} f_{B,i}`,

where :math:`w_{A}^*` and :math:`w_{B}^*` denote the normalized composition summing up to one.

By using compositional descriptors, we have succeeded in predicting the composition of quasicrystals [2]_.

Structural descriptors
----------------------
Currently, XenonPy implements RDF (radial distribution function) and OFM (orbital field matrix [3]_) descriptors of crystalline structures.
We also provide a compatible API to use the structural descriptors of `matminer <https://hackingmaterials.github.io/matminer/>`_.
You may check the summary table of featurizers in matminer `here <https://hackingmaterials.github.io/matminer/featurizer_summary.html>`_.



RDKit descriptors
-----------------
XenonPy also supports molecular descriptors available in the `RDKit`_ python package, including 10 sets of fingerprints, each contains corresponding options.

.. _RDKit: https://www.rdkit.org/


The tutorial at :doc:`tutorials/2-descriptor` demonstrates how to calculate descriptors using ``XenonPy.descriptor`` classes.

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/calculate_descriptors.ipynb to get a runnable script.


--------------------------------------------------
Visualization of descriptor-property relationships
--------------------------------------------------

Descriptors on a set of given materials could be displayed on a heatmap plot in order to facilitate the understanding of
overall patterns in relation to their properties. The following figure shows an example:

.. figure:: _static/heatmap.jpg

     Heatmap of 290 compositional descriptors of 69,640 compounds in Materials Project (upper: volume Å\ :sup:`3`\ , lower:  density g/cm\ :sup:`3`\  ).

In the heatmap of the descriptor matrix, the 69,640 materials are arranged from the top to bottom by the increasing order
of formation energies. Plotting the descriptor-property relationships in this way, we could visually recognize which
descriptors are relevant or irrelevant to the prediction of formation energies. Relevant descriptors, which are linearly
or nonlinearly dependent to formation energies, might exhibit certain patterns from top to bottom in the heatmap. For example,
a monotonically decrease or increase pattern would appear in a linearly dependent descriptor. On the other hand,
irrelevant descriptors might exhibit no specific patterns.

See the tutorial for visualization of descriptor-property relationships at :doc:`tutorials/3-visualization`.

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/visualization.ipynb to get a runnable script.


-----------
XenonPy.MDL
-----------

**WARNING: This subsection's information is out-dated and the details are no long true. Currently XenonPy.MDL is undergoing indefinite maintenance. Please refer to the github README page for the latest update.**

XenonPy.MDL is a library of pre-trained models that were obtained by feeding diverse materials data on structure-property relationships into neural networks and some other supervised learning algorithms.
The current release (version 0.1.0.beta) contains more than 140,000 models (include private models) on physical, chemical, electronic, thermodynamic, or mechanical properties of small organic molecules (15 properties), polymers/polymer composites (18), and inorganic compounds (12).
Pre-trained neural networks are distributed as either the R (MXNet) or Python (PyTorch) model objects.
Detailed information about XenonPy.MDL, such as a list of models, properties, source data used for training, and so on, are prepared in this paper [3]_.

The following lists contain the information of current available pre-trained models and properties.

.. table:: Information on model sets

    +----------+-----------------------------------+-------------------------------------------------------------------+
    |  id      |  name                             |  description                                                      |
    +==========+===================================+===================================================================+
    |          | | Stable inorganic compounds      | | Models in this set are trained on ~20,000 stable inorganic      |
    |  ``1``   | | in materials project (MP)       | | compounds selected from the materials project.                  |
    |          |                                   |                                                                   |
    +----------+-----------------------------------+-------------------------------------------------------------------+
    |          | | All inorganic compounds         | | Models in this set are trained on ~70,000 inorganic compounds   |
    |  ``2``   | | in materials project (MP)       | | selected from the materials project.                            |
    |          |                                   |                                                                   |
    +----------+-----------------------------------+-------------------------------------------------------------------+
    |          | | QM9 Dataset from                | | Quantum-Machine project can be access                           |
    |  ``3``   | | Quantum-Machine website         | | from http://quantum-machine.org/.                               |
    |          |                                   |                                                                   |
    +----------+-----------------------------------+-------------------------------------------------------------------+
    |          |   PHYSPROP Dataset                | | PHYSPROP database contains chemical structures,                 |
    |  ``4``   |                                   | | names and physical properties for over 41,000 chemicals.        |
    |          |                                   |                                                                   |
    +----------+-----------------------------------+-------------------------------------------------------------------+
    |          | | Jean-Claude Bradley Open        | | Jean-Claude Bradley's dataset of Open Melting Points.           |
    |  ``5``   | | Melting Point Dataset           |                                                                   |
    |          |                                   |                                                                   |
    +----------+-----------------------------------+-------------------------------------------------------------------+
    |          | | Polymer Genome Dataset (PG)     | | Polymer Genome is an informatics platform for polymer property  |
    |  ``6``   |                                   | | prediction and design using machine learning.                   |
    |          |                                   | | It can be accessed via https://www.polymergenome.org/.          |
    +----------+-----------------------------------+-------------------------------------------------------------------+


.. table:: Information of properties

    ================================ =================== ================================================
                                name             system                                    querying name
    -------------------------------- ------------------- ------------------------------------------------
                 Melting Temperature     Organic Polymer              organic.polymer.melting_temperature
                   Ionization Energy     Organic Polymer                organic.polymer.ionization_energy
           Ionic Dielectric Constant     Organic Polymer        organic.polymer.ionic_dielectric_constant
     Hildebrand Solubility Parameter     Organic Polymer  organic.polymer.hildebrand_solubility_parameter
        Glass Transition Temperature     Organic Polymer     organic.polymer.glass_transition_temperature
                        Molar Volume     Organic Polymer                     organic.polymer.molar_volume
                   Electron Affinity     Organic Polymer                organic.polymer.electron_affinity
                 Dielectric Constant     Organic Polymer              organic.polymer.dielectric_constant
                             Density     Organic Polymer                          organic.polymer.density
                     Cohesive Energy     Organic Polymer                  organic.polymer.cohesive_energy
                             Bandgap     Organic Polymer                          organic.polymer.bandgap
                  Atomization Energy     Organic Polymer               organic.polymer.atomization_energy
                    Refractive Index     Organic Polymer                 organic.polymer.refractive_index
                 Molar Heat Capacity     Organic Polymer              organic.polymer.molar_heat_capacity
      Electronic Dielectric Constant     Organic Polymer   organic.polymer.electronic_dielectric_constant
                          U0 Hartree  Organic Nonpolymer                    organic.nonpolymer.u0_hartree
                            R2 Bohr2  Organic Nonpolymer                      organic.nonpolymer.r2_bohr2
                            Mu Debye  Organic Nonpolymer                      organic.nonpolymer.mu_debye
                        Lumo Hartree  Organic Nonpolymer                  organic.nonpolymer.lumo_hartree
                        Homo Hartree  Organic Nonpolymer                  organic.nonpolymer.homo_hartree
                         Gap Hartree  Organic Nonpolymer                   organic.nonpolymer.gap_hartree
                         Alpha Bohr3  Organic Nonpolymer                   organic.nonpolymer.alpha_bohr3
                           U Hartree  Organic Nonpolymer                     organic.nonpolymer.u_hartree
                        Zpve Hartree  Organic Nonpolymer                  organic.nonpolymer.zpve_hartree
                                  Bp  Organic Nonpolymer                            organic.nonpolymer.bp
                      Cv Calmol-1K-1  Organic Nonpolymer                organic.nonpolymer.cv_calmol-1k-1
                                  Tm  Organic Nonpolymer                            organic.nonpolymer.tm
                           G Hartree  Organic Nonpolymer                     organic.nonpolymer.g_hartree
                           H Hartree  Organic Nonpolymer                     organic.nonpolymer.h_hartree
                             Density   Inorganic Crystal                        inorganic.crystal.density
                              Volume   Inorganic Crystal                         inorganic.crystal.volume
                    Refractive Index   Inorganic Crystal               inorganic.crystal.refractive_index
                            Band Gap   Inorganic Crystal                       inorganic.crystal.band_gap
           Dielectric Const Electron   Inorganic Crystal          inorganic.crystal.dielectric_const_elec
                        Fermi Energy   Inorganic Crystal                         inorganic.crystal.efermi
                 Total Magnetization   Inorganic Crystal            inorganic.crystal.total_magnetization
              Dielectric Const Total   Inorganic Crystal         inorganic.crystal.dielectric_const_total
               Final Energy Per Atom   Inorganic Crystal          inorganic.crystal.final_energy_per_atom
           Formation Energy Per Atom   Inorganic Crystal      inorganic.crystal.formation_energy_per_atom
    ================================ =================== ================================================

XenonPy.MDL provides a rich set of APIs to give users the abilities to interact with the pre-trained model database.
Through the APIs, users can search for a specific subset of models by keywords and download them via HTTP.
The tutorial at :doc:`tutorials/5-pre-trained_model_library` illustrates how to interact with the database in XenonPy (via the API querying).

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/pre-trained_model_library.ipynb to get a runnable script.


-----------------
Transfer learning
-----------------

Transfer learning has become one of the basic techniques in machine learning that covers a broad range of algorithms for
which a model trained for one task is re-purposed to another related task [4]_ [5]_.
In general, the need of transfer learning occurs when there is a limited supply of training data for a specific task, 
yet data supply for related task is sufficient. This situation occurs in many materials science applications as described in [6]_ [7]_.

XenonPy offers a simple-to-use toolchain to seamlessly perform transfer learning with the given pre-trained models.
Given a target property, by using the transfer learning module of XenonPy, a source model can be treated as a generator of machine learning acquired descriptors, so-called the neural descriptors, as demonstrated in [3]_.

See tutorial at :doc:`tutorials/6-transfer_learning` to learn how to perform frozen feature transfer learning in XenonPy.

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/transfer_learning.ipynb to get a runnable script.

--------------
Inverse design
--------------

Inverse molecular design is an important research subject in materials science that aims to create new chemical structures with desired properties computationally.
XenonPy offers a Bayesian molecular design algorithm based on [8]_ that includes a SMILES generator based on N-gram model, likelihood calculator, and a sequential Monte Carlo algorithm for sampling the posterior distribution of molecules with properties specified by the likelihood function. Details of this algorithm, which is called iQSPR, can be found in [9]_. An example of using iQSPR to search for high thermal conductivity polymer can be found in [10]_. 

See tutorial at :doc:`tutorials/7-inverse-design` to learn how to perform inverse molecular design using iQSPR in XenonPy.

Access https://github.com/yoshida-lab/XenonPy/blob/master/samples/iQSPR.ipynb to get a runnable script.

**Reference**

.. [1] D. B. Rubin, Ed., Multiple Imputation for Nonresponse in Surveys. Hoboken, NJ, USA: John Wiley & Sons, Inc., 1987. doi: 10.1002/9780470316696.
.. [2] C. Liu et al., “Machine Learning to Predict Quasicrystals from Chemical Compositions,” Adv. Mater., vol. 33, no. 36, p. 2102507, Sep. 2021, doi: 10.1002/adma.202102507.
.. [3] T. Lam Pham et al., “Machine learning reveals orbital interaction in materials,” Science and Technology of Advanced Materials, vol. 18, no. 1, pp. 756–765, Dec. 2017, doi: 10/gm4znv.
.. [4] K. Weiss, T. M. Khoshgoftaar, and D. Wang, “A survey of transfer learning,” J Big Data, vol. 3, no. 1, p. 9, Dec. 2016, doi: 10/gfkr2w.
.. [5] C. Tan, F. Sun, T. Kong, W. Zhang, C. Yang, and C. Liu, “A survey on deep transfer learning,” in Artificial neural networks and machine learning – ICANN 2018, Cham, 2018, pp. 270–279.
.. [6] H. Yamada et al., “Predicting Materials Properties with Little Data Using Shotgun Transfer Learning,” ACS Cent. Sci., vol. 5, no. 10, pp. 1717–1730, Oct. 2019, doi: 10.1021/acscentsci.9b00804.
.. [7] S. Ju et al., “Exploring diamondlike lattice thermal conductivity crystals via feature-based transfer learning,” Phys. Rev. Mater., vol. 5, no. 5, p. 053801, May 2021, doi: 10.1103/physrevmaterials.5.053801.
.. [8] H. Ikebata, K. Hongo, T. Isomura, R. Maezono, and R. Yoshida, “Bayesian molecular design with a chemical language model,” J Comput Aided Mol Des, vol. 31, no. 4, pp. 379–391, Apr. 2017, doi: 10/ggpx8b.
.. [9] S. Wu, G. Lambard, C. Liu, H. Yamada, and R. Yoshida, “iQSPR in XenonPy: A Bayesian Molecular Design Algorithm,” Mol. Inform., vol. 39, no. 1–2, p. 1900107, Jan. 2020, doi: 10.1002/minf.201900107.
.. [10] S. Wu et al., “Machine-learning-assisted discovery of polymers with high thermal conductivity using a molecular design algorithm,” npj Computational Materials, vol. 5, no. 1, pp. 66–66, Dec. 2019, doi: 10.1038/s41524-019-0203-2.



================================================
FILE: docs/source/index.rst
================================================
.. Copyright 2019 TsumiNa. All rights reserved.


.. role:: raw-html(raw)
    :format: html

========================
What is XenonPy project
========================

|MacOS| |Windows| |Ubuntu| |readthedocs| |codecov| |version| |python| |total-dl| |per-dl|

.. raw:: html

    <div class="admonition note">
    <p class="admonition-title">Note</p>
    <p class="admonition-body">
        <div id="container">
            <div class="left">
                <a href="https://www.kyoritsu-pub.co.jp/book/b10013510.html">
                    <img src="https://hondana-image.s3.amazonaws.com/book/image/10013510/normal_efd4a971-dec1-47ca-8d29-d448f099d7f6.jpg" alt="マテリアルズインフォマティクス">
                </a>
            </div>
            <div class="right">
                <p>To all those who have purchased the book <a class="reference external" href="https://www.kyoritsu-pub.co.jp/book/b10013510.html">Materials Informatics</a> published by <a class="reference external" href="https://www.kyoritsu-pub.co.jp/">KYORITSU SHUPPAN</a>:</p>
                <p>The link to the exercises has changed to <a class="reference external" href="https://github.com/yoshida-lab/XenonPy/tree/master/mi_book">https://github.com/yoshida-lab/XenonPy/tree/master/mi_book</a>.
                Please follow the new link to access all these exercises.</p>
                <p>We apologize for the inconvenience.</p>
            </div>
        </div>
    </div>

--------
Overview
--------
**XenonPy** is a Python library that implements a comprehensive set of machine learning tools
for materials informatics. Its functionalities partially depend on Python (PyTorch) and R (MXNet).
This package is still under development. The current released version provides some limited features:

* Interface to the public materials database
* Library of materials descriptors (compositional/structural descriptors)
* pre-trained model library **XenonPy.MDL** (v0.1.0.beta, 2019/8/9: more than 140,000 models (include private models) in 35 properties of small molecules, polymers, and inorganic compounds) [Currently under major maintenance, expected to be recovered in v0.7]
* Machine learning tools.
* Transfer learning using the pre-trained models in XenonPy.MDL


.. image:: _static/xenonpy.png


--------
Citation
--------
XenonPy is an on-going research project that covers multiple important topics in materials informatics.
We recommend users to cite the papers that are relevant to their specific use of XenonPy.
Please refer to :doc:`features` for details of each feature in XenonPy with its corresponding citation.
User can also check the publication list below to pick the relevant citations.


--------
Features
--------
XenonPy has a rich set of tools for various materials informatics applications.
The descriptor generator class can calculate several types of numeric descriptors from ``compositional``, ``structure``.
By using XenonPy's built-in visualization functions, the relationships between descriptors and target properties can be easily shown in a heatmap.
XenonPy also supports an interface to use the ``rdkit`` descriptors and provides the ``iQSPR`` algorithm for molecular design.

Transfer learning is an important tool for the efficient application of machine learning methods to materials informatics.
To facilitate the widespread use of transfer learning,
we have developed a comprehensive library of pre-trained models, called **XenonPy.MDL**.
This library provides a simple API that allows users to fetch the models via an HTTP request.
For the ease of using the pre-trained models, some useful functions are also provided.

See :doc:`features` for details.


------
Sample
------
Sample codes of different features in XenonPy are available here: https://github.com/yoshida-lab/XenonPy/tree/master/samples


.. _user-doc:
.. toctree::
    :maxdepth: 2
    :caption: User Documentation

    books
    copyright
    installation
    features
    tutorial
    api
    contribution
    changes
    contact


------------
Publications
------------

.. [1] H. Ikebata, K. Hongo, T. Isomura, R. Maezono, and R. Yoshida, “Bayesian molecular design with a chemical language model,” J Comput Aided Mol Des, vol. 31, no. 4, pp. 379–391, Apr. 2017, doi: 10/ggpx8b.
.. [2] S. Wu et al., “Machine-learning-assisted discovery of polymers with high thermal conductivity using a molecular design algorithm,” npj Computational Materials, vol. 5, no. 1, pp. 66–66, Dec. 2019, doi: 10.1038/s41524-019-0203-2.
.. [3] S. Wu, G. Lambard, C. Liu, H. Yamada, and R. Yoshida, “iQSPR in XenonPy: A Bayesian Molecular Design Algorithm,” Mol. Inform., vol. 39, no. 1–2, p. 1900107, Jan. 2020, doi: 10.1002/minf.201900107.
.. [4] H. Yamada et al., “Predicting Materials Properties with Little Data Using Shotgun Transfer Learning,” ACS Cent. Sci., vol. 5, no. 10, pp. 1717–1730, Oct. 2019, doi: 10.1021/acscentsci.9b00804.
.. [5] S. Ju et al., “Exploring diamondlike lattice thermal conductivity crystals via feature-based transfer learning,” Phys. Rev. Mater., vol. 5, no. 5, p. 053801, May 2021, doi: 10.1103/physrevmaterials.5.053801.
.. [6] C. Liu et al., “Machine Learning to Predict Quasicrystals from Chemical Compositions,” Adv. Mater., vol. 33, no. 36, p. 2102507, Sep. 2021, doi: 10.1002/adma.202102507.


------------
Contributing
------------

XenonPy is an `open source project <https://github.com/yoshida-lab/XenonPy>`_ inspired by `matminer <https://hackingmaterials.github.io/matminer>`_.
:raw-html:`<br/>`
This project is under continuous development. We would appreciate any feedback from the users.
:raw-html:`<br/>`
Code contributions are also very welcomed. See :doc:`contribution` for more details.


.. _pandas: https://pandas.pydata.org
.. _PyTorch: http://pytorch.org/
.. _Xenon: https://en.wikipedia.org/wiki/Xenon

.. |MacOS| image:: https://github.com/yoshida-lab/XenonPy/workflows/MacOS/badge.svg
    :alt: MacOS Building Status
    :target: https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AMacOS

.. |Windows| image:: https://github.com/yoshida-lab/XenonPy/workflows/Windows/badge.svg
    :alt: Windows Building Status
    :target: https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AWindows

.. |Ubuntu| image:: https://github.com/yoshida-lab/XenonPy/workflows/Ubuntu/badge.svg
    :alt: Ubuntu Building Status
    :target: https://github.com/yoshida-lab/XenonPy/actions?query=workflow%3AUbuntu

.. |readthedocs| image:: https://readthedocs.org/projects/xenonpy/badge/?version=latest
    :alt: Documentation Status
    :target: https://xenonpy.readthedocs.io/en/latest/?badge=latest

.. |codecov| image:: https://codecov.io/gh/yoshida-lab/XenonPy/branch/master/graph/badge.svg
  :target: https://codecov.io/gh/yoshida-lab/XenonPy

.. |version| image:: https://img.shields.io/github/tag/yoshida-lab/XenonPy.svg?maxAge=360
    :alt: Version
    :target: https://github.com/yoshida-lab/XenonPy/releases/latest

.. |python| image:: https://img.shields.io/pypi/pyversions/xenonpy.svg
    :alt: Python Versions
    :target: https://pypi.org/project/xenonpy/

.. |total-dl| image:: https://pepy.tech/badge/xenonpy
    :alt: Downloads
    :target: https://pepy.tech/badge/xenonpy

.. |per-dl| image:: https://img.shields.io/pypi/dm/xenonpy.svg?label=PiPy%20downloads
    :alt: PyPI - Downloads



================================================
FILE: docs/source/installation.rst
================================================
.. role:: raw-html(raw)
    :format: html

.. note::

   To all those who have purchased the book `Materials Informatics`_  published by `KYORITSU SHUPPAN`_:

   The link to the exercises has changed to https://github.com/yoshida-lab/XenonPy/tree/master/mi_book.
   Please follow the new link to access all these exercises.

   We apologize for the inconvenience.

============
Installation
============

XenonPy can be installed using pip_ in 3.6 and 3.7 on Mac, Linux, and Windows.
Alternatively, we recommend using the `Docker Image`_ if you have no installation preference.
We have no plan to support Python 2.x. One of the main reasons is that the ``pymatgen`` library will not support Python 2 from 2019.
See `this link <http://pymatgen.org/#py3k-only-with-effect-from-2019-1-1>`_ for details.



.. _install_xenonpy:

-------------------
Using conda and pip
-------------------

pip_ is a package management system for installing and updating Python packages, which comes with any Python distribution.
Conda_ is an open source package management system and environment management system that runs on Windows, macOS, and Linux.
Conda easily creates, saves, loads and switches between environments on your local computer.

XenonPy has 3 peer dependencies, which are PyTorch, pymatgen and rdkit_. Before you install XenonPy, you have to install them.
The easiest way to install all 3 packages is to use Conda_. The following official tutorials will guide you through a successful installation.

PyTorch: https://pytorch.org/get-started/locally/
:raw-html:`<br />`
pymatgen: http://pymatgen.org/index.html#getting-pymatgen
:raw-html:`<br />`
rdkit: https://www.rdkit.org/docs/Install.html

For convenience, several environments preset are available at `conda_env`_.
You can use these files to create a runnable environment on your local machine.

.. code-block:: bash

    $ conda create -n <env_name_you_liked> python={3.6 or 3.7}  # use `conda create` command to create a fresh environment with specific name and python version
    $ conda env update -n <env_name_you_created> -f <path_to_env_file>  # use `conda env update` command to sync packages with the preset environment

.. note::

    For Unix-like (Linux, Mac, FreeBSD, etc.) system, the above command will be enough. For windows, additional tools are needed.
    We highly recommend you to install the `Visual C++ Build Tools <https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=16>`_ before creating your environment.
    Also, confirm that you have checked the **Windows 10 SDK** (assuming the computer is Windows 10) on when installing the build tools.

The following example shows how to create an environment named ``xenonpy`` in ``python3.7`` and ``cuda10.1`` supports step-by-step.

1. **Chose an environment preset and download it**.

 Because we want to have cuda10.1 supports, The **cuda101.yml** preset will surely satisfy this work.
 If `curl <https://curl.haxx.se/>`_ has been installed, the following command will download the environment file to your local machine.

 .. code-block:: bash

  $ curl -O https://raw.githubusercontent.com/yoshida-lab/XenonPy/master/conda_env/cuda101.yml

2. **Create the environment and install packages using environment file**.

 The following commands will rebuild a python3.7 environment, and install the packages which are listed in **cuda101.yml**.

 .. code-block:: bash

    $ conda create -n xenonpy python=3.7
    $ conda env update -n xenonpy -f cuda101.yml


3. **Enter the environment by name**.

 In this example, it's ``xenonpy``.

 .. code-block:: bash

    $ source activate xenonpy

    # or

    $ activate xenonpy

    # or

    $ conda activate xenonpy

 .. note::
     Which command should be used is based on your system and your conda configuration.

4. **Update XenonPy**

 When you reached here, XenonPy has been installed successfully.
 If you want to update your old installation of XenonPy, ssing ``pip install -U xenonpy``.

 .. code-block:: bash

    $ pip install -U xenonpy


------------
Using docker
------------

.. image:: _static/docker.png


**Docker** is a tool designed to easily create, deploy, and run applications across multiple platforms using containers.
Containers allow a developer to pack up an application with all of the parts it needs, such as libraries and other dependencies, into a single package.
We provide the `official docker images`_ via the `Docker hub <https://hub.docker.com>`_.

Using docker needs you to have a docker installation on your local machine. If you have not installed it yet, follow the `official installation tutorial <https://docs.docker.com/install/>`_ to install docker CE on your machine.
Once you have done this, the following command will boot up a jupyterlab_ for you with XenonPy inside. See `here <https://github.com/yoshida-lab/XenonPy#xenonpy-images>`_ to know what other packages are available.

.. code-block:: bash

    $ docker run --rm -it -v $HOME/.xenonpy:/home/user/.xenonpy -v <path/to/your/work_space>:/workspace -p 8888:8888 yoshidalab/xenonpy

If you have a GPU server/PC running Linux and want to bring the GPU acceleration to docker. Just adding ``--runtime=nvidia`` to ``docker run`` command.

.. code-block:: bash

    $ docker run --runtime=nvidia --rm -it -v $HOME/.xenonpy:/home/user/.xenonpy -v <path/to/your/work_space>:/workspace -p 8888:8888 yoshidalab/xenonpy

For more information about **using GPU acceleration in docker**, see `nvidia docker <https://github.com/NVIDIA/nvidia-docker>`_.
.. note::
    
    If you get **docker: Error response from daemon: Unknown runtime specified nvidia.** when runing docker with ``--runtime=nvidia``.
    Please update your ``nvidia-docker`` to ``nvidia-docker2`` and repleace ``--runtime=nvidia`` with ``--gpus all``.
    see `this issue <https://github.com/NVIDIA/nvidia-docker/issues/838>`_ for details.


Permission failed
-----------------

You may have a permission problem when you try to open/save jupyter files. This is because docker is a container system running like a virtual machine.
Files will have different permission when be mounted onto a docker container.
The simplest way to resolve this problem is changing the permission of failed files.
You can open a terminal in jupyter notebook and type:

.. code-block:: bash

    $ sudo chmod 666 permission_failed_file

This will change file permission to ``r+w`` for all users.


------------------------------
Installing in development mode
------------------------------

The user who plans to contribute to XenonPy has to extend the python environment to support pytest and other development tools.
The simplest way to extend your environment is using `extra_env.yml`_.

.. code-block:: bash

    $ git clone https://github.com/yoshida-lab/XenonPy.git

under the cloned folder, run the following to install XenonPy in development mode:

.. code-block:: bash

    $ cd XenonPy
    $ conda env update -n <your_env_name> -f devtools/extra_env.yml
    $ pip install -e .



----------------------
Troubleshooting/issues
----------------------

Contact us at issues_ and Gitter_ when you have trouble.

Please provide detailed information (system specification, Python version, and input/output log, and so on).

-----------------------------------------------------------------------------------------------------------

.. _Materials Informatics: https://www.kyoritsu-pub.co.jp/book/b10013510.html
.. _KYORITSU SHUPPAN: https://www.kyoritsu-pub.co.jp/
.. _Conda: https://conda.io/en/latest/
.. _official docker images: https://cloud.docker.com/u/yoshidalab/repository/docker/yoshidalab/xenonpy
.. _yoshida-lab channel: https://anaconda.org/yoshida
.. _pip: https://pip.pypa.io
.. _docker image: https://docs.docker.com
.. _extra_env.yml: https://github.com/yoshida-lab/XenonPy/blob/master/devtools/extra_env.yml
.. _issues: https://github.com/yoshida-lab/XenonPy/issues
.. _Gitter: https://gitter.im/yoshida-lab/XenonPy
.. _PyTorch: http://pytorch.org/
.. _rdkit: https://www.rdkit.org/
.. _jupyterlab: https://jupyterlab.readthedocs.io/en/stable/
.. _conda_env: https://github.com/yoshida-lab/XenonPy/tree/master/conda_env


================================================
FILE: docs/source/modules.rst
================================================
xenonpy
=======

.. toctree::
   :maxdepth: 4

   xenonpy


================================================
FILE: docs/source/setup.rst
================================================
setup module
============

.. automodule:: setup
   :members:
   :undoc-members:
   :show-inheritance:


================================================
FILE: docs/source/tutorial.rst
================================================
========
Tutorial
========

These tutorials will demonstrate the most foundational usages of XenonPy and XenonPy.MDL and
we assume that you can use `Jupyter notebook <https://jupyter.org/>`_.

.. toctree::
   :maxdepth: 1
   :glob:

   tutorials/*


-----------
Sample data
-----------

Before starting these tutorials, you need to prepare some sample data for the benchmark/test.

We selected 1,000 inorganic compounds randomly from the `Materials Project <https://materialsproject.org>`_ database for this using.
You can check these **MP ids** at:

    https://github.com/yoshida-lab/XenonPy/blob/master/samples/mp_ids.txt.

To build the sample data, you also have to create an API key at the materials project.
Please see `The Materials API <https://materialsproject.org/open>`_  and follow the official documents.


You can use the following codes to build your sample data. These data will be saved at ``~/.xenonpy/userdata``.

    >>> from xenonpy.datatools import preset
    >>> preset.build('mp_samples', api_key='your api key')

If you want to know what exactly the code did, please check:

    https://github.com/yoshida-lab/XenonPy/blob/master/samples/sample_data_building.ipynb



================================================
FILE: docs/source/tutorials/1-dataset.rst
================================================
===========
Data access
===========

**Dataset** is an abstraction of the local file system.
Users can add their local paths into this system to easily access the data inside.
The basic concept is to treat a data file as a property of a ``Dataset`` object.
The following docs show how easy it is to interact with the data in this system.


-------
Dataset
-------

Assuming that you have some data files ``data1.csv``, ``data1.pd.xz``, ``data1.pkl.z`` under dir `/set1`
and ``data2.csv``, ``data2.pd.xz``, ``data2.pkl.z`` under dir `/set2`.

The following codes will create a ``Dataset`` object containing all available files under `/set1` and `/set2`.

    >>> from xenonpy.datatools import Dataset
    >>> dataset = Dataset('/set1', '/set2')
    >>> dataset
    <Dataset> includes:
    "data1": /set1/data1.pd.xz
    "data2": /set2/data2.pd.xz

Now, you can retrieve data by their name like this:

    >>> dataset.dataframe.data1

What the code did is that, the ``dataset`` loaded a file with name ``data1.pd.xz`` from `/set1` or `/set2`.
In this case, the `/set1/data1.pd.xz` was loaded.

It is important to note that we called a property named ``dataframe`` before we load ``data1`` in order to let ``dataset`` know that it is loading a ``pandas.DataFrame`` object file using the ``pd.read_pickle`` function.

Currently, 4 loaders are available out-of-the-box. The information of built-in loaders is summarised as below.

.. table:: built-in loaders

    ==============  ==================  =============================
    file extension        loader              description
    --------------  ------------------  -----------------------------
    ``pd(.*)``      pd.read_pickle      pandas.DataFrame object file
    ``csv``         pd.read_csv         csv file
    ``xlsx|xls``    pd.read_excel       excel file
    ``pkl(.*)``     joblib.load         common pickled files
    ==============  ==================  =============================

The default loader is ``dataframe``. This means that if you want to load a pandas.DataFrame object, you can omit the ``dataframe``.
The following code exactly does the same work as explained above:

    >>> dataset.data1

You can also specify the default loader by setting the ``backend`` parameter:

    >>> dataset = Dataset('set1', 'set2', backend='csv')
    >>> dataset.data1  # this will load '/set1/data1.csv'



------
preset
------

XenonPy also uses this system to provide some built-in data.
Currently, two sets of element-level property data are available out-of-the-box (``elements`` and ``elements_completed`` (imputed version of ``elements``)).
These data were collected from `mendeleev`_, `pymatgen`_, `CRC Hand Book`_ and `Magpie`_.
To know the details of ``elements_completed``, see :ref:`features:Data access`

.. _CRC Hand Book: http://hbcponline.com/faces/contents/ContentsSearch.xhtml
.. _Magpie: https://bitbucket.org/wolverton/magpie
.. _mendeleev: https://mendeleev.readthedocs.io
.. _pymatgen: http://pymatgen.org/

Use the following codes to load ``elements`` and ``elements_completed``.

    >>> from xenonpy.datatools import preset
    >>> preset.elements
    >>> preset.elements_completed

If you will get a ``file not exist`` error, please run the following code to sync your local dataset.

    >>> from xenonpy.datatools import preset
    >>> preset.sync('elements')
    >>> preset.sync('elements_completed')

These are still some advanced uses of ``Dataset`` and ``preset``. For more details, see :ref:`tutorials/1-dataset:Advance`.

Also see the jupyter files at:

    https://github.com/yoshida-lab/XenonPy/tree/master/samples/dataset_and_preset.ipynb


-------
Storage
-------

For implementation details, you can check out our sample codes:

    https://github.com/yoshida-lab/XenonPy/tree/master/samples/storage.ipynb




-------
Advance
-------

Coming soon!


================================================
FILE: docs/source/tutorials/2-descriptor.rst
================================================
======================
Descriptor calculation
======================

**XenonPy** comes with a general interface for descriptor calculation.
By using this interface, users can implement their descriptor calculator with only a few lines of codes and run it smoothly.

We also use this system to provide built-in calculators. Currently, 15 featurizers in 4 types are available out-of-the-box.
The following list shows a summary.

.. csv-table:: Summary of built-in featurizers
    :header: "Featurizer", "Type", "Description"

    "Counting", "Composition", "Encoding number of compounds elements in to vector: :math:`f_{min, i} = min{f_{A,i}, f_{B,i}}`"
    "WeightedAverage", "Composition", "Weighted average (abbr: ave): :math:`f_{ave, i} = w_{A}^* f_{A,i} + w_{B}^* f_{B,i}`"
    "WeightedVariance", "Composition", "Weighted variance (abbr: var): :math:`f_{var, i} = w_{A}^* (f_{A,i} - f_{ave, i})^2  + w_{B}^* (f_{B,i} - f_{ave, i})^2`"
    "WeightedSum", "Composition", "Weighted sum (abbr: sum): :math:`f_{sum, i} = w_{A} f_{A,i} + w_{B} f_{B,i}`"
    "GeometricMean", "Composition", "Geometric mean (abbr: gmean): :math:`f_{gmean, i} = \sqrt[w_A + w_B]{f_{A,i}^{w_A} * f_{V,i}^{w_B}}`"
    "HarmonicMean", "Composition", "Harmonic mean (abbr: hmean): :math:`f_{hmean, i} = \frac{w_A +w_B}{\frac{1}{f_{A,i}}*w_A + \frac{1}{f_{B,i}}*w_B}`"
    "MaxPooling", "Composition", "Max-pooling (abbr: max): :math:`f_{max, i} = max{f_{A,i}, f_{B,i}}`"
    "MinPooling", "Composition", "Min-pooling (abbr: min): :math:`f_{min, i} = min{f_{A,i}, f_{B,i}}`"
    "RDKitFP", "Fingerprint", "RDKit fingerprint"
    "AtomPairFP", "Fingerprint", "Atom Pair fingerprints"
    "MACCS", "Fingerprint", "The MACCS keys for a molecule"
    "ECFP", "Fingerprint", "Morgan (Circular) fingerprints (ECFP)"
    "FCFP", "Fingerprint", "Morgan (Circular) fingerprints + feature-based (FCFP)"
    "TopologicalTorsionFP", "Fingerprint", "Topological Torsion fingerprints"
    "OrbitalFieldMatrix", "Structure", "Representation based on the valence shell electrons of neighboring atoms"
    "RadialDistributionFunction", "Structure", "Radial distribution in crystal"
    "FrozenFeaturizer", "NN ", "Neural Network Extracted "


-------------------------
Compositional descriptors
-------------------------

XenonPy can calculate 290 compositional features for a given chemical composition.
This calculation uses the information of the 58 element-level property data recorded in ``elements_completed``.
See :ref:`features:Data access` for details.

    >>> from xenonpy.descriptor import Compositions
    >>> cal = Compositions()
    >>> cal
    Compositions:
      |- composition:
      |  |- Counting
      |  |- WeightedAverage
      |  |- WeightedSum
      |  |- WeightedVariance
      |  |- GeometricMean
      |  |- HarmonicMean
      |  |- MaxPooling
      |  |- MinPooling

The structure information of the calculator ``Cal`` is shown above.
This information tells us ``Cal`` has one featurizer group called **composition** with featurizers
``WeightedAvgFeature``, ``WeightedSumFeature``, ``WeightedVarFeature``, ``MaxFeature`` and ``MinFeature`` in it.

To use this calculator, users have to structure an iterable object that contains the information of compounds' composition, then feed it to the method ``transform`` or ``fit_transform`` in ``cal``.
These methods accept two types of input, the ``pymatgen.Structure`` objects, or dicts which have the structure like `{'H': 2, 'O': 1}`.

Using our sample data, users will obtain a pandas.DataFrame object that contains all the compositional descriptors.

    >>> from xenonpy.datatools import preset
    >>> samples = preset.mp_samples
    >>> comps = samples['composition']
    >>> descriptor = cal.transform(comps)
    >>> descriptor
         ave:atomic_number  ...  min:Polarizability
    0            24.666667  ...            0.802000
    1            33.000000  ...            1.100000
    2            21.600000  ...            0.802000
    ...                ...  ...                 ...
    928          44.500000  ...            5.500000
    929          24.250000  ...           25.000000
    930          26.750000  ...            4.800000
    931          36.000000  ...            6.600000
    932          16.500000  ...            0.802000
    [933 rows x 290 columns]

where

    >>> comps.__class__
    pandas.core.series.Series
    >>> comps[0].__class__
    dict


If the input is a pandas.DataFrame object, the calculator will first try to read the data columns that have the same name as the featurizer groups.
For example, the name of the featurizer group in the example above is **composition**.
Therefore, the whole object entry can be fed into the calculator's methods without explicitly extracting the **composition** column in the ``samples``:

    >>> descriptor = cal.transform(samples)
    >>> descriptor
         ave:atomic_number  ...  min:Polarizability
    0            24.666667  ...            0.802000
    1            33.000000  ...            1.100000
    2            21.600000  ...            0.802000
    ...                ...  ...                 ...
    928          44.500000  ...            5.500000
    929          24.250000  ...           25.000000
    930          26.750000  ...            4.800000
    931          36.000000  ...            6.600000
    932          16.500000  ...            0.802000
    [933 rows x 290 columns]

This does the same work as the previous one.


----------------------
Structural descriptors
----------------------

Similar to the ``Compositions`` calculator, ``Structures`` accepts ``pymatgen.Structure`` objects as its input, and then return calculated results as a pandas.DataFrame.

    >>> from xenonpy.descriptor import Structures
    >>> cal = Structures()
    >>> cal
    Structures:
      |- structure:
      |  |- RadialDistributionFunction
      |  |- OrbitalFieldMatrix

``Structures`` contains one featurizer group called **structure** with ``RadialDistributionFunction`` and ``OrbitalFieldMatrix`` in it.
``samples`` also has the structure information. We can use these to calculate structural descriptors.

    >>> descriptor = cal.transform(samples)

This will take 3 ~ 5 min to run and finally, you will get:

    >>> descriptor.head(5)
                0.1  0.2  0.30000000000000004  ...  f14_f12  f14_f13  f14_f14
    mp-1008807  0.0  0.0                  0.0  ...      0.0      0.0   0.0000
    mp-1009640  0.0  0.0                  0.0  ...      0.0      0.0   0.0000
    mp-1016825  0.0  0.0                  0.0  ...      0.0      0.0   0.0000
    mp-1017582  0.0  0.0                  0.0  ...      0.0      0.0   0.3851
    mp-1021511  0.0  0.0                  0.0  ...      0.0      0.0   0.0000
    [5 rows x 1224 columns]


-------
Advance
-------

There are more details of the descriptor calculator system that are not yet included in this tutorial.
Before we complete this document, you can check out https://github.com/yoshida-lab/XenonPy/blob/master/samples/custom_descriptor_calculator.ipynb for more information.


================================================
FILE: docs/source/tutorials/3-visualization.rst
================================================
=============
Visualization
=============

Descriptors on a set of given materials could be displayed as a heatmap, which helps you to understand the descriptor-property relationships.
This tutorial will show you how to draw a heatmap.


------------------
Descriptor heatmap
------------------

We will use ``Composition`` and ``density`` as the descriptors and target property, respectively, for a step-by-step demonstration of how to draw a heatmap.

1. calculate descriptors

    .. code-block:: python

        from xenonpy.datatools import preset
        from xenonpy.descriptor import Compositions

        samples = preset.mp_samples
        cal = Compositions()

        descriptor = cal.transform(samples['composition'])

2. sort descriptors by property values

    .. code-block:: python

        # use formation energy as our target
        property_ = 'density'

        # --- sort property
        prop = samples[property_].dropna()
        sorted_prop = prop.sort_values()

        # --- sort descriptors
        sorted_desc = descriptor.loc[sorted_prop.index]

3. draw the heatmap

    .. code-block:: python

        # --- import necessary libraries

        from xenonpy.visualization import DescriptorHeatmap

        heatmap = DescriptorHeatmap(
                bc=True,  # use box-cox transform
                save=dict(fname='heatmap_density', dpi=200, bbox_inches='tight'),  # save figure to file
                figsize=(70, 10))
        heatmap.fit(sorted_desc)
        heatmap.draw(sorted_prop)


Here, we explain how to *read* the descriptor heatmap.

.. figure:: ../_static/heatmap_density.png

     Heatmap of ~70,000 compounds with 290 compositional descriptors sorted by their property's value.

In the heatmap of the descriptor matrix, the materials are arranged from the top to bottom in the increasing order
of density. Plotting the descriptor-property relationships in this way, we could visually recognize which
descriptors are relevant or irrelevant to the prediction of formation energies. Relevant descriptors, which are linearly
or nonlinearly dependent to formation energies, might exhibit certain patterns from top to bottom in the heatmap. For example,
a monotonic decrease or increase pattern would appear in a linearly dependent descriptor. On the other hand,
irrelevant descriptors might exhibit no specific patterns.

You can test run using this sample code:

    https://github.com/yoshida-lab/XenonPy/blob/master/samples/visualization.ipynb


================================================
FILE: docs/source/tutorials/4-random_nn_model_and_training.ipynb
================================================
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "# Random NN models"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This tutorial shows how to build neural network models.\n",
    "We will learn how to calculate compositional descriptors using `xenonpy.descriptor.Compositions` calculator and train our model using `xenonpy.model.training` modules.\n",
    "\n",
    "In this tutorial, we will use some inorganic sample data from materials project. \n",
    "If you don't have it, please see https://github.com/yoshida-lab/XenonPy/blob/master/samples/build_sample_data.ipynb."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### useful functions\n",
    "\n",
    "Running the following cell will load some commonly used packages, such as `numpy`, `pandas`, and so on. It will also import some in-house functions used in this tutorial. See `samples/tools.ipynb` to check what will be imported."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%run tools.ipynb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sequential linear model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We will use `xenonpy.model.SequentialLinear` to build a sequential linear model. The basic layer in `SequentialLinear` model is `xenonpy.model.LinearLayer`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mInit signature:\u001b[0m\n",
       "\u001b[0mSequentialLinear\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0min_features\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mout_features\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mbias\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0;34m*\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mh_neurons\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mh_bias\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mbool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mh_dropouts\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mh_normalizers\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mh_activation_funcs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mCallable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mCallable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mReLU\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mDocstring:\u001b[0m     \n",
       "Sequential model with linear layers and configurable other hype-parameters.\n",
       "e.g. ``dropout``, ``hidden layers``\n",
       "\u001b[0;31mInit docstring:\u001b[0m\n",
       "Parameters\n",
       "----------\n",
       "in_features\n",
       "    Size of input.\n",
       "out_features\n",
       "    Size of output.\n",
       "bias\n",
       "    Enable ``bias`` in input layer.\n",
       "h_neurons\n",
       "    Number of neurons in hidden layers.\n",
       "    Can be a tuple of floats. In that case,\n",
       "    all these numbers will be used to calculate the neuron numbers.\n",
       "    e.g. (0.5, 0.4, ...) will be expanded as (in_features * 0.5, in_features * 0.4, ...)\n",
       "h_bias\n",
       "    ``bias`` in hidden layers.\n",
       "h_dropouts\n",
       "    Probabilities of dropout in hidden layers.\n",
       "h_normalizers\n",
       "    Momentum of batched normalizers in hidden layers.\n",
       "h_activation_funcs\n",
       "    Activation functions in hidden layers.\n",
       "\u001b[0;31mFile:\u001b[0m           ~/projects/XenonPy/xenonpy/model/sequential.py\n",
       "\u001b[0;31mType:\u001b[0m           type\n",
       "\u001b[0;31mSubclasses:\u001b[0m     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from xenonpy.model import SequentialLinear, LinearLayer\n",
    "SequentialLinear?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mInit signature:\u001b[0m\n",
       "\u001b[0mLinearLayer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0min_features\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mout_features\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mbias\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0;34m*\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mdropout\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mactivation_func\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mCallable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mReLU\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mnormalizer\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mDocstring:\u001b[0m     \n",
       "Base NN layer. This is a wrap around PyTorch.\n",
       "See here for details: http://pytorch.org/docs/master/nn.html#\n",
       "\u001b[0;31mInit docstring:\u001b[0m\n",
       "Parameters\n",
       "----------\n",
       "in_features:\n",
       "    Size of each input sample.\n",
       "out_features:\n",
       "    Size of each output sample\n",
       "dropout: float\n",
       "    Probability of an element to be zeroed. Default: 0.5\n",
       "activation_func: func\n",
       "    Activation function.\n",
       "normalizer: func\n",
       "    Normalization layers\n",
       "\u001b[0;31mFile:\u001b[0m           ~/projects/XenonPy/xenonpy/model/sequential.py\n",
       "\u001b[0;31mType:\u001b[0m           type\n",
       "\u001b[0;31mSubclasses:\u001b[0m     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "LinearLayer?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Following the official suggestion from PyTorch, `SequentialLinear` is a python class that inherit the `torch.nn.Module` class. Users can specify the hyperparameters to get a fully customized model object. For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SequentialLinear(\n",
       "  (layer_0): LinearLayer(\n",
       "    (linear): Linear(in_features=290, out_features=232, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(232, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_1): LinearLayer(\n",
       "    (linear): Linear(in_features=232, out_features=203, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(203, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_2): LinearLayer(\n",
       "    (linear): Linear(in_features=203, out_features=174, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(174, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (output): Linear(in_features=174, out_features=1, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = SequentialLinear(290, 1, h_neurons=(0.8, 0.7, 0.6))\n",
    "model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### fully randomized model generation\n",
    "\n",
    "Process of random model generation:\n",
    "\n",
    "1. using a random parameter generator to generate a set of parameter.\n",
    "2. using the generated parameter set to setup a model object.\n",
    "3. loop step 1 and 2 as many times as needed.\n",
    "\n",
    "We provided a general parameter generator `xenonpy.utils.ParameterGenerator`  to do all the 3 steps for any callable object."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mInit signature:\u001b[0m\n",
       "\u001b[0mParameterGenerator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mseed\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mAny\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSequence\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mCallable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDict\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mDocstring:\u001b[0m      Generator for parameter set generating.\n",
       "\u001b[0;31mInit docstring:\u001b[0m\n",
       "Parameters\n",
       "----------\n",
       "seed\n",
       "    Numpy random seed.\n",
       "kwargs\n",
       "    Parameter candidate.\n",
       "\u001b[0;31mFile:\u001b[0m           ~/projects/XenonPy/xenonpy/utils/parameter_gen.py\n",
       "\u001b[0;31mType:\u001b[0m           type\n",
       "\u001b[0;31mSubclasses:\u001b[0m     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from xenonpy.utils import ParameterGenerator\n",
    "ParameterGenerator?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Calling an instance of `ParameterGenerator` will return a generator.\n",
    "This generator can randomly select parameters from parameter candidates and yield them as a dict. This is what we want in step 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import ceil\n",
    "from random import uniform\n",
    "\n",
    "generator = ParameterGenerator(\n",
    "    in_features=290,\n",
    "    out_features=1,\n",
    "    h_neurons=dict(\n",
    "        data=[ceil(uniform(0.1, 1.2) * 290) for _ in range(100)], \n",
    "        repeat=(2, 3)\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Because `generator` is a generator, `for ... in ...` statement can be applied. \n",
    "For example, we can use `for parameters in generator(num_of_models)` to loop all these generated parameter sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (70, 109)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (135, 45)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (216, 261, 79)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (111, 88, 49)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (216, 79, 47)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (161, 45)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (193, 161, 78)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (90, 36, 234)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (230, 83, 295)}\n",
      "{'in_features': 290, 'out_features': 1, 'h_neurons': (171, 247)}\n"
     ]
    }
   ],
   "source": [
    "for parameters in generator(num=10):\n",
    "    print(parameters)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For step 2, we can give a model class to the `factory` parameter as a factory function.\n",
    "If `factory` parameter is given, generator will feed generated parameters to the factory function automatically and yield the result as a second return in each loop. For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "parameters:  {'in_features': 290, 'out_features': 1, 'h_neurons': (182, 335, 204)}\n",
      "SequentialLinear(\n",
      "  (layer_0): LinearLayer(\n",
      "    (linear): Linear(in_features=290, out_features=182, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(182, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_1): LinearLayer(\n",
      "    (linear): Linear(in_features=182, out_features=335, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(335, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_2): LinearLayer(\n",
      "    (linear): Linear(in_features=335, out_features=204, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(204, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=204, out_features=1, bias=True)\n",
      ") \n",
      "\n",
      "parameters:  {'in_features': 290, 'out_features': 1, 'h_neurons': (108, 255)}\n",
      "SequentialLinear(\n",
      "  (layer_0): LinearLayer(\n",
      "    (linear): Linear(in_features=290, out_features=108, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(108, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_1): LinearLayer(\n",
      "    (linear): Linear(in_features=108, out_features=255, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(255, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=255, out_features=1, bias=True)\n",
      ") \n",
      "\n"
     ]
    }
   ],
   "source": [
    "for parameters, model in generator(2, factory=SequentialLinear):\n",
    "    print('parameters: ', parameters)\n",
    "    print(model, '\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scheduled random model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also enable users to generate parameters in a functional way by given a function as candidate parameters. In this case, the function accept an int number as vector length and a vector of generated parameters. For example, generate a `n` length vector with float numbers sorted in ascending."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = ParameterGenerator(\n",
    "    in_features=290,\n",
    "    out_features=1,\n",
    "    h_neurons=dict(\n",
    "        data=lambda n: sorted(np.random.uniform(0.2, 0.8, size=n), reverse=True), \n",
    "        repeat=(2, 3)\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "parameters:  {'in_features': 290, 'out_features': 1, 'h_neurons': (0.7954011465554711, 0.6993610045591458)}\n",
      "SequentialLinear(\n",
      "  (layer_0): LinearLayer(\n",
      "    (linear): Linear(in_features=290, out_features=231, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(231, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_1): LinearLayer(\n",
      "    (linear): Linear(in_features=231, out_features=203, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(203, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=203, out_features=1, bias=True)\n",
      ") \n",
      "\n",
      "parameters:  {'in_features': 290, 'out_features': 1, 'h_neurons': (0.798810246990777, 0.38584535382368323, 0.29569841893337045)}\n",
      "SequentialLinear(\n",
      "  (layer_0): LinearLayer(\n",
      "    (linear): Linear(in_features=290, out_features=232, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(232, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_1): LinearLayer(\n",
      "    (linear): Linear(in_features=232, out_features=112, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(112, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (layer_2): LinearLayer(\n",
      "    (linear): Linear(in_features=112, out_features=86, bias=True)\n",
      "    (dropout): Dropout(p=0.1)\n",
      "    (normalizer): BatchNorm1d(86, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
      "    (activation): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=86, out_features=1, bias=True)\n",
      ") \n",
      "\n"
     ]
    }
   ],
   "source": [
    "for parameters, model in generator(2, factory=SequentialLinear):\n",
    "    print('parameters: ', parameters)\n",
    "    print(model, '\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model training\n",
    "\n",
    "We provide a general and extendable model training system for neural network models.\n",
    "By customizing the extensions, users can fully control their model training process, and save the training results following the *XenonPy.MDL* format automatically.\n",
    "\n",
    "All these modules and extensions are under the `xenonpy.model.training`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "from pymatgen import Structure\n",
    "\n",
    "from xenonpy.model.training import Trainer, SGD, MSELoss, Adam, ReduceLROnPlateau, ExponentialLR, ClipValue\n",
    "\n",
    "from xenonpy.datatools import preset, Splitter\n",
    "from xenonpy.descriptor import Compositions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### prepare training/testing data\n",
    "\n",
    "If you followed the tutorial in https://github.com/yoshida-lab/XenonPy/blob/master/samples/build_sample_data.ipynb,\n",
    "the sample data should be save at `~/.xenonpy/userdata` with name `mp_samples.pd.xz`.\n",
    "You can use `pd.read_pickle` to load this file but we suggest that you use our `xenonpy.datatools.preset` module.\n",
    "\n",
    "We chose `volume` as the example to demonstrate how to use our training system. We only use the data which `volume` are smaller than 2,500 to avoid the disparate data.\n",
    "we select data in `pandas.DataFrame` and calculate the descriptors using `xenonpy.descriptor.Compositions` calculator.\n",
    "It is noticed that the input for a neuron network model in pytorch must has shape (N x M x ...), which mean if the input is a 1-D vector, it should be reshaped to 2-D, e.g. (N) -> (N x 1)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>band_gap</th>\n",
       "      <th>composition</th>\n",
       "      <th>density</th>\n",
       "      <th>e_above_hull</th>\n",
       "      <th>efermi</th>\n",
       "      <th>elements</th>\n",
       "      <th>final_energy_per_atom</th>\n",
       "      <th>formation_energy_per_atom</th>\n",
       "      <th>pretty_formula</th>\n",
       "      <th>structure</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>mp-1008807</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>{'Rb': 1.0, 'Cu': 1.0, 'O': 1.0}</td>\n",
       "      <td>4.784634</td>\n",
       "      <td>0.996372</td>\n",
       "      <td>1.100617</td>\n",
       "      <td>[Rb, Cu, O]</td>\n",
       "      <td>-3.302762</td>\n",
       "      <td>-0.186408</td>\n",
       "      <td>RbCuO</td>\n",
       "      <td>[[-3.05935361 -3.05935361 -3.05935361] Rb, [0....</td>\n",
       "      <td>57.268924</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1009640</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>{'Pr': 1.0, 'N': 1.0}</td>\n",
       "      <td>8.145777</td>\n",
       "      <td>0.759393</td>\n",
       "      <td>5.213442</td>\n",
       "      <td>[Pr, N]</td>\n",
       "      <td>-7.082624</td>\n",
       "      <td>-0.714336</td>\n",
       "      <td>PrN</td>\n",
       "      <td>[[0. 0. 0.] Pr, [1.57925232 1.57925232 1.58276...</td>\n",
       "      <td>31.579717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1016825</td>\n",
       "      <td>0.7745</td>\n",
       "      <td>{'Hf': 1.0, 'Mg': 1.0, 'O': 3.0}</td>\n",
       "      <td>6.165888</td>\n",
       "      <td>0.589550</td>\n",
       "      <td>2.424570</td>\n",
       "      <td>[Hf, Mg, O]</td>\n",
       "      <td>-7.911723</td>\n",
       "      <td>-3.060060</td>\n",
       "      <td>HfMgO3</td>\n",
       "      <td>[[2.03622802 2.03622802 2.03622802] Hf, [0. 0....</td>\n",
       "      <td>67.541269</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            band_gap                       composition   density  \\\n",
       "mp-1008807    0.0000  {'Rb': 1.0, 'Cu': 1.0, 'O': 1.0}  4.784634   \n",
       "mp-1009640    0.0000             {'Pr': 1.0, 'N': 1.0}  8.145777   \n",
       "mp-1016825    0.7745  {'Hf': 1.0, 'Mg': 1.0, 'O': 3.0}  6.165888   \n",
       "\n",
       "            e_above_hull    efermi     elements  final_energy_per_atom  \\\n",
       "mp-1008807      0.996372  1.100617  [Rb, Cu, O]              -3.302762   \n",
       "mp-1009640      0.759393  5.213442      [Pr, N]              -7.082624   \n",
       "mp-1016825      0.589550  2.424570  [Hf, Mg, O]              -7.911723   \n",
       "\n",
       "            formation_energy_per_atom pretty_formula  \\\n",
       "mp-1008807                  -0.186408          RbCuO   \n",
       "mp-1009640                  -0.714336            PrN   \n",
       "mp-1016825                  -3.060060         HfMgO3   \n",
       "\n",
       "                                                    structure     volume  \n",
       "mp-1008807  [[-3.05935361 -3.05935361 -3.05935361] Rb, [0....  57.268924  \n",
       "mp-1009640  [[0. 0. 0.] Pr, [1.57925232 1.57925232 1.58276...  31.579717  \n",
       "mp-1016825  [[2.03622802 2.03622802 2.03622802] Hf, [0. 0....  67.541269  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# if you have not have the samples data\n",
    "# preset.build('mp_samples', api_key=<your materials project api key>)\n",
    "\n",
    "from xenonpy.datatools import preset\n",
    "\n",
    "data = preset.mp_samples\n",
    "data.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In case of the system did not automatically download some descriptor data in XenonPy, please run the following code to sync the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fetching dataset `elements` from https://github.com/yoshida-lab/dataset/releases/download/v0.1.3/elements.pd.xz.\n",
      "fetching dataset `elements_completed` from https://github.com/yoshida-lab/dataset/releases/download/v0.1.3/elements_completed.pd.xz.\n"
     ]
    }
   ],
   "source": [
    "from xenonpy.datatools import preset\n",
    "preset.sync('elements')\n",
    "preset.sync('elements_completed')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ave:atomic_number</th>\n",
       "      <th>ave:atomic_radius</th>\n",
       "      <th>ave:atomic_radius_rahm</th>\n",
       "      <th>ave:atomic_volume</th>\n",
       "      <th>ave:atomic_weight</th>\n",
       "      <th>ave:boiling_point</th>\n",
       "      <th>ave:bulk_modulus</th>\n",
       "      <th>ave:c6_gb</th>\n",
       "      <th>ave:covalent_radius_cordero</th>\n",
       "      <th>ave:covalent_radius_pyykko</th>\n",
       "      <th>...</th>\n",
       "      <th>min:num_s_valence</th>\n",
       "      <th>min:period</th>\n",
       "      <th>min:specific_heat</th>\n",
       "      <th>min:thermal_conductivity</th>\n",
       "      <th>min:vdw_radius</th>\n",
       "      <th>min:vdw_radius_alvarez</th>\n",
       "      <th>min:vdw_radius_mm3</th>\n",
       "      <th>min:vdw_radius_uff</th>\n",
       "      <th>min:sound_velocity</th>\n",
       "      <th>min:Polarizability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>mp-1008807</td>\n",
       "      <td>24.666667</td>\n",
       "      <td>174.067140</td>\n",
       "      <td>209.333333</td>\n",
       "      <td>25.666667</td>\n",
       "      <td>55.004267</td>\n",
       "      <td>1297.063333</td>\n",
       "      <td>72.868680</td>\n",
       "      <td>1646.90</td>\n",
       "      <td>139.333333</td>\n",
       "      <td>128.333333</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.360</td>\n",
       "      <td>0.02658</td>\n",
       "      <td>152.0</td>\n",
       "      <td>150.0</td>\n",
       "      <td>182.0</td>\n",
       "      <td>349.5</td>\n",
       "      <td>317.5</td>\n",
       "      <td>0.802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1009640</td>\n",
       "      <td>33.000000</td>\n",
       "      <td>137.000000</td>\n",
       "      <td>232.500000</td>\n",
       "      <td>19.050000</td>\n",
       "      <td>77.457330</td>\n",
       "      <td>1931.200000</td>\n",
       "      <td>43.182441</td>\n",
       "      <td>1892.85</td>\n",
       "      <td>137.000000</td>\n",
       "      <td>123.500000</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.192</td>\n",
       "      <td>0.02583</td>\n",
       "      <td>155.0</td>\n",
       "      <td>166.0</td>\n",
       "      <td>193.0</td>\n",
       "      <td>360.6</td>\n",
       "      <td>333.6</td>\n",
       "      <td>1.100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1016825</td>\n",
       "      <td>21.600000</td>\n",
       "      <td>153.120852</td>\n",
       "      <td>203.400000</td>\n",
       "      <td>13.920000</td>\n",
       "      <td>50.158400</td>\n",
       "      <td>1420.714000</td>\n",
       "      <td>76.663625</td>\n",
       "      <td>343.82</td>\n",
       "      <td>102.800000</td>\n",
       "      <td>96.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.146</td>\n",
       "      <td>0.02658</td>\n",
       "      <td>152.0</td>\n",
       "      <td>150.0</td>\n",
       "      <td>182.0</td>\n",
       "      <td>302.1</td>\n",
       "      <td>317.5</td>\n",
       "      <td>0.802</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 290 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            ave:atomic_number  ave:atomic_radius  ave:atomic_radius_rahm  \\\n",
       "mp-1008807          24.666667         174.067140              209.333333   \n",
       "mp-1009640          33.000000         137.000000              232.500000   \n",
       "mp-1016825          21.600000         153.120852              203.400000   \n",
       "\n",
       "            ave:atomic_volume  ave:atomic_weight  ave:boiling_point  \\\n",
       "mp-1008807          25.666667          55.004267        1297.063333   \n",
       "mp-1009640          19.050000          77.457330        1931.200000   \n",
       "mp-1016825          13.920000          50.158400        1420.714000   \n",
       "\n",
       "            ave:bulk_modulus  ave:c6_gb  ave:covalent_radius_cordero  \\\n",
       "mp-1008807         72.868680    1646.90                   139.333333   \n",
       "mp-1009640         43.182441    1892.85                   137.000000   \n",
       "mp-1016825         76.663625     343.82                   102.800000   \n",
       "\n",
       "            ave:covalent_radius_pyykko  ...  min:num_s_valence  min:period  \\\n",
       "mp-1008807                  128.333333  ...                1.0         2.0   \n",
       "mp-1009640                  123.500000  ...                2.0         2.0   \n",
       "mp-1016825                   96.000000  ...                2.0         2.0   \n",
       "\n",
       "            min:specific_heat  min:thermal_conductivity  min:vdw_radius  \\\n",
       "mp-1008807              0.360                   0.02658           152.0   \n",
       "mp-1009640              0.192                   0.02583           155.0   \n",
       "mp-1016825              0.146                   0.02658           152.0   \n",
       "\n",
       "            min:vdw_radius_alvarez  min:vdw_radius_mm3  min:vdw_radius_uff  \\\n",
       "mp-1008807                   150.0               182.0               349.5   \n",
       "mp-1009640                   166.0               193.0               360.6   \n",
       "mp-1016825                   150.0               182.0               302.1   \n",
       "\n",
       "            min:sound_velocity  min:Polarizability  \n",
       "mp-1008807               317.5               0.802  \n",
       "mp-1009640               333.6               1.100  \n",
       "mp-1016825               317.5               0.802  \n",
       "\n",
       "[3 rows x 290 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>mp-1008807</td>\n",
       "      <td>57.268924</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1009640</td>\n",
       "      <td>31.579717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>mp-1016825</td>\n",
       "      <td>67.541269</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               volume\n",
       "mp-1008807  57.268924\n",
       "mp-1009640  31.579717\n",
       "mp-1016825  67.541269"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prop = data[data.volume <= 2500]['volume'].to_frame()  # reshape to 2-D\n",
    "desc = Compositions(featurizers='classic').transform(data.loc[prop.index]['composition'])\n",
    "\n",
    "desc.head(3)\n",
    "prop.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xenonpy.datatools import preset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use the `xenonpy.datatools.Splitter` to split data into training and test sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\u001b[0;31mInit signature:\u001b[0m\n",
       "\u001b[0mSplitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0msize\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0;34m*\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mtest_size\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mk_fold\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mIterable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mrandom_state\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mUnion\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNoneType\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m    \u001b[0mshuffle\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
       "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
       "\u001b[0;31mDocstring:\u001b[0m      Data splitter for train and test\n",
       "\u001b[0;31mInit docstring:\u001b[0m\n",
       "Parameters\n",
       "----------\n",
       "size\n",
       "    Total sample size.\n",
       "    All data must have same length of their first dim,\n",
       "test_size\n",
       "    If float, should be between ``0.0`` and ``1.0`` and represent the proportion\n",
       "    of the dataset to include in the test split. If int, represents the\n",
       "    absolute number of test samples. Can be ``0`` if cv is ``None``.\n",
       "    In this case, :meth:`~Splitter.cv` will yield a tuple only contains ``training`` and ``validation``\n",
       "    on each step. By default, the value is set to 0.2.\n",
       "k_fold\n",
       "    Number of k-folds.\n",
       "    If ``int``, Must be at least 2.\n",
       "    If ``Iterable``, it should provide label for each element which will be used for group cv.\n",
       "    In this case, the input of :meth:`~Splitter.cv` must be a :class:`pandas.DataFrame` object.\n",
       "    Default value is None to specify no cv.\n",
       "random_state\n",
       "    If int, random_state is the seed used by the random number generator;\n",
       "    Default is None.\n",
       "shuffle\n",
       "    Whether or not to shuffle the data before splitting.\n",
       "\u001b[0;31mFile:\u001b[0m           ~/projects/XenonPy/xenonpy/datatools/splitter.py\n",
       "\u001b[0;31mType:\u001b[0m           type\n",
       "\u001b[0;31mSubclasses:\u001b[0m     \n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Splitter?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(738, 290)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "(738, 1)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "(185, 290)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "(185, 1)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sp = Splitter(prop.shape[0])\n",
    "x_train, x_val, y_train, y_val = sp.split(desc, prop)\n",
    "\n",
    "x_train.shape\n",
    "y_train.shape\n",
    "x_val.shape\n",
    "y_val.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### model training\n",
    "\n",
    "Model training in pytorch is very flexible.\n",
    "The [official document](https://pytorch.org/tutorials/beginner/pytorch_with_examples.html) explains the concept with examples.\n",
    "In short, training a neuron network model includes:\n",
    "1. calculating loss of training data for the model.\n",
    "2. executing the backpropagation to update the weights between each neuron.\n",
    "3. looping over step 1 and 2 until convergence.\n",
    "\n",
    "In step 1, a calculator, often called `loss function`, is needed to calculate the loss.\n",
    "In step 2, an optimizer will be used.\n",
    "`xenonpy.model.training.Trainer` covers step 3.\n",
    "\n",
    "Here is how you will do it in XenonPy:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SequentialLinear(\n",
       "  (layer_0): LinearLayer(\n",
       "    (linear): Linear(in_features=290, out_features=232, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(232, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_1): LinearLayer(\n",
       "    (linear): Linear(in_features=232, out_features=174, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(174, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_2): LinearLayer(\n",
       "    (linear): Linear(in_features=174, out_features=116, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(116, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_3): LinearLayer(\n",
       "    (linear): Linear(in_features=116, out_features=58, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(58, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (output): Linear(in_features=58, out_features=1, bias=True)\n",
       ")"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = SequentialLinear(290, 1, h_neurons=(0.8, 0.6, 0.4, 0.2))\n",
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Trainer(clip_grad=None, cuda=None, epochs=200, loss_func=MSELoss(),\n",
       "        lr_scheduler=None,\n",
       "        model=SequentialLinear(\n",
       "  (layer_0): LinearLayer(\n",
       "    (linear): Linear(in_features=290, out_features=232, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(232, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (layer_1): LinearLayer(\n",
       "    (linear): Li...\n",
       "    (linear): Linear(in_features=116, out_features=58, bias=True)\n",
       "    (dropout): Dropout(p=0.1)\n",
       "    (normalizer): BatchNorm1d(58, eps=0.1, momentum=0.1, affine=True, track_running_stats=True)\n",
       "    (activation): ReLU()\n",
       "  )\n",
       "  (output): Linear(in_features=58, out_features=1, bias=True)\n",
       "),\n",
       "        non_blocking=False,\n",
       "        optimizer=Adam (\n",
       "Parameter Group 0\n",
       "    amsgrad: False\n",
       "    betas: (0.9, 0.999)\n",
       "    eps: 1e-08\n",
       "    lr: 0.01\n",
       "    weight_decay: 0\n",
       "))"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    optimizer=Adam(lr=0.01),\n",
    "    loss_func=MSELoss()\n",
    ")\n",
    "trainer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Training: 100%|██████████| 400/400 [00:06<00:00, 60.86it/s]\n"
     ]
    }
   ],
   "source": [
    "trainer.fit(\n",
    "    x_train=torch.tensor(x_train.values, dtype=torch.float),\n",
    "    y_train=torch.tensor(y_train.values, dtype=torch.float),\n",
    "    epochs=400\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>total_iters</th>\n",
       "      <th>i_epoch</th>\n",
       "      <th>i_batch</th>\n",
       "      <th>train_mse_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>397</td>\n",
       "      <td>397</td>\n",
       "      <td>398</td>\n",
       "      <td>1</td>\n",
       "      <td>3684.717041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>398</td>\n",
       "      <td>398</td>\n",
       "      <td>399</td>\n",
       "      <td>1</td>\n",
       "      <td>3058.761719</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>399</td>\n",
       "      <td>399</td>\n",
       "      <td>400</td>\n",
       "      <td>1</td>\n",
       "      <td>3039.683350</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     total_iters  i_epoch  i_batch  train_mse_loss\n",
       "397          397      398        1     3684.717041\n",
       "398          398      399        1     3058.761719\n",
       "399          399      400        1     3039.683350"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1a2ce256d0>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, ax = plt.subplots(figsize=(10, 5), dpi=100)\n",
    "trainer.training_info.tail(3)\n",
    "trainer.training_info.plot(y=['train_mse_loss'], ax=ax)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Missing directory and/or file name information!\n"
     ]
    },
    {
     "data": {
      "image/png": "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
Download .txt
gitextract_q28lv__2/

├── .github/
│   ├── config/
│   │   ├── check_env.sh
│   │   ├── linux_win_env.yml
│   │   ├── macos_env.yml
│   │   ├── matplotlibrc_agg
│   │   └── matplotlibrc_qtagg
│   ├── fetch_test.txt
│   └── workflows/
│       ├── deploy_pypi.yml
│       ├── mac.yml
│       ├── ubuntu.yml
│       └── win.yml
├── .gitignore
├── .pylintrc
├── .readthedocs.yml
├── .style.yapf
├── Dockerfile
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── conda_env/
│   ├── cpu.yml
│   ├── cuda118.yml
│   ├── cuda121.yml
│   ├── devtools/
│   │   ├── extra_env.yml
│   │   └── rtd_env.yml
│   └── osx.yml
├── docker/
│   ├── cpu/
│   │   └── Dockerfile
│   ├── cuda10/
│   │   └── Dockerfile
│   ├── cuda11/
│   │   └── Dockerfile
│   └── cuda9/
│       └── Dockerfile
├── docs/
│   ├── Makefile
│   ├── make.bat
│   └── source/
│       ├── _static/
│       │   ├── css/
│       │   │   └── container.css
│       │   └── placehoder
│       ├── _templates/
│       │   ├── layout.html
│       │   └── placehoder
│       ├── api.rst
│       ├── books.rst
│       ├── changes.rst
│       ├── conf.py
│       ├── contact.rst
│       ├── contribution.rst
│       ├── copyright.rst
│       ├── features.rst
│       ├── index.rst
│       ├── installation.rst
│       ├── modules.rst
│       ├── setup.rst
│       ├── tutorial.rst
│       ├── tutorials/
│       │   ├── 1-dataset.rst
│       │   ├── 2-descriptor.rst
│       │   ├── 3-visualization.rst
│       │   ├── 4-random_nn_model_and_training.ipynb
│       │   ├── 5-pre-trained_model_library.ipynb
│       │   ├── 6-transfer_learning.ipynb
│       │   └── 7-inverse-design.ipynb
│       ├── xenonpy.contrib.extend_descriptors.descriptor.rst
│       ├── xenonpy.contrib.extend_descriptors.rst
│       ├── xenonpy.contrib.ismd.rst
│       ├── xenonpy.contrib.rst
│       ├── xenonpy.datatools.rst
│       ├── xenonpy.descriptor.rst
│       ├── xenonpy.inverse.iqspr.rst
│       ├── xenonpy.inverse.rst
│       ├── xenonpy.mdl.rst
│       ├── xenonpy.model.nn.rst
│       ├── xenonpy.model.rst
│       ├── xenonpy.model.training.dataset.rst
│       ├── xenonpy.model.training.extension.rst
│       ├── xenonpy.model.training.rst
│       ├── xenonpy.model.utils.rst
│       ├── xenonpy.rst
│       ├── xenonpy.utils.math.rst
│       ├── xenonpy.utils.rst
│       └── xenonpy.visualization.rst
├── hooks/
│   └── build
├── licences/
│   └── .gitkeep
├── mi_book/
│   ├── README.md
│   ├── common_setting.ipynb
│   ├── exercise_11.ipynb
│   ├── exercise_12.ipynb
│   ├── exercise_13.ipynb
│   ├── exercise_14.ipynb
│   ├── exercise_15.ipynb
│   ├── exercise_18.ipynb
│   ├── exercise_19.ipynb
│   ├── exercise_2-10.ipynb
│   ├── exercise_20.ipynb
│   ├── exercise_21.ipynb
│   ├── exercise_22.ipynb
│   ├── output/
│   │   └── .gitkeep
│   ├── retrieve_materials_project.ipynb
│   └── tools.ipynb
├── requirements.txt
├── samples/
│   ├── CSP_with_element_substitution.ipynb
│   ├── calculate_descriptors.ipynb
│   ├── custom_descriptor_calculator.ipynb
│   ├── data/
│   │   └── Dataset_I.csv
│   ├── dataset_and_preset.ipynb
│   ├── iQSPR.ipynb
│   ├── iSMD.ipynb
│   ├── kernel_neural_network.ipynb
│   ├── mp_ids.txt
│   ├── nn_model_build.ipynb
│   ├── pre-trained_model_library.ipynb
│   ├── predict_hypermaterials/
│   │   ├── OTHERS_data.csv
│   │   ├── QC_AC_data.csv
│   │   ├── model_training_and_vitural_screening.ipynb
│   │   ├── tools.ipynb
│   │   └── training_data.csv
│   ├── process_dataset_usgs.ipynb
│   ├── random_nn_model_and_training.ipynb
│   ├── sample_data_building.ipynb
│   ├── set1/
│   │   ├── data1.csv
│   │   ├── data1.msg
│   │   ├── data1.pd.xz
│   │   └── data1.pkl.z
│   ├── set2/
│   │   ├── data2.csv
│   │   ├── data2.msg
│   │   ├── data2.pd.xz
│   │   └── data2.pkl.z
│   ├── tools.ipynb
│   ├── transfer_learning.ipynb
│   └── visualization.ipynb
├── setup.cfg
├── setup.py
├── tests/
│   ├── contrib/
│   │   ├── descriptor/
│   │   │   └── test_mordred.py
│   │   └── ismd/
│   │       ├── test_reactant_pool.py
│   │       └── test_reactor.py
│   ├── datatools/
│   │   ├── ids.txt
│   │   ├── test_dataset.py
│   │   ├── test_preset.py
│   │   ├── test_scaler.py
│   │   └── test_splitter.py
│   ├── descriptor/
│   │   ├── 1.cif
│   │   ├── 2.cif
│   │   ├── test_base_desc.py
│   │   ├── test_crystal_graph.py
│   │   ├── test_elemental.py
│   │   ├── test_fingerprint.py
│   │   ├── test_frozen_feature.py
│   │   └── test_structures.py
│   ├── inverse/
│   │   ├── polymer_test_data.csv
│   │   ├── test_base_inverse.py
│   │   └── test_iqspr.py
│   ├── mdl/
│   │   └── test_mdl.py
│   ├── models/
│   │   ├── test_base_runner.py
│   │   ├── test_checker.py
│   │   ├── test_extension.py
│   │   ├── test_sequential.py
│   │   ├── test_trainer.py
│   │   ├── test_utils.py
│   │   └── test_wrapped.py
│   └── utils/
│       ├── test_gadget.py
│       ├── test_parameter_gen.py
│       └── test_product.py
└── xenonpy/
    ├── __doc__.py
    ├── __init__.py
    ├── __main__.py
    ├── _conf.py
    ├── conf.yml
    ├── contrib/
    │   ├── README.md
    │   ├── __init__.py
    │   ├── extend_descriptors/
    │   │   ├── README.md
    │   │   ├── __init__.py
    │   │   └── descriptor/
    │   │       ├── __init__.py
    │   │       ├── frozen_featurizer_descriptor.py
    │   │       ├── mordred_descriptor.py
    │   │       └── organic_comp_descriptor.py
    │   ├── ismd/
    │   │   ├── README.md
    │   │   ├── __init__.py
    │   │   ├── reactant_pool.py
    │   │   └── reactor.py
    │   └── sample_codes/
    │       ├── Binary_likelihood/
    │       │   └── binary_likelihood.ipynb
    │       ├── Fragment_Ngram/
    │       │   └── Fragment_Ngram.ipynb
    │       ├── README.md
    │       ├── Random_NN_structure/
    │       │   └── randNN_structures.ipynb
    │       ├── combine_fragments/
    │       │   └── combine_fragments.py
    │       └── iQSPR_V/
    │           ├── iQSPR_F.py
    │           ├── iQSPR_V.py
    │           └── iQSPR_VF.py
    ├── datatools/
    │   ├── __init__.py
    │   ├── dataset.py
    │   ├── mp_ids.txt
    │   ├── preset.py
    │   ├── splitter.py
    │   └── transform.py
    ├── descriptor/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── cgcnn.py
    │   ├── compositions.py
    │   ├── fingerprint.py
    │   ├── frozen_featurizer.py
    │   └── structure.py
    ├── inverse/
    │   ├── __init__.py
    │   ├── base.py
    │   └── iqspr/
    │       ├── __init__.py
    │       ├── estimator.py
    │       ├── iqspr.py
    │       ├── iqspr4df.py
    │       └── modifier.py
    ├── mdl/
    │   ├── __init__.py
    │   ├── base.py
    │   ├── descriptor.py
    │   ├── mdl.py
    │   ├── method.py
    │   ├── model.py
    │   ├── modelset.py
    │   └── property.py
    ├── model/
    │   ├── __init__.py
    │   ├── cgcnn.py
    │   ├── extern.py
    │   ├── nn/
    │   │   ├── __init__.py
    │   │   ├── layer.py
    │   │   └── wrap.py
    │   ├── sequential.py
    │   ├── training/
    │   │   ├── __init__.py
    │   │   ├── base.py
    │   │   ├── checker.py
    │   │   ├── clip_grad.py
    │   │   ├── dataset/
    │   │   │   ├── __init__.py
    │   │   │   ├── array.py
    │   │   │   └── cgcnn.py
    │   │   ├── extension/
    │   │   │   ├── __init__.py
    │   │   │   ├── persist.py
    │   │   │   ├── tensor_convert.py
    │   │   │   └── validator.py
    │   │   ├── loss.py
    │   │   ├── lr_scheduler.py
    │   │   ├── optimizer.py
    │   │   └── trainer.py
    │   └── utils/
    │       ├── __init__.py
    │       └── metrics.py
    ├── utils/
    │   ├── __init__.py
    │   ├── math/
    │   │   ├── __init__.py
    │   │   └── product.py
    │   ├── parameter_gen.py
    │   ├── useful_cls.py
    │   └── useful_func.py
    └── visualization/
        ├── __init__.py
        └── heatmap.py
Download .txt
SYMBOL INDEX (980 symbols across 83 files)

FILE: docs/source/conf.py
  function skip (line 202) | def skip(app, what, name, obj, skip, options):
  function setup (line 208) | def setup(app):

FILE: setup.py
  class PackageInfo (line 20) | class PackageInfo(object):
    method __init__ (line 27) | def __init__(self, conf_file):
    method requirements (line 35) | def requirements(filename="requirements.txt"):
    method __getattr__ (line 63) | def __getattr__(self, item: str):

FILE: tests/contrib/descriptor/test_mordred.py
  function data (line 14) | def data():
  function test_mordred_1 (line 37) | def test_mordred_1(data):
  function test_mordred_2 (line 47) | def test_mordred_2(data):
  function test_mordred_3 (line 53) | def test_mordred_3(data):

FILE: tests/contrib/ismd/test_reactant_pool.py
  function test_NotSquareError (line 15) | def test_NotSquareError():
  function test_SimPoolnotmatchError (line 29) | def test_SimPoolnotmatchError():
  function test_ReactantNotInPoolError (line 43) | def test_ReactantNotInPoolError():
  function test_NoSampleError (line 56) | def test_NoSampleError():
  class Reactor (line 70) | class Reactor():
    method __init__ (line 72) | def __init__(self):
    method react (line 80) | def react(self, reactant_list) -> list:
  function test_poolAssignment (line 93) | def test_poolAssignment():
  function test_sampleAssignment (line 102) | def test_sampleAssignment():
  function test_singleProposal (line 127) | def test_singleProposal():
  function test_reactant_id2smiles (line 156) | def test_reactant_id2smiles():
  function test_reactant2product (line 183) | def test_reactant2product():
  function test_proposal (line 205) | def test_proposal():

FILE: tests/contrib/ismd/test_reactor.py
  function test_SMILESInvalidError (line 13) | def test_SMILESInvalidError():

FILE: tests/datatools/test_dataset.py
  function test_data (line 17) | def test_data():
  function test_dataset_1 (line 70) | def test_dataset_1(test_data):
  function test_dataset_2 (line 90) | def test_dataset_2(test_data):
  function test_dataset_3 (line 128) | def test_dataset_3(test_data):
  function test_dataset_4 (line 145) | def test_dataset_4(test_data):

FILE: tests/datatools/test_preset.py
  function setup (line 15) | def setup():
  function test_preset_1 (line 27) | def test_preset_1():
  function test_preset_2 (line 59) | def test_preset_2():
  function test_preset_3 (line 70) | def test_preset_3():
  function test_preset_4 (line 83) | def test_preset_4():

FILE: tests/datatools/test_scaler.py
  function data (line 15) | def data():
  function test_scaler_1 (line 48) | def test_scaler_1(data):
  function test_scaler_2 (line 59) | def test_scaler_2(data):

FILE: tests/datatools/test_splitter.py
  function data (line 14) | def data():
  function test_init_1 (line 34) | def test_init_1():
  function test_roll_1 (line 39) | def test_roll_1():
  function test_split_1 (line 63) | def test_split_1(data):
  function test_split_2 (line 81) | def test_split_2(data):
  function test_split_3 (line 89) | def test_split_3(data):
  function test_split_4 (line 105) | def test_split_4(data):
  function test_cv_1 (line 116) | def test_cv_1(data):
  function test_cv_2 (line 144) | def test_cv_2(data):
  function test_cv_3 (line 167) | def test_cv_3(data):
  function test_cv_4 (line 183) | def test_cv_4(data):
  function test_cv_5 (line 204) | def test_cv_5(data):

FILE: tests/descriptor/test_base_desc.py
  function data (line 15) | def data():
  function test_base_feature_props (line 72) | def test_base_feature_props():
  function test_base_feature_1 (line 105) | def test_base_feature_1(data):
  function test_base_feature_2 (line 117) | def test_base_feature_2(data):
  function test_base_feature_para (line 133) | def test_base_feature_para(data):
  function test_base_feature_3 (line 150) | def test_base_feature_3(data):
  function test_base_feature_4 (line 178) | def test_base_feature_4(data):
  function test_base_descriptor_1 (line 193) | def test_base_descriptor_1(data):
  function test_base_descriptor_2 (line 210) | def test_base_descriptor_2(data):
  function test_base_descriptor_3 (line 226) | def test_base_descriptor_3(data):
  function test_base_descriptor_4 (line 232) | def test_base_descriptor_4(data):
  function test_base_descriptor_5 (line 255) | def test_base_descriptor_5(data):
  function test_base_descriptor_6 (line 268) | def test_base_descriptor_6(data):
  function test_base_descriptor_7 (line 287) | def test_base_descriptor_7(data):
  function test_base_descriptor_8 (line 309) | def test_base_descriptor_8(data):

FILE: tests/descriptor/test_crystal_graph.py
  function data (line 21) | def data():
  function test_crystal_1 (line 41) | def test_crystal_1(data):

FILE: tests/descriptor/test_elemental.py
  function test_compositional_feature_1 (line 13) | def test_compositional_feature_1():
  function test_counting_feature_1 (line 39) | def test_counting_feature_1():
  function test_comp_descriptor_1 (line 58) | def test_comp_descriptor_1():

FILE: tests/descriptor/test_fingerprint.py
  function data (line 14) | def data():
  function test_ecfp_1 (line 37) | def test_ecfp_1(data):
  function test_ecfp_2 (line 45) | def test_ecfp_2(data):
  function test_ecfp_3 (line 53) | def test_ecfp_3(data):
  function test_ecfp_4 (line 58) | def test_ecfp_4(data):
  function test_fcfp_1 (line 70) | def test_fcfp_1(data):
  function test_fcfp_2 (line 78) | def test_fcfp_2(data):
  function test_fcfp_3 (line 86) | def test_fcfp_3(data):
  function test_fcfp_4 (line 91) | def test_fcfp_4(data):
  function test_apfp_1 (line 103) | def test_apfp_1(data):
  function test_apfp_2 (line 111) | def test_apfp_2(data):
  function test_apfp_3 (line 119) | def test_apfp_3(data):
  function test_apfp_4 (line 124) | def test_apfp_4(data):
  function test_rdfp_1 (line 136) | def test_rdfp_1(data):
  function test_rdfp_2 (line 144) | def test_rdfp_2(data):
  function test_rdfp_3 (line 152) | def test_rdfp_3(data):
  function test_rdfp_4 (line 157) | def test_rdfp_4(data):
  function test_maccs_1 (line 169) | def test_maccs_1(data):
  function test_maccs_2 (line 177) | def test_maccs_2(data):
  function test_maccs_3 (line 185) | def test_maccs_3(data):
  function test_maccs4 (line 190) | def test_maccs4(data):
  function test_fps_1 (line 202) | def test_fps_1(data):
  function test_fps_2 (line 210) | def test_fps_2(data):
  function test_fps_3 (line 218) | def test_fps_3(data):
  function test_fps_4 (line 223) | def test_fps_4(data):
  function test_fps_5 (line 236) | def test_fps_5(data):
  function test_fps_6 (line 245) | def test_fps_6(data):

FILE: tests/descriptor/test_frozen_feature.py
  function data (line 18) | def data():
  function test_frozen_featurizer_1 (line 42) | def test_frozen_featurizer_1(data):
  function test_frozen_featurizer_2 (line 60) | def test_frozen_featurizer_2(data):
  function test_frozen_featurizer_3 (line 86) | def test_frozen_featurizer_3(data):
  function test_frozen_featurizer_4 (line 100) | def test_frozen_featurizer_4(data):
  function test_frozen_featurizer_5 (line 114) | def test_frozen_featurizer_5(data):

FILE: tests/descriptor/test_structures.py
  function data (line 15) | def data():
  function test_rdf (line 33) | def test_rdf(data):
  function test_ofm (line 38) | def test_ofm(data):
  function test_structure (line 43) | def test_structure(data):

FILE: tests/inverse/test_base_inverse.py
  function data (line 13) | def data():
  function test_base_loglikelihood_1 (line 48) | def test_base_loglikelihood_1(data):
  function test_base_proposer_1 (line 56) | def test_base_proposer_1(data):
  function test_base_resammple_1 (line 63) | def test_base_resammple_1(data):
  function test_base_smc_1 (line 71) | def test_base_smc_1():
  function test_base_smc_2 (line 84) | def test_base_smc_2(data):
  function test_base_smc_3 (line 100) | def test_base_smc_3(data):
  function test_not_implement (line 113) | def test_not_implement():

FILE: tests/inverse/test_iqspr.py
  function data (line 20) | def data():
  function test_gaussian_ll_1 (line 59) | def test_gaussian_ll_1(data):
  function test_gaussian_ll_2 (line 85) | def test_gaussian_ll_2(data):
  function test_gaussian_ll_3 (line 104) | def test_gaussian_ll_3(data):
  function test_gaussian_ll_4 (line 112) | def test_gaussian_ll_4(data):
  function test_ngram_1 (line 131) | def test_ngram_1(data):
  function test_ngram_2 (line 147) | def test_ngram_2(data):
  function test_ngram_3 (line 170) | def test_ngram_3(data):
  function test_ngram_4 (line 199) | def test_ngram_4():
  function test_ngram_5 (line 217) | def test_ngram_5():
  function test_ngram_6 (line 246) | def test_ngram_6(data):
  function test_iqspr_1 (line 269) | def test_iqspr_1(data):
  function test_iqspr_2 (line 285) | def test_iqspr_2(data):
  function test_iqspr_resample1 (line 304) | def test_iqspr_resample1(data):
  function test_iqspr4df_unique1 (line 348) | def test_iqspr4df_unique1(data):
  function test_df (line 365) | def test_df():
  function test_iqspr4df_two_col (line 370) | def test_iqspr4df_two_col(data, test_df):
  function test_iqspr4df_first_col (line 384) | def test_iqspr4df_first_col(data, test_df):
  function test_iqspr4df_second_col (line 398) | def test_iqspr4df_second_col(data, test_df):

FILE: tests/mdl/test_mdl.py
  function mdl (line 19) | def mdl():
  function test_query_properties (line 31) | def test_query_properties(mdl):
  function test_query_models_1 (line 36) | def test_query_models_1(mdl):
  function test_pull_1 (line 46) | def test_pull_1(mdl):
  function test_return_nothing (line 57) | def test_return_nothing(mdl, monkeypatch):

FILE: tests/models/test_base_runner.py
  function data (line 13) | def data():
  function test_base_runner_1 (line 71) | def test_base_runner_1(data):
  function test_base_runner_2 (line 85) | def test_base_runner_2(data):
  function test_base_runner_3 (line 91) | def test_base_runner_3(data):

FILE: tests/models/test_checker.py
  function setup (line 19) | def setup():
  function test_checker_path (line 46) | def test_checker_path(setup):
  function test_checker_model_1 (line 60) | def test_checker_model_1(setup):
  function test_checker_call (line 92) | def test_checker_call(setup):
  function test_checker_from_cp (line 99) | def test_checker_from_cp(setup):

FILE: tests/models/test_extension.py
  function data (line 25) | def data():
  function test_base_runner_1 (line 64) | def test_base_runner_1():
  function test_tensor_converter_1 (line 79) | def test_tensor_converter_1():
  function test_tensor_converter_2 (line 194) | def test_tensor_converter_2():
  function test_tensor_converter_3 (line 227) | def test_tensor_converter_3():
  function test_validator_1 (line 293) | def test_validator_1():
  function test_validator_2 (line 323) | def test_validator_2():
  function test_persist_1 (line 356) | def test_persist_1(data):
  function test_persist_save_checkpoints (line 394) | def test_persist_save_checkpoints(data):

FILE: tests/models/test_sequential.py
  function data (line 12) | def data():
  function test_layer_1 (line 25) | def test_layer_1(data):
  function test_layer_2 (line 38) | def test_layer_2(data):
  function test_sequential_1 (line 51) | def test_sequential_1(data):
  function test_sequential_2 (line 61) | def test_sequential_2(data):
  function test_sequential_3 (line 79) | def test_sequential_3():
  function test_sequential_4 (line 92) | def test_sequential_4():

FILE: tests/models/test_trainer.py
  class _Net (line 21) | class _Net(torch.nn.Module):
    method __init__ (line 23) | def __init__(self, n_feature, n_hidden, n_output):
    method forward (line 28) | def forward(self, x_):
  function data (line 35) | def data():
  function test_trainer_1 (line 59) | def test_trainer_1(data):
  function test_trainer_2 (line 86) | def test_trainer_2(data):
  function test_trainer_3 (line 114) | def test_trainer_3(data):
  function test_trainer_fit_1 (line 134) | def test_trainer_fit_1(data):
  function test_trainer_fit_2 (line 167) | def test_trainer_fit_2(data):
  function test_trainer_fit_3 (line 183) | def test_trainer_fit_3(data):
  function test_trainer_fit_4 (line 225) | def test_trainer_fit_4(data):
  function test_validator_1 (line 258) | def test_validator_1(data):
  function test_persist_1 (line 272) | def test_persist_1(data):
  function test_trainer_prediction_1 (line 312) | def test_trainer_prediction_1(data):
  function test_trainer_prediction_2 (line 341) | def test_trainer_prediction_2():

FILE: tests/models/test_utils.py
  function data (line 12) | def data():
  function test_regression_metrics_1 (line 27) | def test_regression_metrics_1(data):

FILE: tests/models/test_wrapped.py
  function test_import_loss (line 9) | def test_import_loss():
  function test_import_lr_scheduler (line 16) | def test_import_lr_scheduler():
  function test_import_optimizer (line 22) | def test_import_optimizer():

FILE: tests/utils/test_gadget.py
  function test_camel_to_snake_1 (line 14) | def test_camel_to_snake_1():
  function test_set_env_1 (line 18) | def test_set_env_1():
  function test_set_env_2 (line 25) | def test_set_env_2():
  function test_absolute_path_1 (line 33) | def test_absolute_path_1():
  function test_absolute_path_2 (line 41) | def test_absolute_path_2():
  function test_absolute_path_3 (line 48) | def test_absolute_path_3():
  function test_config_1 (line 56) | def test_config_1():

FILE: tests/utils/test_parameter_gen.py
  function data (line 12) | def data():
  function test_gen_1 (line 31) | def test_gen_1():
  function test_gen_2 (line 46) | def test_gen_2(data):
  function test_gen_3 (line 54) | def test_gen_3(data):
  function test_gen_4 (line 60) | def test_gen_4(data):
  function test_gen_5 (line 69) | def test_gen_5(data):
  function test_gen_6 (line 77) | def test_gen_6(data):
  function test_gen_7 (line 85) | def test_gen_7(data):
  function test_gen_8 (line 91) | def test_gen_8(data):

FILE: tests/utils/test_product.py
  function data (line 14) | def data():
  function test_product_1 (line 31) | def test_product_1(data):
  function test_product_2 (line 46) | def test_product_2(data):
  function test_product_3 (line 51) | def test_product_3(data):
  function test_product_4 (line 60) | def test_product_4(data):
  function test_product_5 (line 71) | def test_product_5(data):

FILE: xenonpy/__init__.py
  function __init (line 10) | def __init(force=False):

FILE: xenonpy/__main__.py
  function migrate (line 14) | def migrate(args_):

FILE: xenonpy/_conf.py
  class __PackageInfo (line 25) | class __PackageInfo(object):
    method __init__ (line 27) | def __init__(self):
    method __getattr__ (line 35) | def __getattr__(self, item):

FILE: xenonpy/contrib/extend_descriptors/descriptor/frozen_featurizer_descriptor.py
  class FrozenFeaturizerDescriptor (line 11) | class FrozenFeaturizerDescriptor(BaseFeaturizer):
    method __init__ (line 13) | def __init__(self, descriptor_calculator: Union[BaseDescriptor, BaseFe...
    method featurize (line 37) | def featurize(self, x, *, depth=1):
    method feature_labels (line 45) | def feature_labels(self):

FILE: xenonpy/contrib/extend_descriptors/descriptor/mordred_descriptor.py
  class Mordred2DDescriptor (line 11) | class Mordred2DDescriptor(BaseFeaturizer):
    method __init__ (line 13) | def __init__(self, *, on_errors='raise', return_type='any'):
    method featurize (line 19) | def featurize(self, x):
    method feature_labels (line 40) | def feature_labels(self):

FILE: xenonpy/contrib/extend_descriptors/descriptor/organic_comp_descriptor.py
  class OrganicCompDescriptor (line 13) | class OrganicCompDescriptor(BaseFeaturizer):
    method __init__ (line 15) | def __init__(self, n_jobs=-1, *, featurizers='all', on_errors='raise',...
    method featurize (line 24) | def featurize(self, x):
    method feature_labels (line 49) | def feature_labels(self):

FILE: xenonpy/contrib/ismd/reactant_pool.py
  class ReactantNotInPoolError (line 11) | class ReactantNotInPoolError(ProposalError):
    method __init__ (line 13) | def __init__(self, r_id):
  class NotSquareError (line 17) | class NotSquareError(ProposalError):
    method __init__ (line 19) | def __init__(self, n_row=0, n_col=0):
  class SimPoolnotmatchError (line 23) | class SimPoolnotmatchError(ProposalError):
    method __init__ (line 25) | def __init__(self, n_pool=0, n_sim=0):
  class NoSampleError (line 31) | class NoSampleError(ProposalError):
    method __init__ (line 33) | def __init__(self):
  class ReactantPool (line 37) | class ReactantPool(BaseProposal):
    method __init__ (line 39) | def __init__(self,
    method single_index2reactant (line 94) | def single_index2reactant(self, reactant) -> str:
    method index2sim (line 111) | def index2sim(self, r_idx_old):
    method single_proposal (line 136) | def single_proposal(self, reactant):
    method proposal (line 157) | def proposal(self, sample_df):

FILE: xenonpy/contrib/ismd/reactor.py
  class SMILESInvalidError (line 22) | class SMILESInvalidError(Exception):
    method __init__ (line 24) | def __init__(self, smi):
  function smi_tokenizer (line 28) | def smi_tokenizer(smi) -> str:
  class Reactor (line 50) | class Reactor():
    method __init__ (line 52) | def __init__(self, model: Translator):
    method react (line 63) | def react(self, reactant_list, *, batch_size=64) -> list:
  function load_reactor (line 87) | def load_reactor(max_length=200, *, device_id=-1, model_path='') -> Reac...

FILE: xenonpy/contrib/sample_codes/combine_fragments/combine_fragments.py
  function combine_fragments (line 9) | def combine_fragments(smis_base, smis_frag):

FILE: xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_F.py
  class IQSPR_F (line 14) | class IQSPR_F(BaseSMC):
    method __init__ (line 16) | def __init__(self, *, estimator, modifier):
    method resample (line 29) | def resample(self, sims, size, p):
    method modifier (line 33) | def modifier(self):
    method modifier (line 37) | def modifier(self, value):
    method estimator (line 41) | def estimator(self):
    method estimator (line 45) | def estimator(self, value):
    method fragmenting (line 48) | def fragmenting(self, smis):
    method combine_fragments (line 58) | def combine_fragments(self, smis_base, smis_frag):
    method __call__ (line 129) | def __call__(self, samples, beta, *, size=None, p_frag=0.1, yield_lpf=...

FILE: xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_V.py
  class IQSPR_V (line 12) | class IQSPR_V(BaseSMC):
    method __init__ (line 14) | def __init__(self, *, estimator, modifier):
    method resample (line 27) | def resample(self, sims, size, p):
    method modifier (line 31) | def modifier(self):
    method modifier (line 35) | def modifier(self, value):
    method estimator (line 39) | def estimator(self):
    method estimator (line 43) | def estimator(self, value):
    method __call__ (line 46) | def __call__(self, reservoir, beta, size=100, *, samples=None, ratio=0...

FILE: xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_VF.py
  class IQSPR_VF (line 14) | class IQSPR_VF(BaseSMC):
    method __init__ (line 16) | def __init__(self, *, estimator, modifier):
    method resample (line 29) | def resample(self, sims, size, p):
    method modifier (line 33) | def modifier(self):
    method modifier (line 37) | def modifier(self, value):
    method estimator (line 41) | def estimator(self):
    method estimator (line 45) | def estimator(self, value):
    method fragmenting (line 48) | def fragmenting(self, smis):
    method combine_fragments (line 58) | def combine_fragments(self, smis_base, smis_frag):
    method __call__ (line 129) | def __call__(self, reservoir, beta, size=100, *, samples=None, ratio=0...

FILE: xenonpy/datatools/dataset.py
  class Dataset (line 18) | class Dataset(object):
    method __init__ (line 27) | def __init__(self, *paths, backend='pandas', prefix=None):
    method _make_index (line 42) | def _make_index(self, *, prefix):
    method to (line 78) | def to(cls, obj, path, *, force_pkl=False):
    method from_http (line 86) | def from_http(cls, url, save_to, *, filename=None, chunk_size=256 * 10...
    method __repr__ (line 135) | def __repr__(self):
    method csv (line 144) | def csv(self):
    method pandas (line 148) | def pandas(self):
    method pickle (line 152) | def pickle(self):
    method excel (line 156) | def excel(self):
    method __call__ (line 159) | def __call__(self, *args, **kwargs):
    method __getattr__ (line 162) | def __getattr__(self, name):

FILE: xenonpy/datatools/preset.py
  class Preset (line 22) | class Preset(Dataset, metaclass=Singleton):
    method __init__ (line 53) | def __init__(self):
    method sync (line 68) | def sync(self, data, to=None):
    method build (line 113) | def build(self, *keys, save_to=None, **kwargs):
    method _check (line 186) | def _check(self, data):
    method elements (line 217) | def elements(self):
    method atom_init (line 238) | def atom_init(self):
    method elements_completed (line 248) | def elements_completed(self):

FILE: xenonpy/datatools/splitter.py
  class Splitter (line 17) | class Splitter(BaseEstimator):
    method __init__ (line 22) | def __init__(self,
    method size (line 67) | def size(self):
    method shuffle (line 71) | def shuffle(self):
    method test_size (line 75) | def test_size(self):
    method k_fold (line 79) | def k_fold(self):
    method random_state (line 83) | def random_state(self):
    method roll (line 86) | def roll(self, random_state: int = None):
    method _check_input (line 117) | def _check_input(self, array):
    method _split (line 131) | def _split(array, *idx):
    method cv (line 140) | def cv(self, *arrays, less_for_train=False):
    method split (line 189) | def split(self, *arrays: Union[np.ndarray, pd.DataFrame, pd.Series]):

FILE: xenonpy/datatools/transform.py
  class PowerTransformer (line 17) | class PowerTransformer(BaseEstimator, TransformerMixin):
    method __init__ (line 26) | def __init__(self,
    method _check_type (line 65) | def _check_type(self, x):
    method fit (line 78) | def fit(self, x):
    method transform (line 115) | def transform(self, x):
    method inverse_transform (line 121) | def inverse_transform(self, x):
  class Scaler (line 128) | class Scaler(BaseEstimator, TransformerMixin):
    method __init__ (line 134) | def __init__(self):
    method power_transformer (line 144) | def power_transformer(self, *args, **kwargs):
    method box_cox (line 147) | def box_cox(self, *args, **kwargs):
    method yeo_johnson (line 150) | def yeo_johnson(self, *args, **kwargs):
    method min_max (line 153) | def min_max(self, *args, **kwargs):
    method standard (line 156) | def standard(self, *args, **kwargs):
    method log (line 159) | def log(self):
    method _scale (line 162) | def _scale(self, scaler, *args, **kwargs):
    method fit (line 166) | def fit(self, x):
    method fit_transform (line 182) | def fit_transform(self, x, y=None, **fit_params):
    method transform (line 194) | def transform(self, x):
    method inverse_transform (line 212) | def inverse_transform(self, x):
    method reset (line 220) | def reset(self):

FILE: xenonpy/descriptor/base.py
  class BaseFeaturizer (line 23) | class BaseFeaturizer(BaseEstimator, TransformerMixin, metaclass=ABCMeta):
    method __init__ (line 88) | def __init__(
    method return_type (line 136) | def return_type(self):
    method return_type (line 140) | def return_type(self, val):
    method on_errors (line 146) | def on_errors(self):
    method on_errors (line 150) | def on_errors(self, val):
    method parallel_verbose (line 156) | def parallel_verbose(self):
    method parallel_verbose (line 160) | def parallel_verbose(self, val):
    method n_jobs (line 166) | def n_jobs(self):
    method n_jobs (line 170) | def n_jobs(self, n_jobs):
    method fit (line 179) | def fit(self, X, y=None, **fit_kwargs):
    method fit_transform (line 189) | def fit_transform(self, X, y=None, **fit_params):
    method transform (line 218) | def transform(self, entries: Sequence, *, return_type=None, target_col...
    method _wrapper (line 318) | def _wrapper(self, x):
    method featurize (line 342) | def featurize(self, *x, **kwargs):
    method feature_labels (line 360) | def feature_labels(self):
    method citations (line 368) | def citations(self):
    method authors (line 378) | def authors(self):
  class BaseDescriptor (line 391) | class BaseDescriptor(BaseEstimator, TransformerMixin, metaclass=TimedMet...
    method __init__ (line 415) | def __init__(self, *, featurizers: Union[List[str], str] = 'all', on_e...
    method on_errors (line 436) | def on_errors(self):
    method on_errors (line 440) | def on_errors(self, val):
    method featurizers (line 449) | def featurizers(self):
    method featurizers (line 453) | def featurizers(self, val):
    method elapsed (line 465) | def elapsed(self):
    method __setattr__ (line 468) | def __setattr__(self, key, value):
    method __repr__ (line 482) | def __repr__(self):
    method _check_input (line 488) | def _check_input(self, X, y=None, **kwargs):
    method _rename (line 525) | def _rename(self, **fit_params):
    method all_featurizers (line 531) | def all_featurizers(self):
    method fit (line 534) | def fit(self, X, y=None, **kwargs):
    method transform (line 565) | def transform(self, X, **kwargs):
    method feature_labels (line 601) | def feature_labels(self):
  class BaseCompositionFeaturizer (line 620) | class BaseCompositionFeaturizer(BaseFeaturizer, metaclass=ABCMeta):
    method __init__ (line 622) | def __init__(self,
    method featurize (line 642) | def featurize(self, comp):
    method mix_function (line 652) | def mix_function(self, elems, nums):

FILE: xenonpy/descriptor/cgcnn.py
  class CrystalGraphFeaturizer (line 17) | class CrystalGraphFeaturizer(BaseFeaturizer):
    method __init__ (line 19) | def __init__(self, *, max_num_nbr=12, radius=8, atom_feature='origin',...
    method _atom_feature (line 54) | def _atom_feature(self, atom_symbol: str):
    method edge_features (line 64) | def edge_features(self, structure: Structure, **kwargs):
    method node_features (line 109) | def node_features(self, structure: Structure):
    method featurize (line 113) | def featurize(self, structure: Structure):
    method feature_labels (line 117) | def feature_labels(self):

FILE: xenonpy/descriptor/compositions.py
  class Counting (line 18) | class Counting(BaseCompositionFeaturizer):
    method __init__ (line 20) | def __init__(self,
    method mix_function (line 64) | def mix_function(self, elems, nums):
    method feature_labels (line 75) | def feature_labels(self):
  class WeightedAverage (line 79) | class WeightedAverage(BaseCompositionFeaturizer):
    method mix_function (line 110) | def mix_function(self, elems, nums):
    method feature_labels (line 116) | def feature_labels(self):
  class WeightedSum (line 120) | class WeightedSum(BaseCompositionFeaturizer):
    method mix_function (line 151) | def mix_function(self, elems, nums):
    method feature_labels (line 157) | def feature_labels(self):
  class GeometricMean (line 161) | class GeometricMean(BaseCompositionFeaturizer):
    method mix_function (line 192) | def mix_function(self, elems, nums):
    method feature_labels (line 199) | def feature_labels(self):
  class HarmonicMean (line 203) | class HarmonicMean(BaseCompositionFeaturizer):
    method mix_function (line 234) | def mix_function(self, elems, nums):
    method feature_labels (line 242) | def feature_labels(self):
  class WeightedVariance (line 246) | class WeightedVariance(BaseCompositionFeaturizer):
    method mix_function (line 277) | def mix_function(self, elems, nums):
    method feature_labels (line 285) | def feature_labels(self):
  class MaxPooling (line 289) | class MaxPooling(BaseCompositionFeaturizer):
    method mix_function (line 320) | def mix_function(self, elems, _):
    method feature_labels (line 325) | def feature_labels(self):
  class MinPooling (line 329) | class MinPooling(BaseCompositionFeaturizer):
    method mix_function (line 360) | def mix_function(self, elems, _):
    method feature_labels (line 365) | def feature_labels(self):
  class Compositions (line 369) | class Compositions(BaseDescriptor):
    method __init__ (line 376) | def __init__(self,

FILE: xenonpy/descriptor/fingerprint.py
  function count_fp (line 22) | def count_fp(fp, dim=2**10):
  class RDKitFP (line 28) | class RDKitFP(BaseFeaturizer):
    method __init__ (line 30) | def __init__(self, n_jobs=-1, *, n_bits=2048, bit_per_entry=None, coun...
    method featurize (line 76) | def featurize(self, x):
    method feature_labels (line 95) | def feature_labels(self):
  class AtomPairFP (line 102) | class AtomPairFP(BaseFeaturizer):
    method __init__ (line 104) | def __init__(self, n_jobs=-1, *, n_bits=2048, bit_per_entry=None, coun...
    method featurize (line 155) | def featurize(self, x):
    method feature_labels (line 174) | def feature_labels(self):
  class TopologicalTorsionFP (line 181) | class TopologicalTorsionFP(BaseFeaturizer):
    method __init__ (line 183) | def __init__(self, n_jobs=-1, *, n_bits=2048, bit_per_entry=None, coun...
    method featurize (line 231) | def featurize(self, x):
    method feature_labels (line 250) | def feature_labels(self):
  class MACCS (line 257) | class MACCS(BaseFeaturizer):
    method __init__ (line 259) | def __init__(self, n_jobs=-1,
    method featurize (line 293) | def featurize(self, x):
    method feature_labels (line 308) | def feature_labels(self):
  class FCFP (line 312) | class FCFP(BaseFeaturizer):
    method __init__ (line 314) | def __init__(self, n_jobs=-1, *, radius=3, n_bits=2048, counting=False,
    method featurize (line 360) | def featurize(self, x):
    method feature_labels (line 380) | def feature_labels(self):
  class ECFP (line 387) | class ECFP(BaseFeaturizer):
    method __init__ (line 389) | def __init__(self, n_jobs=-1, *, radius=3, n_bits=2048, counting=False,
    method featurize (line 435) | def featurize(self, x):
    method feature_labels (line 454) | def feature_labels(self):
  class PatternFP (line 461) | class PatternFP(BaseFeaturizer):
    method __init__ (line 463) | def __init__(self, n_jobs=-1, *, n_bits=2048,
    method featurize (line 499) | def featurize(self, x):
    method feature_labels (line 514) | def feature_labels(self):
  class LayeredFP (line 518) | class LayeredFP(BaseFeaturizer):
    method __init__ (line 520) | def __init__(self, n_jobs=-1, *, n_bits=2048,
    method featurize (line 556) | def featurize(self, x):
    method feature_labels (line 571) | def feature_labels(self):
  class MHFP (line 575) | class MHFP(BaseFeaturizer):
    method __init__ (line 577) | def __init__(self, n_jobs=1, *, radius=3, n_bits=2048,
    method featurize (line 625) | def featurize(self, x):
    method feature_labels (line 640) | def feature_labels(self):
  class DescriptorFeature (line 644) | class DescriptorFeature(BaseFeaturizer):
    method __init__ (line 677) | def __init__(self, n_jobs=-1,
    method featurize (line 727) | def featurize(self, x):
    method feature_labels (line 750) | def feature_labels(self):
  class Fingerprints (line 754) | class Fingerprints(BaseDescriptor):
    method __init__ (line 760) | def __init__(self,

FILE: xenonpy/descriptor/frozen_featurizer.py
  class FrozenFeaturizer (line 17) | class FrozenFeaturizer(BaseFeaturizer):
    method __init__ (line 22) | def __init__(self, model: torch.nn.Module = None, *,
    method featurize (line 64) | def featurize(self, descriptor, *, depth=None, n_layer=None):
    method feature_labels (line 124) | def feature_labels(self):

FILE: xenonpy/descriptor/structure.py
  class RadialDistributionFunction (line 16) | class RadialDistributionFunction(BaseFeaturizer):
    method feature_labels (line 23) | def feature_labels(self):
    method __init__ (line 26) | def __init__(self, n_bins=201, r_max=20.0, *, n_jobs=-1, on_errors='ra...
    method featurize (line 66) | def featurize(self, structure):
  class OrbitalFieldMatrix (line 92) | class OrbitalFieldMatrix(BaseFeaturizer):
    method __init__ (line 105) | def __init__(self, including_d=True, *, n_jobs=-1, on_errors='raise', ...
    method get_element_representation (line 159) | def get_element_representation(name):
    method featurize (line 222) | def featurize(self, structure, is_including_d=True):
    method feature_labels (line 261) | def feature_labels(self):
  class Structures (line 270) | class Structures(BaseDescriptor):
    method __init__ (line 275) | def __init__(self,

FILE: xenonpy/inverse/base.py
  class LogLikelihoodError (line 17) | class LogLikelihoodError(Exception):
  class ResampleError (line 22) | class ResampleError(Exception):
  class ProposalError (line 27) | class ProposalError(Exception):
  class SMCError (line 32) | class SMCError(Exception):
  class BaseLogLikelihood (line 37) | class BaseLogLikelihood(BaseEstimator, metaclass=TimedMetaClass):
    method fit (line 51) | def fit(self, X, y, **kwargs):
    method __call__ (line 54) | def __call__(self, X, **targets):
    method log_likelihood (line 57) | def log_likelihood(self, X, **targets):
  class BaseLogLikelihoodSet (line 80) | class BaseLogLikelihoodSet(BaseEstimator, metaclass=TimedMetaClass):
    method __init__ (line 99) | def __init__(self, *, loglikelihoods='all'):
    method elapsed (line 113) | def elapsed(self):
    method __setattr__ (line 116) | def __setattr__(self, key, value):
    method all_loglikelihoods (line 131) | def all_loglikelihoods(self):
    method _check_input (line 134) | def _check_input(self, X, y=None, **kwargs):
    method __call__ (line 170) | def __call__(self, X, **kwargs):
    method log_likelihood (line 173) | def log_likelihood(self, X, **kwargs):
  class BaseResample (line 237) | class BaseResample(BaseEstimator, metaclass=TimedMetaClass):
    method fit (line 250) | def fit(self, X, y=None, **kwargs):
    method __call__ (line 253) | def __call__(self, X, freq, size, p):
    method resample (line 256) | def resample(self, X, freq, size, p):
  class BaseProposal (line 280) | class BaseProposal(BaseEstimator, metaclass=TimedMetaClass):
    method fit (line 281) | def fit(self, X, y, **kwargs):
    method __call__ (line 284) | def __call__(self, X):
    method on_errors (line 287) | def on_errors(self, error):
    method proposal (line 290) | def proposal(self, X):
  class BaseSMC (line 307) | class BaseSMC(BaseEstimator, metaclass=TimedMetaClass):
    method log_likelihood (line 331) | def log_likelihood(self, X):
    method resample (line 352) | def resample(self, X, freq, size, p):
    method proposal (line 379) | def proposal(self, X):
    method on_errors (line 399) | def on_errors(self, ite, samples, error):
    method unique (line 402) | def unique(self, X):
    method __setattr__ (line 420) | def __setattr__(self, key, value):
    method __call__ (line 430) | def __call__(self, samples, beta, *, size=None, yield_lpf=False):

FILE: xenonpy/inverse/iqspr/estimator.py
  class GaussianLogLikelihood (line 19) | class GaussianLogLikelihood(BaseLogLikelihood):
    method __init__ (line 20) | def __init__(self, descriptor: Union[BaseFeaturizer, BaseDescriptor], ...
    method __getitem__ (line 50) | def __getitem__(self, item):
    method __setitem__ (line 53) | def __setitem__(self, key, value):
    method update_targets (line 58) | def update_targets(self, *, reset=False, **targets):
    method remove_estimator (line 78) | def remove_estimator(self, *properties: str):
    method predict (line 95) | def predict(self, smiles, **kwargs):
    method fit (line 109) | def fit(self, smiles, y=None, *, X_scaler=None, y_scaler=None, **kwargs):
    method log_likelihood (line 153) | def log_likelihood(self, smis, *, log_0=-1000.0, **targets):

FILE: xenonpy/inverse/iqspr/iqspr.py
  class IQSPR (line 12) | class IQSPR(BaseSMC):
    method __init__ (line 14) | def __init__(self, *, estimator, modifier, r_ESS=1):
    method resample (line 35) | def resample(self, sims, freq, size, p):
    method modifier (line 42) | def modifier(self):
    method modifier (line 46) | def modifier(self, value):
    method estimator (line 50) | def estimator(self):
    method estimator (line 54) | def estimator(self, value):

FILE: xenonpy/inverse/iqspr/iqspr4df.py
  class IQSPR4DF (line 12) | class IQSPR4DF(BaseSMC):
    method __init__ (line 14) | def __init__(self, *, estimator, modifier, r_ESS=1, sample_col=None):
    method resample (line 44) | def resample(self, sims, freq, size, p):
    method unique (line 50) | def unique(self, x):
    method modifier (line 81) | def modifier(self):
    method modifier (line 85) | def modifier(self, value):
    method estimator (line 89) | def estimator(self):
    method estimator (line 93) | def estimator(self, value):

FILE: xenonpy/inverse/iqspr/modifier.py
  class GetProbError (line 17) | class GetProbError(ProposalError):
    method __init__ (line 19) | def __init__(self, tmp_str, i_b, i_r):
  class MolConvertError (line 28) | class MolConvertError(ProposalError):
    method __init__ (line 30) | def __init__(self, new_smi):
  class NGramTrainingError (line 37) | class NGramTrainingError(ProposalError):
    method __init__ (line 39) | def __init__(self, error, smi):
  class NGram (line 46) | class NGram(BaseProposal):
    method __init__ (line 48) | def __init__(self,
    method sample_order (line 95) | def sample_order(self):
    method sample_order (line 99) | def sample_order(self, val):
    method reorder_prob (line 115) | def reorder_prob(self):
    method reorder_prob (line 119) | def reorder_prob(self, val):
    method min_len (line 126) | def min_len(self):
    method min_len (line 130) | def min_len(self, val):
    method max_len (line 137) | def max_len(self):
    method max_len (line 141) | def max_len(self, val):
    method del_range (line 148) | def del_range(self):
    method del_range (line 152) | def del_range(self, val):
    method _fit_sample_order (line 164) | def _fit_sample_order(self):
    method _fit_min_len (line 185) | def _fit_min_len(self):
    method on_errors (line 193) | def on_errors(self, error):
    method ngram_table (line 212) | def ngram_table(self):
    method ngram_table (line 216) | def ngram_table(self, value):
    method modify (line 219) | def modify(self, ext_smi):
    method smi2list (line 249) | def smi2list(cls, smiles):
    method smi2esmi (line 271) | def smi2esmi(cls, smi):
    method esmi2smi (line 324) | def esmi2smi(cls, ext_smi):
    method remove_table (line 348) | def remove_table(self, max_order=None):
    method fit (line 368) | def fit(self, smiles, *, train_order=(1, 10)):
    method get_prob (line 459) | def get_prob(self, tmp_str, iB, iR):
    method sample_next_char (line 478) | def sample_next_char(self, ext_smi):
    method add_char (line 489) | def add_char(cls, ext_smi, next_char):
    method del_char (line 519) | def del_char(cls, ext_smi, n_char):
    method reorder_esmi (line 528) | def reorder_esmi(cls, ext_smi):
    method validator (line 537) | def validator(self, ext_smi):
    method proposal (line 581) | def proposal(self, smiles):
    method _merge_table (line 617) | def _merge_table(self, ngram_tab, weight=1):
    method merge_table (line 675) | def merge_table(self, *ngram_tab: 'NGram', weight=1, overwrite=True):
    method split_table (line 717) | def split_table(self, cut_order):

FILE: xenonpy/mdl/base.py
  class BaseQuery (line 18) | class BaseQuery(BaseEstimator, metaclass=TimedMetaClass):
    method __init__ (line 21) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key', ...
    method api_key (line 32) | def api_key(self):
    method endpoint (line 36) | def endpoint(self):
    method variables (line 40) | def variables(self):
    method results (line 44) | def results(self):
    method gql (line 47) | def gql(self, *query_vars: str):
    method _post (line 51) | def _post(ret, return_json):
    method check_query_vars (line 60) | def check_query_vars(self, *query_vars: str):
    method __call__ (line 66) | def __call__(self, *querying_vars, file=None, return_json=None):
    method __repr__ (line 120) | def __repr__(self, N_CHAR_MAX=700):

FILE: xenonpy/mdl/descriptor.py
  class QueryDescriptorsWith (line 8) | class QueryDescriptorsWith(BaseQuery):
    method __init__ (line 15) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 27) | def gql(self, *query_vars: str):
  class QueryDescriptors (line 45) | class QueryDescriptors(BaseQuery):
    method __init__ (line 52) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 64) | def gql(self, *query_vars: str):
  class GetDescriptorDetail (line 74) | class GetDescriptorDetail(BaseQuery):
    method __init__ (line 82) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 95) | def gql(self, *query_vars: str):
  class ListDescriptors (line 105) | class ListDescriptors(BaseQuery):
    method __init__ (line 112) | def __init__(self, *, api_key: str = 'anonymous.user.key',
    method gql (line 124) | def gql(self, *query_vars: str):
  class CreateDescriptor (line 134) | class CreateDescriptor(BaseQuery):
    method __init__ (line 141) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 154) | def gql(self, *query_vars: str):
  class UpdateDescriptor (line 164) | class UpdateDescriptor(BaseQuery):
    method __init__ (line 171) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 184) | def gql(self, *query_vars: str):

FILE: xenonpy/mdl/mdl.py
  class GetVersion (line 39) | class GetVersion(BaseQuery):
    method __init__ (line 42) | def __init__(self, *, api_key: str = 'anonymous.user.key',
    method gql (line 55) | def gql(self, *query_vars: str):
  class MDL (line 63) | class MDL(BaseEstimator, metaclass=TimedMetaClass):
    method __init__ (line 64) | def __init__(self, *, api_key: str = 'anonymous.user.key', endpoint: s...
    method endpoint (line 79) | def endpoint(self):
    method endpoint (line 83) | def endpoint(self, e):
    method api_key (line 87) | def api_key(self):
    method api_key (line 91) | def api_key(self, k):
    method version (line 96) | def version(self):
    method __call__ (line 99) | def __call__(self, *query: str,
    method upload_model (line 166) | def upload_model(self, *,
    method get_training_info (line 201) | def get_training_info(self, model_id: int) -> GetTrainingInfo:
    method get_training_env (line 218) | def get_training_env(self, model_id: int) -> GetTrainingEnv:
    method get_supplementary (line 234) | def get_supplementary(self, *, model_id: int) -> GetSupplementary:
    method get_model_urls (line 252) | def get_model_urls(self, *model_ids: int) -> Union[GetModelUrl, GetMod...
    method get_model_detail (line 273) | def get_model_detail(self, model_id: int) -> GetModelDetail:
    method get_model_details (line 289) | def get_model_details(self, model_ids: List[int]) -> GetModelDetails:
    method list_models_with_property (line 305) | def list_models_with_property(self, name: str) -> ListModelsWithProperty:
    method list_models_with_modelset (line 321) | def list_models_with_modelset(self, name: str) -> ListModelsWithModelset:
    method list_models_with_method (line 337) | def list_models_with_method(self, name: str) -> ListModelsWithMethod:
    method list_models_with_descriptor (line 353) | def list_models_with_descriptor(self, name: str) -> ListModelsWithDesc...
    method query_modelsets (line 369) | def query_modelsets(self, query: str = None, *,
    method update_modelset (line 421) | def update_modelset(self, *,
    method create_modelset (line 460) | def create_modelset(self, *,
    method list_modelsets (line 494) | def list_modelsets(self) -> ListModelsets:
    method get_modelset_detail (line 505) | def get_modelset_detail(self, modelset_id: int) -> GetModelsetDetail:
    method query_descriptors (line 520) | def query_descriptors(self, query: str = None, *,
    method update_descriptor (line 559) | def update_descriptor(self, *,
    method create_descriptor (line 590) | def create_descriptor(self, *,
    method list_descriptors (line 619) | def list_descriptors(self) -> ListDescriptors:
    method get_descriptor_detail (line 630) | def get_descriptor_detail(self, name: str) -> GetDescriptorDetail:
    method query_methods (line 645) | def query_methods(self, query: str = None, *,
    method update_method (line 684) | def update_method(self, *,
    method create_method (line 715) | def create_method(self, *,
    method list_methods (line 744) | def list_methods(self) -> ListMethods:
    method get_method_detail (line 755) | def get_method_detail(self, name: str) -> GetMethodDetail:
    method query_properties (line 770) | def query_properties(self, query: str = None, *,
    method update_property (line 817) | def update_property(self, *,
    method create_property (line 853) | def create_property(self, *,
    method list_properties (line 888) | def list_properties(self) -> ListProperties:
    method get_property_detail (line 899) | def get_property_detail(self, name: str):
    method pull (line 914) | def pull(self, *model_ids: Union[int, pd.Series, pd.DataFrame],

FILE: xenonpy/mdl/method.py
  class QueryMethodsWith (line 8) | class QueryMethodsWith(BaseQuery):
    method __init__ (line 15) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 27) | def gql(self, *query_vars: str):
  class QueryMethods (line 45) | class QueryMethods(BaseQuery):
    method __init__ (line 52) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 64) | def gql(self, *query_vars: str):
  class GetMethodDetail (line 74) | class GetMethodDetail(BaseQuery):
    method __init__ (line 82) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 95) | def gql(self, *query_vars: str):
  class ListMethods (line 105) | class ListMethods(BaseQuery):
    method __init__ (line 112) | def __init__(self, *, api_key: str = 'anonymous.user.key',
    method gql (line 124) | def gql(self, *query_vars: str):
  class CreateMethod (line 134) | class CreateMethod(BaseQuery):
    method __init__ (line 141) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 154) | def gql(self, *query_vars: str):
  class UpdateMethod (line 164) | class UpdateMethod(BaseQuery):
    method __init__ (line 171) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 184) | def gql(self, *query_vars: str):

FILE: xenonpy/mdl/model.py
  class QueryModelDetailsWith (line 10) | class QueryModelDetailsWith(BaseQuery):
    method __init__ (line 50) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 62) | def gql(self, *query_vars: str):
  class QueryModelDetails (line 110) | class QueryModelDetails(BaseQuery):
    method __init__ (line 149) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 161) | def gql(self, *query_vars: str):
  class GetModelUrls (line 188) | class GetModelUrls(BaseQuery):
    method __init__ (line 195) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 207) | def gql(self, *query_vars: str):
  class GetModelUrl (line 217) | class GetModelUrl(BaseQuery):
    method __init__ (line 224) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 236) | def gql(self, *query_vars: str):
  class GetModelDetails (line 246) | class GetModelDetails(BaseQuery):
    method __init__ (line 285) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 297) | def gql(self, *query_vars: str):
  class GetModelDetail (line 323) | class GetModelDetail(BaseQuery):
    method __init__ (line 362) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 374) | def gql(self, *query_vars: str):
  class GetTrainingInfo (line 400) | class GetTrainingInfo(BaseQuery):
    method __init__ (line 403) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method _post (line 416) | def _post(ret, return_json):
    method gql (line 419) | def gql(self, *query_vars: str):
  class GetTrainingEnv (line 427) | class GetTrainingEnv(BaseQuery):
    method __init__ (line 430) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 443) | def gql(self, *query_vars: str):
  class GetSupplementary (line 451) | class GetSupplementary(BaseQuery):
    method __init__ (line 454) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 467) | def gql(self, *query_vars: str):
  class ListModelsWithProperty (line 475) | class ListModelsWithProperty(BaseQuery):
    method __init__ (line 489) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 501) | def gql(self, *query_vars: str):
  class ListModelsWithModelset (line 511) | class ListModelsWithModelset(BaseQuery):
    method __init__ (line 525) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 537) | def gql(self, *query_vars: str):
  class ListModelsWithMethod (line 547) | class ListModelsWithMethod(BaseQuery):
    method __init__ (line 561) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 573) | def gql(self, *query_vars: str):
  class ListModelsWithDescriptor (line 583) | class ListModelsWithDescriptor(BaseQuery):
    method __init__ (line 597) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 609) | def gql(self, *query_vars: str):
  class UploadModel (line 619) | class UploadModel(BaseQuery):
    method __init__ (line 626) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 638) | def gql(self, *query_vars: str):

FILE: xenonpy/mdl/modelset.py
  class QueryModelsetsWith (line 8) | class QueryModelsetsWith(BaseQuery):
    method __init__ (line 17) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 29) | def gql(self, *query_vars: str):
  class QueryModelsets (line 51) | class QueryModelsets(BaseQuery):
    method __init__ (line 60) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 72) | def gql(self, *query_vars: str):
  class GetModelsetDetail (line 82) | class GetModelsetDetail(BaseQuery):
    method __init__ (line 96) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 109) | def gql(self, *query_vars: str):
  class ListModelsets (line 119) | class ListModelsets(BaseQuery):
    method __init__ (line 128) | def __init__(self, *, api_key: str = 'anonymous.user.key',
    method gql (line 140) | def gql(self, *query_vars: str):
  class CreateModelset (line 150) | class CreateModelset(BaseQuery):
    method __init__ (line 159) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 172) | def gql(self, *query_vars: str):
  class UpdateModelset (line 182) | class UpdateModelset(BaseQuery):
    method __init__ (line 191) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 204) | def gql(self, *query_vars: str):

FILE: xenonpy/mdl/property.py
  class QueryPropertiesWith (line 8) | class QueryPropertiesWith(BaseQuery):
    method __init__ (line 17) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 29) | def gql(self, *query_vars: str):
  class QueryProperties (line 51) | class QueryProperties(BaseQuery):
    method __init__ (line 60) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 72) | def gql(self, *query_vars: str):
  class GetPropertyDetail (line 82) | class GetPropertyDetail(BaseQuery):
    method __init__ (line 92) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 105) | def gql(self, *query_vars: str):
  class ListProperties (line 115) | class ListProperties(BaseQuery):
    method __init__ (line 124) | def __init__(self, *, api_key: str = 'anonymous.user.key',
    method gql (line 136) | def gql(self, *query_vars: str):
  class CreateProperty (line 146) | class CreateProperty(BaseQuery):
    method __init__ (line 155) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 168) | def gql(self, *query_vars: str):
  class UpdateProperty (line 178) | class UpdateProperty(BaseQuery):
    method __init__ (line 187) | def __init__(self, variables, *, api_key: str = 'anonymous.user.key',
    method gql (line 200) | def gql(self, *query_vars: str):

FILE: xenonpy/model/cgcnn.py
  class ConvLayer (line 11) | class ConvLayer(nn.Module):
    method __init__ (line 16) | def __init__(self, atom_fea_len, nbr_fea_len):
    method forward (line 38) | def forward(self, atom_in_fea, nbr_fea, nbr_fea_idx):
  class CrystalGraphConvNet (line 81) | class CrystalGraphConvNet(nn.Module):
    method __init__ (line 92) | def __init__(self,
    method forward (line 137) | def forward(self, atom_fea, nbr_fea, nbr_fea_idx, crystal_atom_idx):
    method pooling (line 181) | def pooling(atom_fea, crystal_atom_idx):

FILE: xenonpy/model/nn/layer.py
  class Layer1d (line 12) | class Layer1d(nn.Module):
    method __init__ (line 18) | def __init__(self, n_in, n_out, *,
    method forward (line 46) | def forward(self, *x):

FILE: xenonpy/model/nn/wrap.py
  class Optim (line 12) | class Optim(object):
    method sgd (line 14) | def sgd(*args, **kwargs):
    method ada_delta (line 22) | def ada_delta(*args, **kwargs):
    method ada_grad (line 30) | def ada_grad(*args, **kwargs):
    method adam (line 38) | def adam(*args, **kwargs):
    method sparse_adam (line 46) | def sparse_adam(*args, **kwargs):
    method ada_max (line 54) | def ada_max(*args, **kwargs):
    method asgd (line 62) | def asgd(*args, **kwargs):
    method lbfgs (line 70) | def lbfgs(*args, **kwargs):
    method rms_prop (line 78) | def rms_prop(*args, **kwargs):
    method r_prop (line 86) | def r_prop(*args, **kwargs):
  class LrScheduler (line 94) | class LrScheduler(object):
    method lambda_lr (line 96) | def lambda_lr(*args, **kwargs):
    method step_lr (line 104) | def step_lr(*args, **kwargs):
    method multi_step_lr (line 112) | def multi_step_lr(*args, **kwargs):
    method exponential_lr (line 120) | def exponential_lr(*args, **kwargs):
    method reduce_lr_on_plateau (line 128) | def reduce_lr_on_plateau(*args, **kwargs):
  class Init (line 136) | class Init(object):
    method uniform (line 138) | def uniform(*, scale=0.1):
  class L1 (line 144) | class L1(object):
    method conv (line 146) | def conv(*args, **kwargs):
    method linear (line 154) | def linear(*args, **kwargs):
    method batch_norm (line 162) | def batch_norm(*args, **kwargs):
    method instance_norm (line 170) | def instance_norm(*args, **kwargs):

FILE: xenonpy/model/sequential.py
  class LinearLayer (line 13) | class LinearLayer(nn.Module):
    method __init__ (line 19) | def __init__(self,
    method forward (line 50) | def forward(self, x):
  class SequentialLinear (line 61) | class SequentialLinear(nn.Module):
    method __init__ (line 68) | def __init__(
    method _check_input (line 138) | def _check_input(self, i):
    method forward (line 147) | def forward(self, x: Any) -> Any:

FILE: xenonpy/model/training/base.py
  class BaseExtension (line 19) | class BaseExtension(object):
    method before_proc (line 21) | def before_proc(self, trainer: 'BaseRunner' = None, is_training: bool ...
    method input_proc (line 24) | def input_proc(self, x_in, y_in, *_dependence: 'BaseExtension') -> Tup...
    method step_forward (line 27) | def step_forward(self, step_info: OrderedDict[Any, int], trainer: 'Bas...
    method output_proc (line 31) | def output_proc(self, y_pred, y_true, trainer: 'BaseRunner' = None, is...
    method after_proc (line 35) | def after_proc(self, trainer: 'BaseRunner' = None, is_training: bool =...
    method on_reset (line 38) | def on_reset(self, trainer: 'BaseRunner' = None, is_training: bool = T...
    method on_checkpoint (line 41) | def on_checkpoint(self, checkpoint: NamedTuple, trainer: 'BaseRunner' ...
  class BaseOptimizer (line 46) | class BaseOptimizer(object):
    method __init__ (line 48) | def __init__(self, optimizer, **kwargs):
    method __call__ (line 52) | def __call__(self, params: Iterable) -> Optimizer:
  class BaseLRScheduler (line 68) | class BaseLRScheduler(object):
    method __init__ (line 70) | def __init__(self, lr_scheduler, **kwargs):
    method __call__ (line 74) | def __call__(self, optimizer: Optimizer) -> _LRScheduler:
  class BaseRunner (line 89) | class BaseRunner(BaseEstimator, metaclass=TimedMetaClass):
    method __init__ (line 92) | def __init__(self, cuda: Union[bool, str, torch.device] = False):
    method cuda (line 97) | def cuda(self):
    method check_device (line 101) | def check_device(cuda: Union[bool, str, torch.device]) -> torch.device:
    method device (line 128) | def device(self):
    method device (line 132) | def device(self, v):
    method _make_inject (line 135) | def _make_inject(self, injects, kwargs):
    method input_proc (line 140) | def input_proc(self, x_in, y_in=None, **kwargs):
    method output_proc (line 146) | def output_proc(self, y_pred, y_true=None, **kwargs):
    method _before_proc (line 152) | def _before_proc(self, **kwargs):
    method _step_forward (line 157) | def _step_forward(self, **kwargs):
    method _after_proc (line 162) | def _after_proc(self, **kwargs):
    method _on_reset (line 167) | def _on_reset(self, **kwargs):
    method _on_checkpoint (line 172) | def _on_checkpoint(self, **kwargs):
    method extend (line 177) | def extend(self, *extension: BaseExtension) -> 'BaseRunner':
    method remove_extension (line 205) | def remove_extension(self, *extension: str):
    method __getitem__ (line 210) | def __getitem__(self, item):

FILE: xenonpy/model/training/checker.py
  class Checker (line 21) | class Checker(object):
    class __SL (line 26) | class __SL:
    method __init__ (line 30) | def __init__(
    method load (line 68) | def load(cls, model_path):
    method path (line 72) | def path(self):
    method files (line 76) | def files(self):
    method model_name (line 80) | def model_name(self):
    method model_structure (line 91) | def model_structure(self):
    method training_info (line 96) | def training_info(self):
    method describe (line 100) | def describe(self):
    method model (line 112) | def model(self):
    method model (line 138) | def model(self, model: Module):
    method trained_model (line 156) | def trained_model(self):
    method model_class (line 168) | def model_class(self):
    method model_params (line 174) | def model_params(self):
    method init_state (line 180) | def init_state(self):
    method init_state (line 186) | def init_state(self, state: OrderedDict):
    method final_state (line 195) | def final_state(self):
    method final_state (line 201) | def final_state(self, state: OrderedDict):
    method _make_file_index (line 209) | def _make_file_index(self):
    method _save_data (line 216) | def _save_data(self, data: Any, filename: str, handle) -> str:
    method _load_data (line 232) | def _load_data(self, file: str, handle):
    method __getattr__ (line 249) | def __getattr__(self, name: str):
    method __getitem__ (line 269) | def __getitem__(self, item):
    method __call__ (line 276) | def __call__(self, handle=None, **named_data: Any):
    method set_checkpoint (line 294) | def set_checkpoint(self, **kwargs):
    method __repr__ (line 297) | def __repr__(self):

FILE: xenonpy/model/training/clip_grad.py
  class ClipNorm (line 10) | class ClipNorm(object):
    method __init__ (line 12) | def __init__(self, max_norm, norm_type=2):
    method __call__ (line 29) | def __call__(self, params):
  class ClipValue (line 33) | class ClipValue(object):
    method __init__ (line 35) | def __init__(self, clip_value):
    method __call__ (line 47) | def __call__(self, params):

FILE: xenonpy/model/training/dataset/array.py
  class ArrayDataset (line 16) | class ArrayDataset(TensorDataset):
    method __init__ (line 17) | def __init__(self,
    method _convert (line 32) | def _convert(data, dtype):

FILE: xenonpy/model/training/dataset/cgcnn.py
  class CrystalGraphDataset (line 15) | class CrystalGraphDataset(Dataset):
    method __init__ (line 44) | def __init__(self, crystal_features: Union[pd.DataFrame, np.ndarray],
    method __len__ (line 59) | def __len__(self):
    method __getitem__ (line 62) | def __getitem__(self, idx):
    method collate_fn (line 70) | def collate_fn(dataset_list):

FILE: xenonpy/model/training/extension/persist.py
  class Persist (line 22) | class Persist(BaseExtension):
    method __init__ (line 27) | def __init__(self,
    method describe (line 78) | def describe(self):
    method no_model_saving (line 84) | def no_model_saving(self):
    method path (line 88) | def path(self):
    method path (line 94) | def path(self, path: Union[Path, str]):
    method model_structure (line 100) | def model_structure(self):
    method get_checkpoint (line 103) | def get_checkpoint(self, id_: str = None):
    method __call__ (line 108) | def __call__(self, handle: Any = None, **kwargs: Any):
    method __getitem__ (line 113) | def __getitem__(self, item):
    method on_checkpoint (line 116) | def on_checkpoint(self,
    method step_forward (line 134) | def step_forward(self,
    method before_proc (line 151) | def before_proc(self, trainer: Trainer = None, _is_training: bool = Tr...
    method after_proc (line 173) | def after_proc(self, trainer: Trainer = None, _is_training: bool = Tru...

FILE: xenonpy/model/training/extension/tensor_convert.py
  class TensorConverter (line 19) | class TensorConverter(BaseExtension):
    method __init__ (line 21) | def __init__(self,
    method argmax (line 69) | def argmax(self):
    method argmax (line 73) | def argmax(self, value):
    method empty_cache (line 77) | def empty_cache(self):
    method empty_cache (line 81) | def empty_cache(self, value):
    method auto_reshape (line 85) | def auto_reshape(self):
    method auto_reshape (line 89) | def auto_reshape(self, value):
    method probability (line 93) | def probability(self):
    method probability (line 97) | def probability(self, value):
    method _get_x_dtype (line 100) | def _get_x_dtype(self, i=0):
    method _get_y_dtype (line 105) | def _get_y_dtype(self, i=0):
    method input_proc (line 110) | def input_proc(self, x_in: Union[Sequence[Union[torch.Tensor, pd.DataF...
    method step_forward (line 162) | def step_forward(self):
    method output_proc (line 166) | def output_proc(

FILE: xenonpy/model/training/extension/validator.py
  class Validator (line 16) | class Validator(BaseExtension):
    method __init__ (line 24) | def __init__(self,
    method warming_up (line 82) | def warming_up(self):
    method warming_up (line 86) | def warming_up(self, val: int):
    method _set_trace (line 91) | def _set_trace(self, trace_metrics: dict, trace_order: int):
    method on_reset (line 95) | def on_reset(self) -> None:
    method before_proc (line 98) | def before_proc(self, trainer: Trainer) -> None:
    method step_forward (line 107) | def step_forward(self, trainer: Trainer, step_info: OrderedDict) -> None:

FILE: xenonpy/model/training/lr_scheduler.py
  class LambdaLR (line 11) | class LambdaLR(BaseLRScheduler):
    method __init__ (line 13) | def __init__(self, *, lr_lambda, last_epoch=-1):
  class StepLR (line 37) | class StepLR(BaseLRScheduler):
    method __init__ (line 39) | def __init__(self, *, step_size, gamma=0.1, last_epoch=-1):
  class MultiStepLR (line 67) | class MultiStepLR(BaseLRScheduler):
    method __init__ (line 69) | def __init__(self, *, milestones, gamma=0.1, last_epoch=-1):
  class ExponentialLR (line 96) | class ExponentialLR(BaseLRScheduler):
    method __init__ (line 98) | def __init__(self, *, gamma, last_epoch=-1):
  class CosineAnnealingLR (line 109) | class CosineAnnealingLR(BaseLRScheduler):
    method __init__ (line 111) | def __init__(self, *, T_max, eta_min=0, last_epoch=-1):
  class ReduceLROnPlateau (line 148) | class ReduceLROnPlateau(BaseLRScheduler):
    method __init__ (line 150) | def __init__(self,
  class CyclicLR (line 211) | class CyclicLR(BaseLRScheduler):
    method __init__ (line 213) | def __init__(self,

FILE: xenonpy/model/training/optimizer.py
  class Adadelta (line 12) | class Adadelta(BaseOptimizer):
    method __init__ (line 14) | def __init__(self, *, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0):
  class Adagrad (line 33) | class Adagrad(BaseOptimizer):
    method __init__ (line 35) | def __init__(self, *, lr=0.01, lr_decay=0, weight_decay=0, initial_acc...
  class Adam (line 56) | class Adam(BaseOptimizer):
    method __init__ (line 58) | def __init__(self, *, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_de...
  class AdamW (line 86) | class AdamW(BaseOptimizer):
    method __init__ (line 88) | def __init__(self, *, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_de...
  class SparseAdam (line 116) | class SparseAdam(BaseOptimizer):
    method __init__ (line 118) | def __init__(self, *, lr=0.001, betas=(0.9, 0.999), eps=1e-08):
  class Adamax (line 138) | class Adamax(BaseOptimizer):
    method __init__ (line 140) | def __init__(self, *, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_...
  class ASGD (line 159) | class ASGD(BaseOptimizer):
    method __init__ (line 161) | def __init__(self, *, lr=0.002, lambd=0.0001, alpha=0.75, t0=1000000.0...
  class LBFGS (line 181) | class LBFGS(BaseOptimizer):
    method __init__ (line 183) | def __init__(self,
  class RMSprop (line 230) | class RMSprop(BaseOptimizer):
    method __init__ (line 232) | def __init__(self, *, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, ...
  class Rprop (line 262) | class Rprop(BaseOptimizer):
    method __init__ (line 264) | def __init__(self, *, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50)):
  class SGD (line 279) | class SGD(BaseOptimizer):
    method __init__ (line 281) | def __init__(self, *, lr=0.01, momentum=0, dampening=0, weight_decay=0...

FILE: xenonpy/model/training/trainer.py
  class Trainer (line 26) | class Trainer(BaseRunner):
    method __init__ (line 30) | def __init__(
    method epochs (line 106) | def epochs(self):
    method non_blocking (line 110) | def non_blocking(self):
    method loss_type (line 114) | def loss_type(self):
    method total_epochs (line 118) | def total_epochs(self):
    method total_iterations (line 122) | def total_iterations(self):
    method x_val (line 126) | def x_val(self):
    method y_val (line 130) | def y_val(self):
    method validate_dataset (line 134) | def validate_dataset(self):
    method loss_func (line 138) | def loss_func(self):
    method loss_func (line 142) | def loss_func(self, loss_func):
    method training_info (line 148) | def training_info(self):
    method device (line 154) | def device(self):
    method device (line 158) | def device(self, v):
    method model (line 163) | def model(self):
    method model (line 167) | def model(self, model):
    method optimizer (line 175) | def optimizer(self):
    method optimizer (line 179) | def optimizer(self, optimizer):
    method lr_scheduler (line 190) | def lr_scheduler(self):
    method lr_scheduler (line 194) | def lr_scheduler(self, scheduler):
    method clip_grad (line 202) | def clip_grad(self):
    method clip_grad (line 206) | def clip_grad(self, fn):
    method checkpoints (line 210) | def checkpoints(self):
    method get_checkpoint (line 213) | def get_checkpoint(self, checkpoint: Union[int, str] = None):
    method set_checkpoint (line 223) | def set_checkpoint(self, id_: str = None):
    method early_stop (line 235) | def early_stop(self, msg: str):
    method reset (line 238) | def reset(self, *, to: Union[Module, int, str] = None, remove_checkpoi...
    method fit (line 275) | def fit(self,
    method __call__ (line 352) | def __call__(self,
    method load (line 513) | def load(
    method from_checker (line 535) | def from_checker(
    method predict (line 595) | def predict(self,
    method to_namedtuple (line 666) | def to_namedtuple(self):

FILE: xenonpy/model/utils/metrics.py
  function regression_metrics (line 17) | def regression_metrics(y_true: Union[np.ndarray, pd.Series], y_pred: Uni...
  function classification_metrics (line 64) | def classification_metrics(

FILE: xenonpy/utils/math/product.py
  class Product (line 10) | class Product(object):
    method __init__ (line 11) | def __init__(self, *paras, repeat=1):
    method __getitem__ (line 28) | def __getitem__(self, index):
    method __len__ (line 42) | def __len__(self):

FILE: xenonpy/utils/parameter_gen.py
  class ParameterGenerator (line 14) | class ParameterGenerator(object):
    method __init__ (line 20) | def __init__(self, seed: Optional[int] = None, **kwargs: Union[Any, Se...
    method __call__ (line 59) | def __call__(self, num: int, *, factory=None):
    method _gen (line 93) | def _gen(item: Sequence, repeat: int = None, replace: bool = True):

FILE: xenonpy/utils/useful_cls.py
  class Switch (line 14) | class Switch(object):
    method __init__ (line 15) | def __init__(self, value):
    method __iter__ (line 19) | def __iter__(self):
    method match (line 24) | def match(self, *args):
  class Timer (line 35) | class Timer(object):
    class _Timer (line 36) | class _Timer:
      method __init__ (line 37) | def __init__(self):
      method elapsed (line 42) | def elapsed(self):
      method __repr__ (line 49) | def __repr__(self):
    method __init__ (line 52) | def __init__(self, time_func=time.perf_counter):
    method start (line 56) | def start(self, fn_name='main'):
    method stop (line 61) | def stop(self, fn_name='main'):
    method elapsed (line 69) | def elapsed(self):
    method __repr__ (line 74) | def __repr__(self):
    method __enter__ (line 81) | def __enter__(self):
    method __exit__ (line 85) | def __exit__(self, *args):
  class TimedMetaClass (line 89) | class TimedMetaClass(type):
    method _timed (line 96) | def _timed(fn):
    method __new__ (line 110) | def __new__(mcs, name, bases, attrs):
  class Singleton (line 136) | class Singleton(type):
    method __call__ (line 139) | def __call__(cls, *args, **kwargs):

FILE: xenonpy/utils/useful_func.py
  function set_env (line 19) | def set_env(**kwargs):
  function config (line 51) | def config(key=None, **key_vals):
  function camel_to_snake (line 101) | def camel_to_snake(text):
  function get_dataset_url (line 106) | def get_dataset_url(name, version=__db_version__):
  function get_data_loc (line 127) | def get_data_loc(name):
  function absolute_path (line 138) | def absolute_path(path, ignore_err=True):
  function get_sha256 (line 166) | def get_sha256(fname):

FILE: xenonpy/visualization/heatmap.py
  class DescriptorHeatmap (line 18) | class DescriptorHeatmap(BaseEstimator):
    method __init__ (line 23) | def __init__(self,
    method fit (line 75) | def fit(self, desc):
    method draw (line 83) | def draw(self,
Copy disabled (too large) Download .json
Condensed preview — 240 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (27,201K chars).
[
  {
    "path": ".github/config/check_env.sh",
    "chars": 500,
    "preview": "#!/usr/bin/env bash\n\n# pwd\n# ls -al\n\npython --version\npython -c \"import numpy; print('numpy %s' % numpy.__version__)\"\npy"
  },
  {
    "path": ".github/config/linux_win_env.yml",
    "chars": 319,
    "preview": "name: test\ndependencies:\n  - pandas>=1.1.3\n  - seaborn\n  - numpy\n  - scipy\n  - requests\n  - rdkit=2020.09\n  - scikit-lea"
  },
  {
    "path": ".github/config/macos_env.yml",
    "chars": 307,
    "preview": "name: test\ndependencies:\n  - pandas>=1.1.3\n  - seaborn\n  - numpy\n  - scipy\n  - requests\n  - rdkit=2020.09\n  - scikit-lea"
  },
  {
    "path": ".github/config/matplotlibrc_agg",
    "chars": 13,
    "preview": "backend: Agg\n"
  },
  {
    "path": ".github/config/matplotlibrc_qtagg",
    "chars": 16,
    "preview": "backend: Qt5Agg\n"
  },
  {
    "path": ".github/fetch_test.txt",
    "chars": 37,
    "preview": "Test xenonpy.utils.Loader._fetch_data"
  },
  {
    "path": ".github/workflows/deploy_pypi.yml",
    "chars": 1250,
    "preview": "name: Deploy PiPy\n\non:\n  push:\n    tags:\n      - v*\n\nenv:\n  MPLBACKEN: \"Agg\"\n\njobs:\n  test_ubuntu:\n    runs-on: ${{ matr"
  },
  {
    "path": ".github/workflows/mac.yml",
    "chars": 2102,
    "preview": "name: MacOS\n\non:\n  push:\n    branches:\n      - master\n    paths-ignore:\n      - \"conda_env/**\"\n      - \"devtools/**\"\n   "
  },
  {
    "path": ".github/workflows/ubuntu.yml",
    "chars": 2112,
    "preview": "name: Ubuntu\n\non:\n  push:\n    branches:\n      - master\n    paths-ignore:\n      - \"conda_env/**\"\n      - \"devtools/**\"\n  "
  },
  {
    "path": ".github/workflows/win.yml",
    "chars": 2095,
    "preview": "name: Windows\n\non:\n  push:\n    branches:\n      - master\n    paths-ignore:\n      - \"conda_env/**\"\n      - \"devtools/**\"\n "
  },
  {
    "path": ".gitignore",
    "chars": 1276,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": ".pylintrc",
    "chars": 516,
    "preview": "# Enable the message, report, category or checker with the given id(s). You can\n# either give multiple identifier separa"
  },
  {
    "path": ".readthedocs.yml",
    "chars": 247,
    "preview": "# Required\nversion: 2\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: docs/source/con"
  },
  {
    "path": ".style.yapf",
    "chars": 70,
    "preview": "[style]\nbased_on_style = google\n\n# The column limit.\ncolumn_limit=120\n"
  },
  {
    "path": "Dockerfile",
    "chars": 403,
    "preview": "FROM yoshidalab/base:cuda11\n\nARG key\nENV api_key=$key\n\n# install xenonpy locally\nWORKDIR /opt/xenonpy\nCOPY . .\nRUN sudo "
  },
  {
    "path": "LICENSE",
    "chars": 1471,
    "preview": "Copyright (c) 2021 TsumiNa. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmod"
  },
  {
    "path": "MANIFEST.in",
    "chars": 174,
    "preview": "include *.rst LICENSE.rst docs/source/changes.rst requirement*.txt\nrecursive-include xenonpy *.py *.json *.yml *.txt\nrec"
  },
  {
    "path": "Makefile",
    "chars": 118,
    "preview": "export SHELL := /bin/bash\n\ndoctest:\n\tpytest --doctest-modules xenonpy\n\nunittest:\n\tpytest tests\n\nlint:\n\tpylint xenonpy\n"
  },
  {
    "path": "README.md",
    "chars": 8898,
    "preview": "<p align=\"center\">\n  <img height=\"200\" src=\"https://github.com/yoshida-lab/XenonPy/blob/master/logo.png\" alt=\"xenonpy\">\n"
  },
  {
    "path": "conda_env/cpu.yml",
    "chars": 642,
    "preview": "channels:\n  - pytorch\n  - conda-forge\ndependencies:\n  # Number\n  - numpy\n  - scipy\n  - pandas\n\n  # Mol/Crystall\n  - pyma"
  },
  {
    "path": "conda_env/cuda118.yml",
    "chars": 663,
    "preview": "channels:\n  - pytorch\n  - nvidia\n  - conda-forge\ndependencies:\n  # Number\n  - numpy\n  - scipy\n  - pandas\n\n  # Mol/Crysta"
  },
  {
    "path": "conda_env/cuda121.yml",
    "chars": 663,
    "preview": "channels:\n  - pytorch\n  - nvidia\n  - conda-forge\ndependencies:\n  # Number\n  - numpy\n  - scipy\n  - pandas\n\n  # Mol/Crysta"
  },
  {
    "path": "conda_env/devtools/extra_env.yml",
    "chars": 231,
    "preview": "channels:\n  - conda-forge\ndependencies:\n  - yapf\n  - pytest\n  - pytest-cov\n  - pylint\n  - sphinx\n  - sphinx_rtd_theme\n  "
  },
  {
    "path": "conda_env/devtools/rtd_env.yml",
    "chars": 414,
    "preview": "channels:\n  - pytorch\n  - conda-forge\ndependencies:\n  - python=3.8\n  - rdkit=2020.09\n  - pytorch >=1.7.0,<2.0.0\n  - cpuo"
  },
  {
    "path": "conda_env/osx.yml",
    "chars": 655,
    "preview": "channels:\n  - pytorch\n  - conda-forge\ndependencies:\n  # Number\n  - numpy\n  - scipy\n  - pandas\n\n  # Mol/Crystall\n  - pyma"
  },
  {
    "path": "docker/cpu/Dockerfile",
    "chars": 332,
    "preview": "FROM yoshidalab/base:cpu\n\n# install xenonpy locally\nWORKDIR /opt/xenonpy\nCOPY . .\nRUN sudo chown -R user:user /opt && fi"
  },
  {
    "path": "docker/cuda10/Dockerfile",
    "chars": 335,
    "preview": "FROM yoshidalab/base:cuda10\n\n# install xenonpy locally\nWORKDIR /opt/xenonpy\nCOPY . .\nRUN sudo chown -R user:user /opt &&"
  },
  {
    "path": "docker/cuda11/Dockerfile",
    "chars": 335,
    "preview": "FROM yoshidalab/base:cuda11\n\n# install xenonpy locally\nWORKDIR /opt/xenonpy\nCOPY . .\nRUN sudo chown -R user:user /opt &&"
  },
  {
    "path": "docker/cuda9/Dockerfile",
    "chars": 334,
    "preview": "FROM yoshidalab/base:cuda9\n\n# install xenonpy locally\nWORKDIR /opt/xenonpy\nCOPY . .\nRUN sudo chown -R user:user /opt && "
  },
  {
    "path": "docs/Makefile",
    "chars": 608,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "docs/make.bat",
    "chars": 779,
    "preview": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-bu"
  },
  {
    "path": "docs/source/_static/css/container.css",
    "chars": 236,
    "preview": "#container {\n    /* min-height: 100vh; */\n    display: flex;\n}\n.left {\n    width: 30vw;\n    /* flex: 1; */\n    padding: "
  },
  {
    "path": "docs/source/_static/placehoder",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/source/_templates/layout.html",
    "chars": 93,
    "preview": "{% extends \"!layout.html\" %}\n{% set css_files = css_files + [ \"_static/css/hatnotes.css\" ] %}"
  },
  {
    "path": "docs/source/_templates/placehoder",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/source/api.rst",
    "chars": 109,
    "preview": "------------------\nIndices and tables\n------------------\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/source/books.rst",
    "chars": 1548,
    "preview": "========================================================================\nExercises in \"Materials Informatics\" (KYORITSU "
  },
  {
    "path": "docs/source/changes.rst",
    "chars": 8015,
    "preview": ".. role:: raw-html(raw)\n    :format: html\n\n=======\nChanges\n=======\n\nv0.6.2 ~ v0.6.3\n===============\n**Bug fix**\n\n* some "
  },
  {
    "path": "docs/source/conf.py",
    "chars": 6609,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this "
  },
  {
    "path": "docs/source/contact.rst",
    "chars": 164,
    "preview": "========\nContact\n========\n\n* For issues_\n* For Gitter_\n\n.. _issues: https://github.com/yoshida-lab/XenonPy/issues\n.. _Gi"
  },
  {
    "path": "docs/source/contribution.rst",
    "chars": 1028,
    "preview": "=======================\nContribution guidelines\n=======================\n\n1. Fork it ( https://github.com/yoshida-lab/Xen"
  },
  {
    "path": "docs/source/copyright.rst",
    "chars": 196,
    "preview": "=========\nCopyright\n=========\n\nCopyright © 2021 The XenonPy task force, all rights reserved.\nReleased under the `BSD-3 l"
  },
  {
    "path": "docs/source/features.rst",
    "chars": 24491,
    "preview": ".. role:: raw-html(raw)\n    :format: html\n\n========\nFeatures\n========\n\n\n-----------\nData access\n-----------\n.. _data-acc"
  },
  {
    "path": "docs/source/index.rst",
    "chars": 7312,
    "preview": ".. Copyright 2019 TsumiNa. All rights reserved.\n\n\n.. role:: raw-html(raw)\n    :format: html\n\n========================\nWh"
  },
  {
    "path": "docs/source/installation.rst",
    "chars": 8192,
    "preview": ".. role:: raw-html(raw)\n    :format: html\n\n.. note::\n\n   To all those who have purchased the book `Materials Informatics"
  },
  {
    "path": "docs/source/modules.rst",
    "chars": 58,
    "preview": "xenonpy\n=======\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy\n"
  },
  {
    "path": "docs/source/setup.rst",
    "chars": 103,
    "preview": "setup module\n============\n\n.. automodule:: setup\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "docs/source/tutorial.rst",
    "chars": 1191,
    "preview": "========\nTutorial\n========\n\nThese tutorials will demonstrate the most foundational usages of XenonPy and XenonPy.MDL and"
  },
  {
    "path": "docs/source/tutorials/1-dataset.rst",
    "chars": 3852,
    "preview": "===========\nData access\n===========\n\n**Dataset** is an abstraction of the local file system.\nUsers can add their local p"
  },
  {
    "path": "docs/source/tutorials/2-descriptor.rst",
    "chars": 7067,
    "preview": "======================\nDescriptor calculation\n======================\n\n**XenonPy** comes with a general interface for des"
  },
  {
    "path": "docs/source/tutorials/3-visualization.rst",
    "chars": 2491,
    "preview": "=============\nVisualization\n=============\n\nDescriptors on a set of given materials could be displayed as a heatmap, whic"
  },
  {
    "path": "docs/source/tutorials/4-random_nn_model_and_training.ipynb",
    "chars": 456974,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"-\"\n    }\n   },\n   "
  },
  {
    "path": "docs/source/tutorials/5-pre-trained_model_library.ipynb",
    "chars": 323675,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Pre-trained Model Library\\n\",\n   "
  },
  {
    "path": "docs/source/tutorials/6-transfer_learning.ipynb",
    "chars": 912920,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Transfer Learning\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "docs/source/tutorials/7-inverse-design.ipynb",
    "chars": 749469,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# XenonPy-iQSPR tutorial\"\n   ]\n  },"
  },
  {
    "path": "docs/source/xenonpy.contrib.extend_descriptors.descriptor.rst",
    "chars": 1187,
    "preview": "xenonpy.contrib.extend\\_descriptors.descriptor package\n======================================================\n\nSubmodule"
  },
  {
    "path": "docs/source/xenonpy.contrib.extend_descriptors.rst",
    "chars": 332,
    "preview": "xenonpy.contrib.extend\\_descriptors package\n===========================================\n\nSubpackages\n-----------\n\n.. toc"
  },
  {
    "path": "docs/source/xenonpy.contrib.ismd.rst",
    "chars": 572,
    "preview": "xenonpy.contrib.ismd package\n============================\n\nSubmodules\n----------\n\nxenonpy.contrib.ismd.reactant\\_pool mo"
  },
  {
    "path": "docs/source/xenonpy.contrib.rst",
    "chars": 286,
    "preview": "xenonpy.contrib package\n=======================\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy.contr"
  },
  {
    "path": "docs/source/xenonpy.datatools.rst",
    "chars": 859,
    "preview": "xenonpy.datatools package\n=========================\n\nSubmodules\n----------\n\nxenonpy.datatools.dataset module\n-----------"
  },
  {
    "path": "docs/source/xenonpy.descriptor.rst",
    "chars": 1252,
    "preview": "xenonpy.descriptor package\n==========================\n\nSubmodules\n----------\n\nxenonpy.descriptor.base module\n-----------"
  },
  {
    "path": "docs/source/xenonpy.inverse.iqspr.rst",
    "chars": 919,
    "preview": "xenonpy.inverse.iqspr package\n=============================\n\nSubmodules\n----------\n\nxenonpy.inverse.iqspr.estimator modu"
  },
  {
    "path": "docs/source/xenonpy.inverse.rst",
    "chars": 421,
    "preview": "xenonpy.inverse package\n=======================\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy.inver"
  },
  {
    "path": "docs/source/xenonpy.mdl.rst",
    "chars": 1186,
    "preview": "xenonpy.mdl package\n===================\n\nSubmodules\n----------\n\nxenonpy.mdl.base module\n-----------------------\n\n.. auto"
  },
  {
    "path": "docs/source/xenonpy.model.nn.rst",
    "chars": 501,
    "preview": "xenonpy.model.nn package\n========================\n\nSubmodules\n----------\n\nxenonpy.model.nn.layer module\n----------------"
  },
  {
    "path": "docs/source/xenonpy.model.rst",
    "chars": 766,
    "preview": "xenonpy.model package\n=====================\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy.model.nn\n"
  },
  {
    "path": "docs/source/xenonpy.model.training.dataset.rst",
    "chars": 630,
    "preview": "xenonpy.model.training.dataset package\n======================================\n\nSubmodules\n----------\n\nxenonpy.model.trai"
  },
  {
    "path": "docs/source/xenonpy.model.training.extension.rst",
    "chars": 898,
    "preview": "xenonpy.model.training.extension package\n========================================\n\nSubmodules\n----------\n\nxenonpy.model."
  },
  {
    "path": "docs/source/xenonpy.model.training.rst",
    "chars": 1604,
    "preview": "xenonpy.model.training package\n==============================\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n  "
  },
  {
    "path": "docs/source/xenonpy.model.utils.rst",
    "chars": 373,
    "preview": "xenonpy.model.utils package\n===========================\n\nSubmodules\n----------\n\nxenonpy.model.utils.metrics module\n-----"
  },
  {
    "path": "docs/source/xenonpy.rst",
    "chars": 355,
    "preview": "xenonpy package\n===============\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy.contrib\n   xenonpy.da"
  },
  {
    "path": "docs/source/xenonpy.utils.math.rst",
    "chars": 367,
    "preview": "xenonpy.utils.math package\n==========================\n\nSubmodules\n----------\n\nxenonpy.utils.math.product module\n--------"
  },
  {
    "path": "docs/source/xenonpy.utils.rst",
    "chars": 764,
    "preview": "xenonpy.utils package\n=====================\n\nSubpackages\n-----------\n\n.. toctree::\n   :maxdepth: 4\n\n   xenonpy.utils.mat"
  },
  {
    "path": "docs/source/xenonpy.visualization.rst",
    "chars": 385,
    "preview": "xenonpy.visualization package\n=============================\n\nSubmodules\n----------\n\nxenonpy.visualization.heatmap module"
  },
  {
    "path": "hooks/build",
    "chars": 87,
    "preview": "#!/bin/bash\n\ndocker build --build-arg key=$api_key -f $DOCKERFILE_PATH -t $IMAGE_NAME ."
  },
  {
    "path": "licences/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mi_book/README.md",
    "chars": 3332,
    "preview": "# 演習問題\n\nこのリポジトリは,共立出版社が出版する「マテリアルズインフォマティクス」の演習問題1~22をまとめている.\nその内,演習16と17は,現在訓練済みモデルのダウンロードサービスのメンテナンスにより実行できない状態になってる.サ"
  },
  {
    "path": "mi_book/common_setting.ipynb",
    "chars": 9314,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": "
  },
  {
    "path": "mi_book/exercise_11.ipynb",
    "chars": 453561,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<!--\\n\",\n    \" Copyright 2022 Tsumi"
  },
  {
    "path": "mi_book/exercise_12.ipynb",
    "chars": 39712,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 演習12)\\n\",\n    \"\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "mi_book/exercise_13.ipynb",
    "chars": 12613,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 演習13)分子動力学シミュレーションのサンプルデータにある30"
  },
  {
    "path": "mi_book/exercise_14.ipynb",
    "chars": 1064546,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"903bad8b\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 演習 14\\n\",\n"
  },
  {
    "path": "mi_book/exercise_15.ipynb",
    "chars": 148500,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"<a id='top'></a>\\n\",\n    \"\\n\",\n    "
  },
  {
    "path": "mi_book/exercise_18.ipynb",
    "chars": 621917,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"-\"\n    }\n   },\n   "
  },
  {
    "path": "mi_book/exercise_19.ipynb",
    "chars": 461945,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"-\"\n    }\n   },\n   "
  },
  {
    "path": "mi_book/exercise_2-10.ipynb",
    "chars": 707173,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 演習2)配布したSMILES形式の化学構造をMOLオブジェクト"
  },
  {
    "path": "mi_book/exercise_20.ipynb",
    "chars": 328100,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# 演習20: サンプルコードを実行し,エピガロカテキン(Epigal"
  },
  {
    "path": "mi_book/exercise_21.ipynb",
    "chars": 5203306,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"tags\": []\n   },\n   \"source\": [\n    \"### 演習21)サンプルコード"
  },
  {
    "path": "mi_book/exercise_22.ipynb",
    "chars": 865525,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### 演習22)以下の解説とサンプルコードを参考に,所望の熱伝導率と"
  },
  {
    "path": "mi_book/output/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mi_book/retrieve_materials_project.ipynb",
    "chars": 13471,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"### サンプルデータの用意\\n\",\n    \"\\n\",\n    \"こ"
  },
  {
    "path": "mi_book/tools.ipynb",
    "chars": 15356,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tools\"\n   ]\n  },\n  {\n   \"cell_typ"
  },
  {
    "path": "requirements.txt",
    "chars": 275,
    "preview": "###### Requirements without Version Specifiers ######\ntqdm\nseaborn\nplotly\nrequests\nruamel.yaml\nmordred\nDeprecated\n\n#####"
  },
  {
    "path": "samples/CSP_with_element_substitution.ipynb",
    "chars": 326287,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## CSP using the crystal structure "
  },
  {
    "path": "samples/calculate_descriptors.ipynb",
    "chars": 50201,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Calculate descriptors and draw h"
  },
  {
    "path": "samples/custom_descriptor_calculator.ipynb",
    "chars": 12185,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n "
  },
  {
    "path": "samples/data/Dataset_I.csv",
    "chars": 2062377,
    "preview": "Molecule_ID,SMILES,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19,V20,V21,V22,V23,V24,V25,V26,V27,V2"
  },
  {
    "path": "samples/dataset_and_preset.ipynb",
    "chars": 22837,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Dataset\"\n   ]\n  },\n  {\n   \"cell_t"
  },
  {
    "path": "samples/iQSPR.ipynb",
    "chars": 749450,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# XenonPy-iQSPR tutorial\"\n   ]\n  },"
  },
  {
    "path": "samples/iSMD.ipynb",
    "chars": 478099,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## XenonPy-ISMD (Inversed Synthesiz"
  },
  {
    "path": "samples/kernel_neural_network.ipynb",
    "chars": 33629,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ongoing-parameter\",\n   \"metadata\": {},\n   \"source\": [\n    \"This "
  },
  {
    "path": "samples/mp_ids.txt",
    "chars": 19758,
    "preview": "mp-556521\nmp-19852\nmp-1226003\nmp-29946\nmp-1214215\nmp-556709\nmp-567628\nmp-27187\nmp-1204495\nmp-2804\nmp-1228955\nmp-1178446\n"
  },
  {
    "path": "samples/nn_model_build.ipynb",
    "chars": 3865758,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n "
  },
  {
    "path": "samples/pre-trained_model_library.ipynb",
    "chars": 323544,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Pre-trained Model Library\\n\",\n   "
  },
  {
    "path": "samples/predict_hypermaterials/OTHERS_data.csv",
    "chars": 838712,
    "preview": ",composition,elements,label,for_test\nmp-1077980,\"{'Sr': 1.0, 'Ag': 4.0, 'Sb': 2.0}\",\"('Ag', 'Sb', 'Sr')\",OTHERS,False\nmp"
  },
  {
    "path": "samples/predict_hypermaterials/QC_AC_data.csv",
    "chars": 13484,
    "preview": ",composition,elements,label,for_test\nZn 58 Mg 40 Dy 2,\"{'Zn': 58.0, 'Mg': 40.0, 'Dy': 2.0}\",\"('Dy', 'Mg', 'Zn')\",QC,Fals"
  },
  {
    "path": "samples/predict_hypermaterials/model_training_and_vitural_screening.ipynb",
    "chars": 738095,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"This notebook shows how to train a "
  },
  {
    "path": "samples/predict_hypermaterials/tools.ipynb",
    "chars": 10234,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tools\\n\",\n    \"\\n\",\n    \"This fil"
  },
  {
    "path": "samples/predict_hypermaterials/training_data.csv",
    "chars": 852159,
    "preview": ",composition,elements,label,for_test\nmp-1077980,\"{'Sr': 1.0, 'Ag': 4.0, 'Sb': 2.0}\",\"('Ag', 'Sb', 'Sr')\",OTHERS,False\nmp"
  },
  {
    "path": "samples/process_dataset_usgs.ipynb",
    "chars": 4316,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"4ef1599e\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Obtain the "
  },
  {
    "path": "samples/random_nn_model_and_training.ipynb",
    "chars": 456839,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {\n    \"slideshow\": {\n     \"slide_type\": \"-\"\n    }\n   },\n   "
  },
  {
    "path": "samples/sample_data_building.ipynb",
    "chars": 10208,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Build Sample Data\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "samples/set1/data1.csv",
    "chars": 17,
    "preview": ",0,1\n0,1,2\n1,3,4\n"
  },
  {
    "path": "samples/set2/data2.csv",
    "chars": 17,
    "preview": ",0,1\n0,1,2\n1,3,4\n"
  },
  {
    "path": "samples/tools.ipynb",
    "chars": 10780,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tools\"\n   ]\n  },\n  {\n   \"cell_typ"
  },
  {
    "path": "samples/transfer_learning.ipynb",
    "chars": 912792,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Transfer Learning\\n\",\n    \"\\n\",\n "
  },
  {
    "path": "samples/visualization.ipynb",
    "chars": 994347,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Visualization\\n\",\n    \"\\n\",\n    \""
  },
  {
    "path": "setup.cfg",
    "chars": 94,
    "preview": "[aliases]\ntest = pytest\n\n[yapf]\nbased_on_style = google\n\n# The column limit.\ncolumn_limit=120\n"
  },
  {
    "path": "setup.py",
    "chars": 5100,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/contrib/descriptor/test_mordred.py",
    "chars": 1734,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/contrib/ismd/test_reactant_pool.py",
    "chars": 9600,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Tue Dec  1 00:39:20 2020\n\n@author: qiz\n\"\"\"\n\nimport pytest\n"
  },
  {
    "path": "tests/contrib/ismd/test_reactor.py",
    "chars": 303,
    "preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nCreated on Tue Dec  1 00:39:20 2020\n\n@author: qiz\n\"\"\"\n\nimport pytest\n"
  },
  {
    "path": "tests/datatools/ids.txt",
    "chars": 46,
    "preview": "mp-862776\nmp-30759\nmp-768076\nmp-9996\nmvc-2470\n"
  },
  {
    "path": "tests/datatools/test_dataset.py",
    "chars": 4204,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/datatools/test_preset.py",
    "chars": 3610,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/datatools/test_scaler.py",
    "chars": 2308,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/datatools/test_splitter.py",
    "chars": 5858,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/1.cif",
    "chars": 901,
    "preview": "# generated using pymatgen\ndata_LiP\n_symmetry_space_group_name_H-M   P2_1/c\n_cell_length_a   5.59387161\n_cell_length_b  "
  },
  {
    "path": "tests/descriptor/2.cif",
    "chars": 1291,
    "preview": "# generated using pymatgen\ndata_P2S5\n_symmetry_space_group_name_H-M   P-1\n_cell_length_a   9.67888928\n_cell_length_b   9"
  },
  {
    "path": "tests/descriptor/test_base_desc.py",
    "chars": 10656,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/test_crystal_graph.py",
    "chars": 2675,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/test_elemental.py",
    "chars": 2167,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/test_fingerprint.py",
    "chars": 6630,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/test_frozen_feature.py",
    "chars": 4638,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/descriptor/test_structures.py",
    "chars": 1185,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/inverse/polymer_test_data.csv",
    "chars": 26153,
    "preview": ",smiles,bandgap,refractive_index,density,glass_transition_temperature\n0,C([*])C([*])(SCCC),5.2,1.74,1.04,259\n1,C([*])C(["
  },
  {
    "path": "tests/inverse/test_base_inverse.py",
    "chars": 3067,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/inverse/test_iqspr.py",
    "chars": 13542,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/mdl/test_mdl.py",
    "chars": 1841,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/models/test_base_runner.py",
    "chars": 3523,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/models/test_checker.py",
    "chars": 3293,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/models/test_extension.py",
    "chars": 14473,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/models/test_sequential.py",
    "chars": 3245,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/models/test_trainer.py",
    "chars": 13635,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/models/test_utils.py",
    "chars": 1532,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/models/test_wrapped.py",
    "chars": 697,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "tests/utils/test_gadget.py",
    "chars": 1776,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/utils/test_parameter_gen.py",
    "chars": 3224,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "tests/utils/test_product.py",
    "chars": 2103,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/__doc__.py",
    "chars": 161,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/__init__.py",
    "chars": 2150,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/__main__.py",
    "chars": 1534,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/_conf.py",
    "chars": 1474,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/conf.yml",
    "chars": 832,
    "preview": "###############\n# package info\n###############\nname: \"xenonpy\"\nversion: \"0.6.7\"\ndb_version: \"0.1.3\"\nrelease: \"\"\nshort_de"
  },
  {
    "path": "xenonpy/contrib/README.md",
    "chars": 1614,
    "preview": "# XenonPy contrib\n\nAny code in this directory is not officially supported and may change or be removed at any time witho"
  },
  {
    "path": "xenonpy/contrib/__init__.py",
    "chars": 178,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/README.md",
    "chars": 1284,
    "preview": "# Extend Descriptors\n\n## FrozenFeaturizerDescriptor\n\nThis is a sample code for creating artificial descriptor based on a"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/__init__.py",
    "chars": 156,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/descriptor/__init__.py",
    "chars": 278,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/descriptor/frozen_featurizer_descriptor.py",
    "chars": 1833,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/descriptor/mordred_descriptor.py",
    "chars": 1404,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/extend_descriptors/descriptor/organic_comp_descriptor.py",
    "chars": 1731,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/ismd/README.md",
    "chars": 951,
    "preview": "# New BaseProposal class\n\n## reactant_pool\n\nThis is a sample code of a new class of BaseProposal, called ReactantPool.\nR"
  },
  {
    "path": "xenonpy/contrib/ismd/__init__.py",
    "chars": 299,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/contrib/ismd/reactant_pool.py",
    "chars": 6618,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/contrib/ismd/reactor.py",
    "chars": 3287,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/contrib/sample_codes/Binary_likelihood/binary_likelihood.ipynb",
    "chars": 34806,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Filter-based likelihood\"\n   ]\n  }"
  },
  {
    "path": "xenonpy/contrib/sample_codes/Fragment_Ngram/Fragment_Ngram.ipynb",
    "chars": 11940,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Fragment NGram  \\n\",\n    \"2019.1"
  },
  {
    "path": "xenonpy/contrib/sample_codes/README.md",
    "chars": 939,
    "preview": "# XenonPy contrib/sample_codes\n\nAny code in this directory is not officially supported and may change or be removed at a"
  },
  {
    "path": "xenonpy/contrib/sample_codes/Random_NN_structure/randNN_structures.ipynb",
    "chars": 331544,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Generating random NN models with "
  },
  {
    "path": "xenonpy/contrib/sample_codes/combine_fragments/combine_fragments.py",
    "chars": 3180,
    "preview": "#  Copyright (c) 2021. stewu5. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license tha"
  },
  {
    "path": "xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_F.py",
    "chars": 8087,
    "preview": "# IQSPR with focus on molecule variety: bring in new initial molecules from reservoir in every step of SMC\n\nimport numpy"
  },
  {
    "path": "xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_V.py",
    "chars": 5026,
    "preview": "# IQSPR with focus on molecule variety: bring in new initial molecules from reservoir in every step of SMC\n\nimport numpy"
  },
  {
    "path": "xenonpy/contrib/sample_codes/iQSPR_V/iQSPR_VF.py",
    "chars": 8912,
    "preview": "# IQSPR with focus on molecule variety: bring in new initial molecules from reservoir in every step of SMC and allow mut"
  },
  {
    "path": "xenonpy/datatools/__init__.py",
    "chars": 257,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/datatools/dataset.py",
    "chars": 5514,
    "preview": "#  Copyright (c) 2021. TsumiNa. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  license th"
  },
  {
    "path": "xenonpy/datatools/mp_ids.txt",
    "chars": 19758,
    "preview": "mp-556521\nmp-19852\nmp-1226003\nmp-29946\nmp-1214215\nmp-556709\nmp-567628\nmp-27187\nmp-1204495\nmp-2804\nmp-1228955\nmp-1178446\n"
  },
  {
    "path": "xenonpy/datatools/preset.py",
    "chars": 9225,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/datatools/splitter.py",
    "chars": 8226,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/datatools/transform.py",
    "chars": 7432,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/__init__.py",
    "chars": 296,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/base.py",
    "chars": 24981,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/cgcnn.py",
    "chars": 4839,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/compositions.py",
    "chars": 17775,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/fingerprint.py",
    "chars": 41473,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/frozen_featurizer.py",
    "chars": 4638,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/descriptor/structure.py",
    "chars": 12500,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/__init__.py",
    "chars": 203,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/base.py",
    "chars": 18190,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/iqspr/__init__.py",
    "chars": 466,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/iqspr/estimator.py",
    "chars": 7764,
    "preview": "#  Copyright (c) 2022. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/iqspr/iqspr.py",
    "chars": 1860,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/iqspr/iqspr4df.py",
    "chars": 3176,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/inverse/iqspr/modifier.py",
    "chars": 28877,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/__init__.py",
    "chars": 181,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/base.py",
    "chars": 3923,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/descriptor.py",
    "chars": 5071,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/mdl.py",
    "chars": 28225,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/method.py",
    "chars": 5015,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  },
  {
    "path": "xenonpy/mdl/model.py",
    "chars": 16506,
    "preview": "#  Copyright (c) 2021. yoshida-lab. All rights reserved.\n#  Use of this source code is governed by a BSD-style\n#  licens"
  }
]

// ... and 40 more files (download for full content)

About this extraction

This page contains the full source code of the yoshida-lab/XenonPy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 240 files (25.1 MB), approximately 6.6M tokens, and a symbol index with 980 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!