diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000..c8bc1b2 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,33 @@ +name: Build documentation + +on: + pull_request: + branches: + - develop + - master + +jobs: + documentation: + runs-on: ubuntu-20.04 + steps: + - name: Checkout repo + uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + sudo apt update + python -m pip install --upgrade --no-cache-dir pip setuptools + python -m pip install --exists-action=w --no-cache-dir -r requirements1.txt + python -m pip install --exists-action=w --no-cache-dir -r requirements2.txt + python -m pip install --exists-action=w --no-cache-dir -r docs/requirements.txt + python -m pip install --upgrade --upgrade-strategy eager --no-cache-dir . + + - name: Build documentation + # Build the documentation, you can use this command locally + run: | + cd docs/source + python -m sphinx -T -W --keep-going -b html -d _build/doctrees -D language=en . docs/html diff --git a/.github/workflows/test_on_push.yaml b/.github/workflows/test_on_push.yaml index 4239a34..a429549 100644 --- a/.github/workflows/test_on_push.yaml +++ b/.github/workflows/test_on_push.yaml @@ -31,12 +31,15 @@ jobs: run: | sudo apt-get update sudo apt-get install -y build-essential python3-dev - - name: Install torch + - name: Install dependencies part 1 run: | - pip install torch==2.0.0 - - name: Install other dependencies + pip install -r requirements1.txt + - name: Install dependencies part 2 run: | - pip install -r requirements.txt --no-deps + pip install -r requirements2.txt + - name: Install dependencies part 3 + run: | + pip install -r requirements3.txt --no-deps - name: Set PYTHONPATH run: | echo "PYTHONPATH=$PYTHONPATH:$(pwd)/src" >> $GITHUB_ENV diff --git a/.gitignore b/.gitignore index 62174ed..36918d2 100755 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,7 @@ data__DatasetsTest_tmp/ # Mac OS extentions *.DS_Store + +# Sphinx documentation +docs/_build/ + diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/docs/.readthedocs.yaml b/docs/.readthedocs.yaml new file mode 100644 index 0000000..7fb11d8 --- /dev/null +++ b/docs/.readthedocs.yaml @@ -0,0 +1,22 @@ +version: "2" + +build: + os: "ubuntu-20.04" + apt_packages: + - build-essential + - python3-dev + tools: + python: "3.11" + +python: + install: + - requirements: requirements1.txt + - requirements: requirements2.txt + - requirements: docs/requirements.txt + - method: pip + path: . + +sphinx: + builder: html + configuration: docs/source/conf.py + fail_on_warning: true diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +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) diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..53fc1f3 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,2 @@ +sphinx==7.1.2 +sphinx-rtd-theme==1.3.0rc1 diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 0000000..a803fb6 --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,33 @@ +API reference +************* + + +.. autosummary:: + :toctree: generated + + +Working with datasets +======================== +.. automodule:: base.custom_datasets + :members: + + +Creating and managing models +============================== +.. automodule:: models_builder.gnn_models + :members: + + +Interpretation +================== +.. automodule:: explainers.explainer + :members: + + + +Auxiliary functions +======================== +.. automodule:: aux.configs + :members: + + diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..3a5e0a2 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,66 @@ +# Configuration file for the Sphinx documentation builder. + +# -- Path setup -------------------------------------------------------------- + +# 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('../../src')) +sys.setrecursionlimit(1500) + +# -- Project information + +project = 'GNN-AID' +copyright = '2024, GNN-AID team' +author = 'GNN-AID team' + +release = '0.1' +version = '0.1.0' + +# -- General configuration + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.coverage', + 'sphinx.ext.doctest', + 'sphinx.ext.duration', + 'sphinx.ext.ifconfig', + 'sphinx.ext.intersphinx', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinx.ext.todo', +# 'sphinxcontrib.fulltoc', +] + +intersphinx_mapping = { + 'python': ('https://docs.python.org/3/', None), + 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), +} +intersphinx_disabled_domains = ['std'] + +templates_path = ['_templates'] + +# -- Options for HTML output + +html_theme = 'sphinx_rtd_theme' + +# -- Options for EPUB output +epub_show_urls = 'footnote' + +# --------------------- +autodoc_member_order = 'bysource' +autodoc_special_members = '__init__' + +# The default options for autodoc directives. They are applied to all autodoc directives automatically. It must be a dictionary which maps option names to the values. +autodoc_default_options = { + 'member-order': 'bysource', + 'special-members': '__init__', + 'exclude-members': '__weakref__', + 'ignore-module-all': True, +} + + diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..68dff36 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,19 @@ +Welcome to GNN-AID documentation! +=================================== + +GNN-AID is an open instrument for Analysis, Interpretation, and Defensing Graph Neural Networks for explaining your graph neural network with a number of existing explainers. + +Check out the :doc:`usage` section for further information, including +how to :ref:`installation` the project. + +.. note:: + + This project is under active development. + +Contents +-------- + +.. toctree:: + + usage + api diff --git a/docs/source/usage.rst b/docs/source/usage.rst new file mode 100644 index 0000000..89df652 --- /dev/null +++ b/docs/source/usage.rst @@ -0,0 +1,12 @@ +Usage +===== + +.. _installation: + +Installation +------------ + +To use GNN-AID, first install it using pip: + + + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..108c50c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,14 @@ +[build-system] +requires = ["flit_core >=3.2,<4"] +build-backend = "flit_core.buildapi" + +[project] +name = "src" +authors = [ + {name = "Mikhail Drobyshevskiy", email = "drobyshevsky@ispras.ru"}, + {name = "Kirill Lukyanov", email = "lukyanov.k@ispras.ru"}, ] +dynamic = ["description"] +version = "0.0.1" + +[tool.setuptools.dynamic] +#version = {file = "VERSION"} diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index f87d92a..0000000 --- a/requirements.txt +++ /dev/null @@ -1,48 +0,0 @@ -numpy==1.23.4 -multiprocess -pydantic -tqdm -pyparsing - -# For front-end javascript web-interface -flask==2.3.3 -Flask-SocketIO==5.3.2 -redis -six -scipy==1.14.0 -scikit-learn==1.4.0 -joblib -threadpoolctl -pytz -python-dateutil -statsmodels -patsy -packaging -opt-einsum -pandas==2.2.0 - -# For explainers -networkx==3.0 -dive-into-graphs==0.2.0 -pgmpy # PGMExplainer - -# For synthetic datasets -matplotlib - -# Possible (check!) -dgl -psutil -# tf2onnx==1.14.0 -# onnx2torch==1.2.0 -# onnx==1.10.0 - -# Base - models training -# For torch and components see README -torch==2.0.0 -torch_geometric==2.3.1 -torch_scatter==2.1.1 -torch_sparse==0.6.17 -torch-cluster==1.6.1 -torch-spline-conv==1.2.2 - - diff --git a/requirements1.txt b/requirements1.txt new file mode 100644 index 0000000..6ddf319 --- /dev/null +++ b/requirements1.txt @@ -0,0 +1,6 @@ +## These reqs need to be installed separately before the others + +networkx==3.0 # For explainers +docutils==0.18.1 # from sphinx==7.1.2 + +torch==2.0.0 \ No newline at end of file diff --git a/requirements2.txt b/requirements2.txt new file mode 100644 index 0000000..663e347 --- /dev/null +++ b/requirements2.txt @@ -0,0 +1,25 @@ +## These are reqs needed for documentation + +numpy==1.26.3 +multiprocess +pydantic +tqdm +pyparsing + +flask==2.3.3 # For front-end javascript web-interface +Flask-SocketIO==5.3.2 +redis +six +scipy==1.12.0 +scikit-learn==1.4.0 +joblib +threadpoolctl +pytz +python-dateutil +statsmodels +patsy +packaging +opt-einsum +pandas==2.2.0 + +torch_geometric==2.3.1 \ No newline at end of file diff --git a/requirements3.txt b/requirements3.txt new file mode 100644 index 0000000..c4b5736 --- /dev/null +++ b/requirements3.txt @@ -0,0 +1,20 @@ +## This is other reqs needed for the whole project + +# Base - models training +torch_scatter==2.1.1 +torch_sparse==0.6.17 +torch-cluster==1.6.1 +torch-spline-conv==1.2.2 + +# For explainers +dive-into-graphs==1.1.0 +pgmpy # PGMExplainer + +# For synthetic datasets +matplotlib + +# Possible (check!) +psutil +# tf2onnx==1.14.0 +# onnx2torch==1.2.0 +# onnx==1.10.0 diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..6a3a330 --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,3 @@ +""" Just a docstring """ + +__version__ = "" \ No newline at end of file diff --git a/src/aux/configs.py b/src/aux/configs.py index cb358e1..db5d524 100644 --- a/src/aux/configs.py +++ b/src/aux/configs.py @@ -399,175 +399,175 @@ class ModelStructureConfig(Config): Access by key and iterating behave like it is list. General principle for describing one layer of the network: - structure=[ - { - 'label': 'n' or 'g', - 'layer': { - ... - }, - 'batchNorm': { - ... - }, - 'activation': { - ... - }, - 'dropout': { - ... - }, - 'connections': [ - { - ... - }, - ... - ] - }, - { - new block - }, - ] + >>> structure=[ + >>> { + >>> 'label': 'n' or 'g', + >>> 'layer': { + >>> ... + >>> }, + >>> 'batchNorm': { + >>> ... + >>> }, + >>> 'activation': { + >>> ... + >>> }, + >>> 'dropout': { + >>> ... + >>> }, + >>> 'connections': [ + >>> { + >>> ... + >>> }, + >>> ... + >>> ] + >>> }, + >>> { + >>> new block + >>> }, + >>> ] For connections now support variant connection between layers with labels: n -> n, n -> g, g -> g Example connections: - 'connections': [ - { - 'into_layer': 3, - 'connection_kwargs': { - 'pool': { - 'pool_type': 'global_add_pool', - }, - 'aggregation_type': 'cat', - }, - }, - ], + >>> 'connections': [ + >>> { + >>> 'into_layer': 3, + >>> 'connection_kwargs': { + >>> 'pool': { + >>> 'pool_type': 'global_add_pool', + >>> }, + >>> 'aggregation_type': 'cat', + >>> }, + >>> }, + >>> ], into_layer: layer (block) index, numeration start from 0 For aggregation_type now support only cat pool_type has taken from torch_geometric.nn, pooling In the case of using GINConv, it is necessary to write the internal structure nn.Sequential(). For this case, a universal block logic is provided in the following format: - 'layer': { - 'layer_name': 'GINConv', - 'layer_kwargs': None, - 'gin_seq': [ - { - 'layer': { - 'layer_name': 'Linear', - ... - }, - }, - 'batchNorm': { - ... - }, - 'activation': { - ... - }, - }, - { - new block - }, - ], - ... - }, + >>> 'layer': { + >>> 'layer_name': 'GINConv', + >>> 'layer_kwargs': None, + >>> 'gin_seq': [ + >>> { + >>> 'layer': { + >>> 'layer_name': 'Linear', + >>> ... + >>> }, + >>> }, + >>> 'batchNorm': { + >>> ... + >>> }, + >>> 'activation': { + >>> ... + >>> }, + >>> }, + >>> { + >>> new block + >>> }, + >>> ], + >>> ... + >>> }, Examples: Example of conv layer: - { - 'label': 'n', - 'layer': { - 'layer_name': 'GATConv', - 'layer_kwargs': { - 'in_channels': dataset.num_node_features, - 'out_channels': 16, - 'heads': 3, - }, - }, - 'batchNorm': { - 'batchNorm_name': 'BatchNorm1d', - 'batchNorm_kwargs': { - 'num_features': 48, - 'eps': 1e-05, - } - }, - 'activation': { - 'activation_name': 'ReLU', - 'activation_kwargs': None, - }, - 'dropout': { - 'dropout_name': 'Dropout', - 'dropout_kwargs': { - 'p': 0.5, - } - }, - } + >>> { + >>> 'label': 'n', + >>> 'layer': { + >>> 'layer_name': 'GATConv', + >>> 'layer_kwargs': { + >>> 'in_channels': dataset.num_node_features, + >>> 'out_channels': 16, + >>> 'heads': 3, + >>> }, + >>> }, + >>> 'batchNorm': { + >>> 'batchNorm_name': 'BatchNorm1d', + >>> 'batchNorm_kwargs': { + >>> 'num_features': 48, + >>> 'eps': 1e-05, + >>> } + >>> }, + >>> 'activation': { + >>> 'activation_name': 'ReLU', + >>> 'activation_kwargs': None, + >>> }, + >>> 'dropout': { + >>> 'dropout_name': 'Dropout', + >>> 'dropout_kwargs': { + >>> 'p': 0.5, + >>> } + >>> }, + >>> } Example of gin layer: - { - 'label': 'n', - 'layer': { - 'layer_name': 'GINConv', - 'layer_kwargs': None, - 'gin_seq': [ - { - 'layer': { - 'layer_name': 'Linear', - 'layer_kwargs': { - 'in_features': dataset.num_node_features, - 'out_features': 16, - }, - }, - 'batchNorm': { - 'batchNorm_name': 'BatchNorm1d', - 'batchNorm_kwargs': { - 'num_features': 16, - 'eps': 1e-05, - } - }, - 'activation': { - 'activation_name': 'ReLU', - 'activation_kwargs': None, - }, - }, - { - 'layer': { - 'layer_name': 'Linear', - 'layer_kwargs': { - 'in_features': 16, - 'out_features': 16, - }, - }, - 'activation': { - 'activation_name': 'ReLU', - 'activation_kwargs': None, - }, - }, - ], - }, - 'connections': [ - { - 'into_layer': 3, - 'connection_kwargs': { - 'pool': { - 'pool_type': 'global_add_pool', - }, - 'aggregation_type': 'cat', - }, - }, - ], - } + >>> { + >>> 'label': 'n', + >>> 'layer': { + >>> 'layer_name': 'GINConv', + >>> 'layer_kwargs': None, + >>> 'gin_seq': [ + >>> { + >>> 'layer': { + >>> 'layer_name': 'Linear', + >>> 'layer_kwargs': { + >>> 'in_features': dataset.num_node_features, + >>> 'out_features': 16, + >>> }, + >>> }, + >>> 'batchNorm': { + >>> 'batchNorm_name': 'BatchNorm1d', + >>> 'batchNorm_kwargs': { + >>> 'num_features': 16, + >>> 'eps': 1e-05, + >>> } + >>> }, + >>> 'activation': { + >>> 'activation_name': 'ReLU', + >>> 'activation_kwargs': None, + >>> }, + >>> }, + >>> { + >>> 'layer': { + >>> 'layer_name': 'Linear', + >>> 'layer_kwargs': { + >>> 'in_features': 16, + >>> 'out_features': 16, + >>> }, + >>> }, + >>> 'activation': { + >>> 'activation_name': 'ReLU', + >>> 'activation_kwargs': None, + >>> }, + >>> }, + >>> ], + >>> }, + >>> 'connections': [ + >>> { + >>> 'into_layer': 3, + >>> 'connection_kwargs': { + >>> 'pool': { + >>> 'pool_type': 'global_add_pool', + >>> }, + >>> 'aggregation_type': 'cat', + >>> }, + >>> }, + >>> ], + >>> } Example of linear layer: - { - 'label': 'n', - 'layer': { - 'layer_name': 'Linear', - 'layer_kwargs': { - 'in_features': 48, - 'out_features': dataset.num_classes, - }, - }, - 'activation': { - 'activation_name': 'LogSoftmax', - 'activation_kwargs': None, - }, - } + >>> { + >>> 'label': 'n', + >>> 'layer': { + >>> 'layer_name': 'Linear', + >>> 'layer_kwargs': { + >>> 'in_features': 48, + >>> 'out_features': dataset.num_classes, + >>> }, + >>> }, + >>> 'activation': { + >>> 'activation_name': 'LogSoftmax', + >>> 'activation_kwargs': None, + >>> }, + >>> } """ def __init__(self, layers=None): diff --git a/src/models_builder/gnn_models.py b/src/models_builder/gnn_models.py index 2f0db13..6e2e676 100644 --- a/src/models_builder/gnn_models.py +++ b/src/models_builder/gnn_models.py @@ -161,7 +161,7 @@ def save_model(self, path=None): Save the model in torch format :param path: path to save the model. By default, - the path is compiled based on the global class variables + the path is compiled based on the global class variables """ raise NotImplementedError() @@ -172,6 +172,7 @@ def model_path_info(self): def load_model_executor(self, path=None, **kwargs): """ Load executor. Generates the download model path if no other path is specified. + :param path: path to load the model. By default, the path is compiled based on the global class variables """ @@ -212,9 +213,9 @@ def save_model_executor(self, path=None, gnn_architecture_path=None): and its parameters for saving :param gnn_architecture_path: path to save the architecture of the model, - by default it forms the path itself. + by default it forms the path itself. :param path: path to save the model. By default, - the path is compiled based on the global class variables + the path is compiled based on the global class variables """ if path is None: dir_path, files_paths = Declare.models_path(self) @@ -555,6 +556,7 @@ def get_name(self, **kwargs): def load_model(self, path=None, **kwargs): """ Load model from torch save format + :param path: path to load the model. By default, the path is compiled based on the global class variables """ @@ -573,7 +575,7 @@ def save_model(self, path=None): Save the model in torch format :param path: path to save the model. By default, - the path is compiled based on the global class variables + the path is compiled based on the global class variables """ torch.save(self.gnn.state_dict(), path) @@ -660,7 +662,7 @@ def run_model(self, gen_dataset, mask='test', out='answers'): :param gen_dataset: wrapper over the dataset, stores the dataset and all meta-information about the dataset :param mask: 'train', 'val', 'test', 'all' -- part of the dataset on which the output will be obtained :param out: 'answers', 'predictions', 'logits' -- what output format will be calculated, - availability depends on which methods have been overridden in the parent class + availability depends on which methods have been overridden in the parent class :return: """ try: @@ -776,13 +778,13 @@ def evaluate_model(self, gen_dataset, metrics): def compute_stats_data(self, gen_dataset, predictions=False, logits=False): """ :param gen_dataset: wrapper over the dataset, stores the dataset - and all meta-information about the dataset + and all meta-information about the dataset :param predictions: boolean flag that indicates the need to enter model predictions - in the statistics for the front + in the statistics for the front :param logits: boolean flag that indicates the need to enter model logits - in the statistics for the front + in the statistics for the front :return: dict with model weights. Also function can add in dict model predictions - and logits + and logits """ self.stats_data = {} @@ -877,7 +879,7 @@ def save_model(self, path=None): Save the model in torch format :param path: path to save the model. By default, - the path is compiled based on the global class variables + the path is compiled based on the global class variables """ torch.save({"model_state_dict": self.gnn.state_dict(), "best_prots": self.gnn.best_prots, @@ -886,6 +888,7 @@ def save_model(self, path=None): def load_model(self, path=None, **kwargs): """ Load model from torch save format + :param path: path to load the model. By default, the path is compiled based on the global class variables """