diff --git a/.gitattributes b/.gitattributes
index a6344aac8c09253b3b630fb776ae94478aa0275b..7c686966cc50eea41c8b745f35baaccba59ad3d7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+*.csv filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
diff --git a/.streamlit/config.toml b/.streamlit/config.toml
new file mode 100644
index 0000000000000000000000000000000000000000..508672a57fb1caf6378b84cf71d6d68e6a6d2df6
--- /dev/null
+++ b/.streamlit/config.toml
@@ -0,0 +1,19 @@
+[theme]
+base="light"
+
+# Primary accent for interactive elements
+primaryColor = '#0078aa'
+
+# Background color for the main content area
+# backgroundColor = '#273346'
+
+# Background color for sidebar and most interactive widgets
+# secondaryBackgroundColor = '#7d828c'
+
+# Color used for almost all text
+# textColor = '#4bc9ff'
+
+# Font family for all text in the app, except code blocks
+# Accepted values (serif | sans serif | monospace)
+# Default: "sans serif"
+# font = "sans serif"
\ No newline at end of file
diff --git a/README.md b/README.md
index 8385832fab599d9c95c4f72509c4e9ab212e63e5..29fb8da7b13aa98165cfc881994252300dd0f575 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,113 @@
---
-title: Mhnfs
-emoji: π
-colorFrom: yellow
-colorTo: purple
+title: MHNfs
+emoji: π¬
+short_description: Activity prediction for low-data scenarios
+colorFrom: gray
+colorTo: gray
sdk: streamlit
-sdk_version: 1.32.2
+sdk_version: 1.29.0
app_file: app.py
-pinned: false
-license: gpl-3.0
+pinned: true
---
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+# Activity Predictions with MHNfs for low-data scenarios
+
+## βοΈ Under the hood
+
+ The predictive model (MHNfs) used in this application was specifically designed and
+ trained for low-data scenarios. The model predicts whether a molecule is active or
+ inactive. The predicted activity value is a continuous value between 0 and 1, and,
+ similar to a probability, the higher/lower the value, the more confident the model
+ is that the molecule is active/inactive.
+
+ The model was trained on the FS-Mol dataset which
+ includes 5120 tasks (roughly 5000 tasks were used for training, rest for evaluation).
+ The training tasks are listed here:
+
https://github.com/microsoft/FS-Mol/tree/main/datasets/targets .
+
+
+## π― About few-shot learning and the model MHNfs
+
+ Few-shot learning is a machine learning sub-field which aims to provide
+ predictive models for scenarios in which only little data is known/available.
+
+ MHNfs is a few-shot learning model which is specifically designed for drug
+ discovery applications. It is built to use the input prompts in a way such that
+ the provided available knowledge, i.e. the known active and inactive molecules,
+ functions as context to predict the activity of the new requested molecules.
+ Precisely, the provided active and inactive molecules are associated with a
+ large set of general molecules - called context molecules - to enrich the
+ provided information and to remove spurious correlations arising from the
+ decoration of molecules. This is analogous to a Large Language Model which would
+ not only use the provided information in the current prompt as context but would
+ also have access to way more information, e.g., a prompting history.
+
+
+## π» Run the prediction pipeline locally for larger screening chunks
+
+### Get started:
+```bash
+# Copied from hugging face
+# Make sure you have git-lfs installed (https://git-lfs.com)
+git lfs install
+
+# Clone repo
+git clone https://huggingface.co/spaces/tschouis/mhnfs
+
+# Alternatively, if you want to clone without large files
+GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/spaces/tschouis/mhnfs
+```
+
+### Install requirements
+```bash
+pip install -r requirements.txt
+```
+Notably, this command was tested inside a conda environment with python 3.7.
+
+### Run the prediction pipeline:
+For your screening, load the model, i.e. the **Activity Predictor** into your python file or notebook and simply run it:
+```python
+from src.prediction_pipeline load ActivityPredictor
+
+# Define inputs
+query_smiles = ["C1CCCCC1", "C1CCCCC1", "C1CCCCC1", "C1CCCCC1"] # Replace with your data
+support_actives_smiles = ["C1CCCCC1", "C1CCCCC1"] # Replace with your data
+support_inactives_smiles = ["C1CCCCC1", "C1CCCCC1"] # Replace with your data
+
+# Make predictions
+predictions = predictor.predict(query_smiles, support_actives_smiles support_inactives_smiles)
+```
+
+* Provide molecules in SMILES notation.
+* Make sure that the inputs to the Activity Predictor are either comma separated lists, or flattened numpy arrays, or pandas DataFrames. In the latter case, there should be a "smiles" column (both upper and lower case "SMILES" are accepted). All other columns are ignored.
+
+
+
+### Run the app locally with streamlib:
+```bash
+# Navigate into root directory of this project
+cd .../whatever_your_dir_name_is/ # Replace with your path
+
+# Run streamlit app
+python -m streamlit run
+```
+
+
+## π€ Hugging face app
+Explore our hugging-face app here:
+
+## π Cite us
+
+```
+@inproceedings{
+ schimunek2023contextenriched,
+ title={Context-enriched molecule representations improve few-shot drug discovery},
+ author={Johannes Schimunek and Philipp Seidl and Lukas Friedrich and Daniel Kuhn and Friedrich Rippmann and Sepp Hochreiter and GΓΌnter Klambauer},
+ booktitle={The Eleventh International Conference on Learning Representations},
+ year={2023},
+ url={https://openreview.net/forum?id=XrMWUuEevr}
+}
+```
+
+
diff --git a/app.py b/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..b9a33518d3d236f90b5e8aa6d906ff4cdc8cc557
--- /dev/null
+++ b/app.py
@@ -0,0 +1,65 @@
+"""
+This script runs the streamlit app for MHNfs
+
+MHNfs: Few-shot method for drug discovery activity predictions
+ (https://openreview.net/pdf?id=XrMWUuEevr)
+"""
+
+# --------------------------------------------------------------------------------------
+# Imports
+import streamlit as st
+
+from src.app.layout import LayoutMaker
+from src.app.prediction_utils import (create_prediction_df,
+ create_molecule_grid_plot)
+from src.prediction_pipeline import ActivityPredictor
+
+# --------------------------------------------------------------------------------------
+# Functions
+class App():
+ def __init__(self):
+ # Set page configration to wide
+ st.set_page_config(layout="wide", page_title="MHNfs", page_icon="π¬")
+
+ # Layout maker
+ self.layoutMaker = LayoutMaker()
+
+ # Load mhnfs model
+ self.predictor = ActivityPredictor()
+
+ def define_layout(self):
+
+ # Define Sidebar width
+ css = '''
+
+ '''
+ st.markdown(css, unsafe_allow_html=True)
+
+ # Sidebar
+ self.inputs, self.buttons = self.layoutMaker.make_sidebar()
+
+ # Main page
+ # - header
+ self.layoutMaker.make_header()
+
+ # - main body
+ self.layoutMaker.make_main_content_area(self.predictor,
+ self.inputs,
+ self.buttons,
+ create_prediction_df,
+ create_molecule_grid_plot)
+
+def run_app():
+ app = App()
+ app.define_layout()
+
+
+# --------------------------------------------------------------------------------------
+# Run script
+if __name__ == "__main__":
+ run_app()
diff --git a/assets/data_preprocessing_objects/ecdfs.pkl b/assets/data_preprocessing_objects/ecdfs.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..7fbab090f3b42d53c49654def367089b26477d68
--- /dev/null
+++ b/assets/data_preprocessing_objects/ecdfs.pkl
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eeec12688fd9e0bb0bbd68d5203e2fb46c45d30a07417f0883adbfc133d48e9f
+size 520417347
diff --git a/assets/data_preprocessing_objects/scaler_fitted.pkl b/assets/data_preprocessing_objects/scaler_fitted.pkl
new file mode 100755
index 0000000000000000000000000000000000000000..0661f6a057e0debdcbc0f9edcd9d1f802ac46edd
--- /dev/null
+++ b/assets/data_preprocessing_objects/scaler_fitted.pkl
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4538c1c1d9b5b50d29a14c14134f66a563c3a0f4022ce77b8eb2959c3eff51ea
+size 54501
diff --git a/assets/example_csv/.~lock.known_inactive_molecules.csv# b/assets/example_csv/.~lock.known_inactive_molecules.csv#
new file mode 100644
index 0000000000000000000000000000000000000000..6aac86237cd3e80015c7e16f5769a5def850e413
--- /dev/null
+++ b/assets/example_csv/.~lock.known_inactive_molecules.csv#
@@ -0,0 +1 @@
+,johannes,Latitude-5501,02.01.2024 15:57,file:///home/johannes/.config/libreoffice/4;
\ No newline at end of file
diff --git a/assets/example_csv/known_active_molecules.csv b/assets/example_csv/known_active_molecules.csv
new file mode 100644
index 0000000000000000000000000000000000000000..907303100b4fa831a5adb782eb0ebbd9fe64826c
--- /dev/null
+++ b/assets/example_csv/known_active_molecules.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bc98c05246b42d84c6833d191efa32c7c6473d76c5f2719c8ff3310cfe22df04
+size 353
diff --git a/assets/example_csv/known_inactive_molecules.csv b/assets/example_csv/known_inactive_molecules.csv
new file mode 100644
index 0000000000000000000000000000000000000000..2861e2b837c19d703a459c11898a8bcf6a069fe1
--- /dev/null
+++ b/assets/example_csv/known_inactive_molecules.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a6e183c33b7445ae0c00bea4a7cdae52bfce14da2829f6827e20dda162df23af
+size 363
diff --git a/assets/example_csv/molecules_for_prediction.csv b/assets/example_csv/molecules_for_prediction.csv
new file mode 100644
index 0000000000000000000000000000000000000000..46f476e8b149a54d7ba5048930d3ded4faf38b88
--- /dev/null
+++ b/assets/example_csv/molecules_for_prediction.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:497adfdbd026c7ab7d1564b685a246fcb7eb6eabb2442918862b31ccd0b32369
+size 460
diff --git a/assets/example_csv/predictions/nottrustworthy_example.csv b/assets/example_csv/predictions/nottrustworthy_example.csv
new file mode 100644
index 0000000000000000000000000000000000000000..18bbee0dbc0ff12ccb73b4e749bf62c22f2c21a9
--- /dev/null
+++ b/assets/example_csv/predictions/nottrustworthy_example.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3f8b5e017175b8d62982b1fc4138a4348f51b6a0469c32df991f5d2576a679d
+size 588
diff --git a/assets/example_csv/predictions/nottrustworthy_example.png b/assets/example_csv/predictions/nottrustworthy_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f9ab8ff9fa7e16f3cdbfcca74fa0049e52a1194
--- /dev/null
+++ b/assets/example_csv/predictions/nottrustworthy_example.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae7aff2e2cd2e68bdcb4a5563be38c13d7780453443657b36f01333ab57a949c
+size 25505
diff --git a/assets/example_csv/predictions/trustworthy_example.csv b/assets/example_csv/predictions/trustworthy_example.csv
new file mode 100644
index 0000000000000000000000000000000000000000..1ebd92bc23042b661efe278566a608ab914913a3
--- /dev/null
+++ b/assets/example_csv/predictions/trustworthy_example.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3517bcef4a9998975b031d1b4f2b4aa29679669079100230f84e27bc06f80c02
+size 889
diff --git a/assets/example_csv/predictions/trustworthy_example.png b/assets/example_csv/predictions/trustworthy_example.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2709d25f963f96ef45b994ff2b7ab35a5b5c887
--- /dev/null
+++ b/assets/example_csv/predictions/trustworthy_example.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df2a73cdf527546e8b078cb45618b4554a77f11fdd48367ef25939e0a6a2b518
+size 28331
diff --git a/assets/header.png b/assets/header.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5c71fbddd84d37cae9f0f6d62becfd7a47bea9e
--- /dev/null
+++ b/assets/header.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1d355c5fc158281371a09759584110e611c810d2442e8aad30551998aa728f0a
+size 122706
diff --git a/assets/logo.png b/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..a306190a2f0ac4f404745bf23609cade08260287
--- /dev/null
+++ b/assets/logo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:505cc795dcaac622e2af6bf2ed118d7ab28d3eab27fd421755844c042ed7646a
+size 40875
diff --git a/assets/mhnfs_data/cfg.yaml b/assets/mhnfs_data/cfg.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..20686869fab8fcae751e6349a348a7df5066e284
--- /dev/null
+++ b/assets/mhnfs_data/cfg.yaml
@@ -0,0 +1,42 @@
+model:
+ encoder:
+ activation: selu
+ input_dim: 2248
+ number_hidden_layers: 0
+ number_hidden_neurons: 1024
+ regularization:
+ input_dropout: 0.1
+ dropout: 0.5
+ layerNormBlock:
+ affine: False
+ usage: True
+ transformer:
+ activity_embedding_dim: 64
+ number_heads: 8
+ dim_forward: 567
+ dropout: 0.5
+ num_layers: 1
+ ss_dropout: 0.1
+ hopfield:
+ dim_QK: 512
+ heads: 8
+ beta: 0.044194173824159216
+ dropout: 0.5
+ prediction_scaling: 0.044194173824159216
+ associationSpace_dim: 1024
+ similarityModule:
+ type: cosineSim
+ l2Norm: False
+ scaling: 1/N
+ training:
+ optimizer: AdamW
+ batch_size: 512
+ lr: 0.0001
+ weightDecay: 0.0
+ lrScheduler:
+ usage: True
+ context:
+ ratio_training_molecules: 0.05
+system:
+ ressources:
+ device: cpu
diff --git a/assets/mhnfs_data/full_context_set.npy b/assets/mhnfs_data/full_context_set.npy
new file mode 100755
index 0000000000000000000000000000000000000000..d15fb13e1c80dd060fcbf7d7e580c609adef9140
--- /dev/null
+++ b/assets/mhnfs_data/full_context_set.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ed40b8d9cc39859772af0d32ed69c7f2467b9235f83f37ff42611bc22828e52
+size 3899416896
diff --git a/assets/mhnfs_data/mhnfs_checkpoint.ckpt b/assets/mhnfs_data/mhnfs_checkpoint.ckpt
new file mode 100644
index 0000000000000000000000000000000000000000..89fb2781a24f2398d093d3fdc743995ef399235b
--- /dev/null
+++ b/assets/mhnfs_data/mhnfs_checkpoint.ckpt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:25fcfdb7c6355b7781edaefc9ec56351f012356b17e4087f72b0a78c6d8e2300
+size 313588174
diff --git a/assets/mhnfs_overview.png b/assets/mhnfs_overview.png
new file mode 100644
index 0000000000000000000000000000000000000000..d56d2c0c46fbe515685c4ca805cce81e6d215541
--- /dev/null
+++ b/assets/mhnfs_overview.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f89731eaf842e6018b4153d60193ea57442fb5933774135a653d4b70ac48afe2
+size 466946
diff --git a/assets/test_reference_data/ecfps.npy b/assets/test_reference_data/ecfps.npy
new file mode 100644
index 0000000000000000000000000000000000000000..e329a21664a03188ea6cf18774762266c493d8a5
--- /dev/null
+++ b/assets/test_reference_data/ecfps.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:056a628c308cf69e647f2c86090f8f93c2aedcd719845f57f11e653ce6d9d70b
+size 24704
diff --git a/assets/test_reference_data/model_input_query.pt b/assets/test_reference_data/model_input_query.pt
new file mode 100644
index 0000000000000000000000000000000000000000..513ad54892b7e5e6bf4cdec17ddd0dfbdd449352
--- /dev/null
+++ b/assets/test_reference_data/model_input_query.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e889558eb3300355b5c6ea0ce1518bb949141238b8d26b257ec1bd496baeda18
+size 36715
diff --git a/assets/test_reference_data/model_input_support_actives.pt b/assets/test_reference_data/model_input_support_actives.pt
new file mode 100644
index 0000000000000000000000000000000000000000..17bed4d70ffe83df73704148a9331b53388d0a11
--- /dev/null
+++ b/assets/test_reference_data/model_input_support_actives.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e5e55816e09597d267fb91297a56f58a4f4420ed32340650be4c1dd37efe1656
+size 72683
diff --git a/assets/test_reference_data/model_input_support_inactives.pt b/assets/test_reference_data/model_input_support_inactives.pt
new file mode 100644
index 0000000000000000000000000000000000000000..b59ba16f1a2537f88a66cdf633db24cbf369da45
--- /dev/null
+++ b/assets/test_reference_data/model_input_support_inactives.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e62e8b18da47d1c9475c18bc2ad50a563f10f0d0bced247d848e453321a13ced
+size 72683
diff --git a/assets/test_reference_data/model_predictions.pt b/assets/test_reference_data/model_predictions.pt
new file mode 100644
index 0000000000000000000000000000000000000000..fd8e6d8a51d47afcf6f0de8858dafc30d6ce899d
--- /dev/null
+++ b/assets/test_reference_data/model_predictions.pt
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7e63ad2ad9b664e3301479427f8d5cf005c979d7cc9e4bce033f18640eb4df0
+size 747
diff --git a/assets/test_reference_data/preprocessed_features.npy b/assets/test_reference_data/preprocessed_features.npy
new file mode 100644
index 0000000000000000000000000000000000000000..f1dc33ac3aa07b8821a65da45e4003495ea31144
--- /dev/null
+++ b/assets/test_reference_data/preprocessed_features.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e97dc7eb85509c6b07156292b57a1bee4eaa8d60fbdb40c7e2e5738c8c6a460
+size 54080
diff --git a/assets/test_reference_data/rdkit_descr_quantils.npy b/assets/test_reference_data/rdkit_descr_quantils.npy
new file mode 100644
index 0000000000000000000000000000000000000000..b50a6ef8039d1f6438cc59d82b17cd2590605de9
--- /dev/null
+++ b/assets/test_reference_data/rdkit_descr_quantils.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cde4d2fd8658cdbcd55e75f14cb360cfa1b239f99d281c1f7296449636e94c6a
+size 4928
diff --git a/assets/test_reference_data/rdkit_descrs.npy b/assets/test_reference_data/rdkit_descrs.npy
new file mode 100644
index 0000000000000000000000000000000000000000..ece95389f506b58a7036eb0a269e1657e980cad4
--- /dev/null
+++ b/assets/test_reference_data/rdkit_descrs.npy
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1b06153004b3f2ac02f0cefd16b0f17225527bbf53f8efe6e43c035b3d21690
+size 2528
diff --git a/assets/test_reference_data/smiles.pkl b/assets/test_reference_data/smiles.pkl
new file mode 100644
index 0000000000000000000000000000000000000000..77e90c8a544d78a2023574e841bf0d81b832bf05
--- /dev/null
+++ b/assets/test_reference_data/smiles.pkl
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0168a7aaa6f7f3eca611a42d70782bae9eb970194449320d37b64f5a8c264f9
+size 179
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..496ae46a66a97f77254f8e181c48ba09ec723c2e
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,10 @@
+rdkit==2022.3.3
+pytorch-lightning==1.6.1
+torch==1.13.1
+numpy==1.21.5
+pandas==1.3.5
+omegaconf==2.1.2
+mols2grid==1.1.1
+scikit-learn
+statsmodels==0.13.5
+streamlit
\ No newline at end of file
diff --git a/src/__init__.py b/src/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/__pycache__/__init__.cpython-37.pyc b/src/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..16665065e80e1a7344af4b094b1df63ace5189d8
Binary files /dev/null and b/src/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/__pycache__/prediction_pipeline.cpython-37.pyc b/src/__pycache__/prediction_pipeline.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cc9e266ea5f1b7b0ebca3f8e977514f3c4c89f4f
Binary files /dev/null and b/src/__pycache__/prediction_pipeline.cpython-37.pyc differ
diff --git a/src/app/__pycache__/constants.cpython-37.pyc b/src/app/__pycache__/constants.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..66b6c4afa19390d172e3ff5ed5baafd3159db677
Binary files /dev/null and b/src/app/__pycache__/constants.cpython-37.pyc differ
diff --git a/src/app/__pycache__/layout.cpython-37.pyc b/src/app/__pycache__/layout.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..cddf59c07ff5cce1e03d8b4fd9c8ca1e5ea6391f
Binary files /dev/null and b/src/app/__pycache__/layout.cpython-37.pyc differ
diff --git a/src/app/__pycache__/prediction_utils.cpython-37.pyc b/src/app/__pycache__/prediction_utils.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2a5351001c478b42f20803d341b223ea166c78e7
Binary files /dev/null and b/src/app/__pycache__/prediction_utils.cpython-37.pyc differ
diff --git a/src/app/constants.py b/src/app/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..bd6844863797c2e005833589612792853fec2ccc
--- /dev/null
+++ b/src/app/constants.py
@@ -0,0 +1,269 @@
+"""
+This file includes all the constant content shown in the app
+"""
+
+# --------------------------------------------------------------------------------------
+
+summary_text = ('''
+ This application allows you to make **activity predictions** for
+ **biological targets** for which you have only a **little knowledge** in
+ terms of known active and inactive molecules.
+
+ **Provide** via the sidebar:\n
+ - some active molecules,
+ - some inactive molecules, and
+ - molecules you want to predict.
+
+ Hit **Predict** and explore the predictions!
+
+ For more **information** about the **model** and **how to provide the
+ molecules**, please visit the **Additional Information** tab.
+ ''')
+
+mhnfs_text =('''
+
+
+
+
+
Abstract . A central task in computational drug discovery is to construct
+ models from known active molecules to find further promising molecules for
+ subsequent screening. However, typically only very few active molecules are
+ known. Therefore, few-shot learning methods have the potential to improve the
+ effectiveness of this critical phase of the drug discovery process. We introduce
+ a new method for few-shot drug discovery. Its main idea is to enrich a molecule
+ representation by knowledge about known context or reference molecules. Our
+ novel concept for molecule representation enrichment is to associate molecules
+ from both the support set and the query set with a large set of reference
+ (context) molecules through a modern Hopfield network. Intuitively, this
+ enrichment step is analogous to a human expert who would associate a given
+ molecule with familiar molecules whose properties are known. The enrichment step
+ reinforces and amplifies the covariance structure of the data, while
+ simultaneously removing spurious correlations arising from the decoration of
+ molecules. Our approach is compared with other few-shot methods for drug
+ discovery on the FS-Mol benchmark dataset. On FS-Mol, our approach outperforms
+ all compared methods and therefore sets a new state-of-the art for few-shot
+ learning in drug discovery. An ablation study shows that the enrichment step of
+ our method is the key to improve the predictive quality. In a domain shift
+ experiment, we further demonstrate the robustness of our method. Code is
+ available at
https://github.com/ml-jku/MHNfs .
+
+
+
+ ''')
+
+citation_text = '''
+ ###
+ @inproceedings{
+ schimunek2023contextenriched,
+ title={Context-enriched molecule representations improve few-shot drug discovery},
+ author={Johannes Schimunek and Philipp Seidl and Lukas Friedrich and Daniel Kuhn and Friedrich Rippmann and Sepp Hochreiter and GΓΌnter
+ Klambauer},
+ booktitle={The Eleventh International Conference on Learning Representations},
+ year={2023},
+ url={https://openreview.net/forum?id=XrMWUuEevr}
+ }
+ '''
+
+few_shot_learning_text = (
+ '''
+
+ Few-shot learning is a machine learning sub-field which aims to provide
+ predictive models for scenarios in which only little data is known/available.
+
+
+ MHNfs is a few-shot learning model which is specifically designed for drug
+ discovery applications. It is built to use the input prompts in a way such that
+ the provided available knowledge, i.e. the known active and inactive molecules,
+ functions as context to predict the activity of the new requested molecules.
+ Precisely, the provided active and inactive molecules are associated with a
+ large set of general molecules - called context molecules - to enrich the
+ provided information and to remove spurious correlations arising from the
+ decoration of molecules. This is analogous to a Large Language Model which would
+ not only use the provided information in the current prompt as context but would
+ also have access to way more information, e.g., a prompting history.
+
+ ''')
+
+under_the_hood_text = ('''
+
+ The predictive model (MHNfs) used in this application was specifically designed and
+ trained for low-data scenarios. The model predicts whether a molecule is active or
+ inactive. The predicted activity value is a continuous value between 0 and 1, and,
+ similar to a probability, the higher/lower the value, the more confident the model
+ is that the molecule is active/inactive.
+
+ The model was trained on the FS-Mol dataset which
+ includes 5120 tasks (roughly 5000 tasks were used for training, rest for evaluation).
+ The training tasks are listed here:
+
https://github.com/microsoft/FS-Mol/tree/main/datasets/targets .
+
+ ''')
+
+usage_text = ('''
+
+ To use this application, you need to provide
3 different sets of molecules :
+
+ active molecules: set of known active molecules,
+ inactive molecules: set of known inactive molecules, and
+ molecules to predict : set of molecules you want to predict.
+
+ These three sets can be provided via the
sidebar . The sidebar also includes two
+ buttons
predict and
reset to run the prediction pipeline and to
+ reset it.
+
+ ''')
+
+data_text = ('''
+
+
+ Molecules have to be provided in SMILES format
+ For each input, the maximum number of molecules which can be provided is
+ restricted to 20
+ You can provide the molecules via the text boxes or via CSV upload
+
+ Text box
+
+ Replace the pseudo input by directly typing your molecules
+ into
+ the text box
+ Separate the molecules by comma
+
+
+ CSV upload
+
+ The CSV file should include a "smiles" column (both upper
+ and lower case "SMILES" are accepted)
+ All other columns will be ignored
+ Examples are provided here:
+
+ assets/example_csv/
+
+
+
+
+
+
+
+ ''')
+
+trust_text = ('''
+
+ Just like all other machine learning models, the performance of MHNfs varies
+ and, generally, the model works well if the task is somehow close to tasks which
+ were used to train the model. The model performance for very different tasks is
+ unclear and might be poor.
+
+
+ MHNfs was trained on the FS-Mol dataset which includes 5120 tasks (roughly
+ 5000 tasks were used for training, rest for evaluation). The training tasks are
+ listed here:
https://github.com/microsoft/FS-Mol/tree/main/datasets/targets .
+
+ ''')
+
+example_trustworthy_text = ('''
+
+ Since the predicitve model has seen a lot of kinase related tasks during training,
+ the model is expected to generally perform well on kinase targets. For this example,
+ we use data for the target
+
CHEMBL5914 . Notably, this specific kinase has not been seen
+ during training. Precisely, we use the available inhibition data while molecules
+ with an inhibition value greater (smaller) than 50 % are considered as active
+ (inactive).
+
+ From the known available data, we have selected 4 "known" active molecules,
+ 8 "known" inactive molecules, and 11 molecules to predict.
+
+
Molecules to predict :
+
+ FC(F)(F)c1ccc(Cl)cc1CN1CCNc2ncc(-c3ccnc(N4CCNCC4)c3)cc21,
+ CS(=O)(=O)c1ccc(-n2nc(-c3cnc4[nH]ccc4c3)c3c(N)ncnc32)cc1,
+ O=C(Nc1ccccc1Cl)c1cnc2ccc(C3CCNCC3)cn12.O=C(O)C(=O)O,
+ CC(C)n1cnc2c(Nc3cccc(Cl)c3)nc(N[C@@H]3CCCC[C@@H]3N)nc21,
+ Nc1ncc(-c2ccc(NS(=O)(=O)C3CC3)cc2F)cc1-c1ccc2c(c1)CCNC2=O,
+ CCN1CCN(Cc2ccc(NC(=O)c3ccc(C)c(C#Cc4cccnc4)c3)cc2C(F)(F)F)CC1,
+ CN1CCN(c2ccc(-c3cnc4c(c3)N(Cc3cc(Cl)ccc3C(F)(F)F)CCN4)cn2)CC1,
+ CC(C)n1nc(-c2cnc(N)c(OC(F)(F)F)c2)cc1[C@H]1[C@@H]2CN(C3COC3)C[C@@H]21,
+ Nc1ncc(-c2cc([C@H]3[C@@H]4CN(C5COC5)C[C@@H]43)n(CC3CC3)n2)cc1C(F)(F)F,
+ Cc1ccc(NC(=O)C2(C(=O)Nc3ccc(Nc4ncc(F)c(-c5cc(F)c6nc(C)n(C(C)C)c6c5)n4)cc3)CC2)cc1,
+ C[C@@H](Oc1cc(-c2cnn(C3CCNCC3)c2)cnc1N)c1c(Cl)ccc(F)c1Cl
+
+
+
Known active molecules :
+
+ CC(=O)N1CCN(c2cc(-c3cnc4c(c3)N(Cc3cc(Cl)ccc3C(F)(F)F)CCN4)ccn2)CC1,
+ CS(=O)(=O)c1cccc(Nc2nccc(-c3sc(N4CCOCC4)nc3-c3cccc(NS(=O)(=O)c4c(F)cccc4F)c3)n2)c1,
+ COc1cnccc1Nc1nc(-c2nn(Cc3c(F)cc(OCCO)cc3F)c3ccccc23)ncc1OC,
+ CN(C)[C@@H]1CC[C@@]2(C)[C@@H](CC[C@@H]3[C@@H]2CC[C@]2(C)C(c4cccc5cnccc45)=CC[C@@H]32)C1
+
+
+
Known inactive molecules :
+
+ c1cc(-c2c[nH]c3cnccc23)ccn1,
+ COc1ccc2c3ccnc(C(F)(F)F)c3n(CCCCN)c2c1,
+ CNS(=O)(=O)c1ccc(N(C)C)c(Nc2ncnc3cc(OC)c(OC)cc23)c1,
+ CN(C1CC1)S(=O)(=O)c1ccc(-c2cnc(N)c(-c3ccc4c(c3)CCNC4=O)c2)c(F)c1,
+ CCN1CCN(Cc2ccc(NC(=O)c3ccc(C)c(C#Cc4cnc5[nH]ccc5c4)c3)cc2C(F)(F)F)CC1,
+ CC(C)n1cc(-c2cc(-c3ccc(CN4CCOCC4)cc3)cnc2N)nn1,
+ CC(C)(O)[C@H](F)CN1Cc2cc(NC(=O)c3cnn4cccnc34)c(N3CCOCC3)cc2C1=O,
+ [2H]C([2H])([2H])C1(C([2H])([2H])[2H])Cn2nc(-c3ccc(F)cn3)c(-c3ccnc4[nH]ncc34)c2CO1
+
+
+
Predictions :
+
+
+ ''')
+
+example_nottrustworthy_text = ('''
+
+ For this example, we use data for the auxiliary transport protein target
+
CHEMBL5738 . Precisely, we use the available Ki data
+ while molecules with a pCHEMBL value greater (smaller) than 5 are considered
+ as active (inactive).
+
+ From the known available data, we have selected 4 "known" active molecules,
+ 3 "known" inactive molecules, and 10 molecules to predict.
+
+
Molecules to predict :
+
+ CC(C(=O)O)c1ccc(-c2ccccc2)c(F)c1,
+ O=S(=O)(O)Oc1cccc2cccc(Nc3ccccc3)c12,
+ CCCCCCCC/C=C\CCCCCCCC(=O)O,
+ C[C@]12C=CC(=O)C=C1CC[C@@H]1[C@@H]2[C@@H](O)C[C@@]2(C)[C@H]1CC[C@]2(O)C(=O)CO,
+ CCOC(=O)C(C)(C)Oc1ccc(Cl)cc1,
+ Cc1ccc(Cl)c(Nc2ccccc2C(=O)O)c1Cl,
+ O=C(O)Cc1ccccc1Nc1c(Cl)cccc1Cl,
+ CC(C)(Oc1ccc(CCNC(=O)c2ccc(Cl)cc2)cc1)C(=O)O,
+ O=C(c1ccccc1)c1ccc2n1CCC2C(=O)O,
+ CC(C)OC(=O)C(C)(C)Oc1ccc(C(=O)c2ccc(Cl)cc2)cc1
+
+
+
Known active molecules :
+
+ CC(C(=O)O)c1ccc(N2Cc3ccccc3C2=O)cc1,
+ CN1C(=O)CN=C(c2ccccc2)c2cc(Cl)ccc21,
+ CC(C)(Oc1ccc(C(=O)c2ccc(Cl)cc2)cc1)C(=O)O,
+ CC(=O)[C@H]1CC[C@H]2[C@@H]3CCC4=CC(=O)CC[C@]4(C)[C@H]3CC[C@]12C
+
+
+
+
Known inactive molecules :
+
+ CC(C)Cc1ccc(C(C)C(=O)O)cc1,
+ O=C1Nc2ccc(Cl)cc2C(c2ccccc2Cl)=NC1O,
+ C[C@@H]1C[C@H]2[C@@H]3CCC4=CC(=O)C=C[C@]4(C)[C@@]3(F)[C@@H](O)C[C@]2(C)[C@@]1(O)C(=O)CO
+
+
+
Predictions :
+
+
+ ''')
\ No newline at end of file
diff --git a/src/app/layout.py b/src/app/layout.py
new file mode 100644
index 0000000000000000000000000000000000000000..61fe081e303a9d9b9033d02ecf172cc2e190295a
--- /dev/null
+++ b/src/app/layout.py
@@ -0,0 +1,439 @@
+"""
+This file defines the layout of the app including the header, sidebar, and tabs in the
+main content area.
+"""
+
+#---------------------------------------------------------------------------------------
+# Imports
+import streamlit as st
+import streamlit.components.v1 as components
+from PIL import Image
+import pandas as pd
+import yaml
+
+from src.data_preprocessing.create_descriptors import handle_inputs
+from src.app.constants import (summary_text,
+ mhnfs_text,
+ citation_text,
+ few_shot_learning_text,
+ under_the_hood_text,
+ usage_text,
+ data_text,
+ trust_text,
+ example_trustworthy_text,
+ example_nottrustworthy_text)
+#---------------------------------------------------------------------------------------
+# Global variables
+MAX_INPUT_LENGTH = 20
+
+#---------------------------------------------------------------------------------------
+# Functions
+
+class LayoutMaker():
+ """
+ This class includes all the design choices regarding the layout of the app. This
+ class can be used in the main file to define header, sidebar, and main content area.
+ """
+
+ def __init__(self):
+
+ # Initialize the inputs dictionary
+ self.inputs = dict() # this will be the storage for query and support set inputs
+ self.inputs_lists = dict()
+
+ # Initialize prediction storage
+ self.predictions = None
+
+ # Buttons
+ self.buttons = dict() # this will be the storage for buttons
+
+ # content
+ self.summary_text = summary_text
+ self.mhnfs_text = mhnfs_text
+ self.citation_text = citation_text
+ self.few_shot_learning_text = few_shot_learning_text
+ self.under_the_hood_text = under_the_hood_text
+ self.usage_text = usage_text
+ self.data_text = data_text
+ self.trust_text = trust_text
+ self.example_trustworthy_text = example_trustworthy_text
+ self.example_nottrustworthy_text = example_nottrustworthy_text
+
+ self.df_trustworthy = pd.read_csv("./assets/example_csv/predictions/"
+ "trustworthy_example.csv")
+ self.df_nottrustworthy = pd.read_csv("./assets/example_csv/predictions/"
+ "nottrustworthy_example.csv")
+
+ self.max_input_length = MAX_INPUT_LENGTH
+
+ def make_sidebar(self):
+ """
+ This function defines the sidebar of the app. It includes the logo, query box,
+ support set boxes, and predict buttons.
+ It returns the stored inputs (for query and support set) and the buttons which
+ allow for user interactions.
+ """
+ with st.sidebar:
+ # Logo
+ logo = Image.open("./assets/logo.png")
+ st.image(logo)
+ st.divider()
+
+ # Query box
+ self._make_query_box()
+ st.divider()
+
+ # Support set actives box
+ self._make_active_support_set_box()
+ st.divider()
+
+ # Support set inactives box
+ self._make_inactive_support_set_box()
+ st.divider()
+
+ # Predict buttons
+ self.buttons["predict"] = st.button("Predict...")
+ self.buttons["reset"] = st.button("Reset")
+
+ return self.inputs, self.buttons
+
+ def make_header(self):
+ """
+ This function defines the header of the app. It consists only of a png image
+ in which the title and an overview is given.
+ """
+
+ header_container = st.container()
+ with header_container:
+ header = Image.open("./assets/header.png")
+ st.image(header)
+
+ def make_main_content_area(self,
+ predictor,
+ inputs,
+ buttons,
+ create_prediction_df: callable,
+ create_molecule_grid_plot: callable):
+
+
+ tab1, tab2, tab3, tab4 = st.tabs(["Predictions",
+ "Paper / Cite",
+ "Additional Information",
+ "Examples"])
+
+ # Results tab
+ with tab1:
+ self._fill_tab_with_results_content(predictor,
+ inputs,
+ buttons,
+ create_prediction_df,
+ create_molecule_grid_plot)
+
+ # Paper tab
+ with tab2:
+ self._fill_paper_and_citation_tab()
+
+ # More explanations tab
+ with tab3:
+ self._fill_more_explanations_tab()
+
+ with tab4:
+ self._fill_examples_tab()
+
+ def _make_query_box(self):
+ """
+ This function
+ a) defines the query box and
+ b) stores the query input in the inputs dictionary
+ """
+
+ st.info(":blue[Molecules to predict:]", icon="β")
+
+ query_container = st.container()
+ with query_container:
+ input_choice = st.radio(
+ "Input your data in SMILES notation via:", ["Text box", "CSV upload"]
+ )
+ if input_choice == "Text box":
+ query_input = st.text_area(
+ label="SMILES input for query molecules",
+ label_visibility="hidden",
+ key="query_textbox",
+ value="CC(C)Sc1nc(C(C)(C)C)nc(OCC(=O)O)c1C#N, "
+ "Cc1nc(NCc2cccnc2)cc(=O)n1CC(=O)O",
+ )
+ elif input_choice == "CSV upload":
+ query_file = st.file_uploader(key="query_csv",
+ label = "CSV upload for query mols",
+ label_visibility="hidden")
+ if query_file is not None:
+ query_input = pd.read_csv(query_file)
+ else: query_input = None
+
+ # Update storage
+ self.inputs["query"] = query_input
+
+ def _make_active_support_set_box(self):
+ """
+ This function
+ a) defines the active support set box and
+ b) stores the active support set input in the inputs dictionary
+ """
+
+ st.info(":blue[Known active molecules:]", icon="β¨")
+ active_container = st.container()
+ with active_container:
+ active_input_choice = st.radio(
+ "Input your data in SMILES notation via:",
+ ["Text box", "CSV upload"],
+ key="active_input_choice",
+ )
+
+ if active_input_choice == "Text box":
+ support_active_input = st.text_area(
+ label="SMILES input for active support set molecules",
+ label_visibility="hidden",
+ key="active_textbox",
+ value="Cc1nc(NCC2CCCCC2)c(C#N)c(=O)n1CC(=O)O, "
+ "CSc1nc(C(C)C)nc(OCC(=O)O)c1C#N"
+ )
+ elif active_input_choice == "CSV upload":
+ support_active_file = st.file_uploader(
+ key="support_active_csv",
+ label = "CSV upload for active support set molecules",
+ label_visibility="hidden"
+ )
+ if support_active_file is not None:
+ support_active_input = pd.read_csv(support_active_file)
+ else: support_active_input = None
+
+ # Update storage
+ self.inputs["support_active"] = support_active_input
+
+ def _make_inactive_support_set_box(self):
+ st.info(":blue[Known inactive molecules:]", icon="β¨")
+ inactive_container = st.container()
+ with inactive_container:
+ inactive_input_choice = st.radio(
+ "Input your data in SMILES notation via:",
+ ["Text box", "CSV upload"],
+ key="inactive_input_choice",
+ )
+ if inactive_input_choice == "Text box":
+ support_inactive_input = st.text_area(
+ label="SMILES input for inactive support set molecules",
+ label_visibility="hidden",
+ key="inactive_textbox",
+ value="CSc1nc(C)nc(OCC(=O)O)c1C#N, "
+ "CSc1nc(C)n(CC(=O)O)c(=O)c1C#N"
+ )
+ elif inactive_input_choice == "CSV upload":
+ support_inactive_file = st.file_uploader(
+ key="support_inactive_csv",
+ label = "CSV upload for inactive support set molecules",
+ label_visibility="hidden"
+ )
+ if support_inactive_file is not None:
+ support_inactive_input = pd.read_csv(
+ support_inactive_file
+ )
+ else: support_inactive_input = None
+
+ # Update storage
+ self.inputs["support_inactive"] = support_inactive_input
+
+ def _fill_tab_with_results_content(self, predictor, inputs, buttons,
+ create_prediction_df, create_molecule_grid_plot):
+ tab_container = st.container()
+ with tab_container:
+ # Info
+ st.info(":blue[Summary:]", icon="π")
+ st.markdown(self.summary_text)
+
+ # Results
+ st.info(":blue[Results:]",icon="π¨βπ»")
+
+ if buttons['predict']:
+
+ # Check 1: Are all inputs provided?
+ if (inputs['query'] is None or
+ inputs['support_active'] is None or
+ inputs['support_inactive'] is None):
+ st.error("You didn't provide all necessary inputs.\n\n"
+ "Please provide all three necessary inputs via the "
+ "sidebar and hit the predict button again.")
+ else:
+ # Check 2: Less than max allowed molecules provided?
+ max_input_length = 0
+ for key, input in inputs.items():
+ input_list = handle_inputs(input)
+ self.inputs_lists[key] = input_list
+ max_input_length = max(max_input_length, len(input_list))
+
+ if max_input_length > self.max_input_length:
+ st.error("You provided too many molecules. The number of "
+ "molecules for each input is restricted to "
+ f"{self.max_input_length}.\n\n"
+ "For larger screenings, we suggest to clone the repo "
+ "and to run the model locally.")
+ else:
+ # Progress bar
+ progress_bar_text = ("I'm predicting activities. This might "
+ "need some minutes. Please wait...")
+ progress_bar = st.progress(50, text=progress_bar_text)
+
+ # Results table
+ df = self._predict_and_create_results_table(predictor,
+ inputs,
+ create_prediction_df)
+
+ progress_bar_text = ("Done. Here are the results:")
+ progress_bar = progress_bar.progress(100, text=progress_bar_text)
+ st.dataframe(df, use_container_width=True)
+
+ col1, col2, col3, col4 = st.columns([1,1,1,1])
+ # Provide download button for predictions
+ with col2:
+ self.buttons["download_results"] = st.download_button(
+ "Download predictions as CSV",
+ self._convert_df_to_binary(df),
+ file_name="predictions.csv",
+ )
+
+ # Provide download button for inputs
+ with col3:
+ with open("inputs.yml", 'w') as fl:
+ self.buttons["download_inputs"] = st.download_button(
+ "Download inputs as YML",
+ self._convert_to_yml(self.inputs_lists),
+ file_name="inputs.yml",
+ )
+ st.divider()
+
+ # Results grid
+ st.info(":blue[Grid plot of the predicted molecules:]",
+ icon="π")
+ mol_html_grid = create_molecule_grid_plot(df)
+ components.html(mol_html_grid, height=1000, scrolling=True)
+
+ elif buttons['reset']:
+ self._reset()
+
+ def _fill_paper_and_citation_tab(self):
+ st.info(":blue[**Paper: Context-enriched molecule representations improve "
+ "few-shot drug discovery**]", icon="π")
+ st.markdown(self.mhnfs_text, unsafe_allow_html=True)
+ st.image("./assets/mhnfs_overview.png")
+ st.write("")
+ st.write("")
+ st.write("")
+ st.info(":blue[**Cite us / BibTex**]", icon="π")
+ st.markdown(self.citation_text)
+
+ def _fill_more_explanations_tab(self):
+ st.info(":blue[**Under the hood**]", icon="βοΈ")
+ st.markdown(self.under_the_hood_text, unsafe_allow_html=True)
+ st.write("")
+ st.write("")
+
+ st.info(":blue[**About few-shot learning and the model MHNfs**]", icon="π―")
+ st.markdown(self.few_shot_learning_text, unsafe_allow_html=True)
+ st.write("")
+ st.write("")
+
+ st.info(":blue[**Usage**]", icon="ποΈ")
+ st.markdown(self.usage_text, unsafe_allow_html=True)
+ st.write("")
+ st.write("")
+
+ st.info(":blue[**How to provide the data**]", icon="π")
+ st.markdown(self.data_text, unsafe_allow_html=True)
+ st.write("")
+ st.write("")
+
+ st.info(":blue[**When to trust the predictions**]", icon="π")
+ st.markdown(self.trust_text, unsafe_allow_html=True)
+
+ def _fill_examples_tab(self):
+ st.info(":blue[**Example for trustworthy predictions**]", icon="β
")
+ st.markdown(self.example_trustworthy_text, unsafe_allow_html=True)
+ st.dataframe(self.df_trustworthy, use_container_width=True)
+ st.markdown("**Plot: Predictions for active and inactive molecules (model AUC="
+ "0.96**)")
+ prediction_plot_tw = Image.open("./assets/example_csv/predictions/"
+ "trustworthy_example.png")
+ st.image(prediction_plot_tw)
+ st.write("")
+ st.write("")
+
+ st.info(":blue[**Example for not trustworthy predictions**]", icon="βοΈ")
+ st.markdown(self.example_nottrustworthy_text, unsafe_allow_html=True)
+ st.dataframe(self.df_nottrustworthy, use_container_width=True)
+ st.markdown("**Plot: Predictions for active and inactive molecules (model AUC="
+ "0.42**)")
+ prediction_plot_ntw = Image.open("./assets/example_csv/predictions/"
+ "nottrustworthy_example.png")
+ st.image(prediction_plot_ntw)
+
+ def _predict_and_create_results_table(self,
+ predictor,
+ inputs,
+ create_prediction_df: callable):
+
+ df = create_prediction_df(predictor,
+ inputs['query'],
+ inputs['support_active'],
+ inputs['support_inactive'])
+ return df
+
+ def _reset(self):
+ keys = list(st.session_state.keys())
+ for key in keys:
+ st.session_state.pop(key)
+
+ def _convert_df_to_binary(_self, df):
+ return df.to_csv(index=False).encode('utf-8')
+
+ def _convert_to_yml(_self, inputs):
+ return yaml.dump(inputs)
+ content = """
+ # Usage
+ As soon as you have a few active and inactive molecules for your task, you can
+ provide them here and make predictions for new molecules.
+
+ ## About few-shot learning and the model MHNfs
+ **Few-shot learning** is a machine learning sub-field which aims to provide
+ predictive models for scenarios in which only little data is known/available.
+
+ **MHNfs** is a few-shot learning model which is specifically designed for drug
+ discovery applications. It is built to use the input prompts in a way such that
+ the provided available knowledge - i.e. the known active and inactive molecules -
+ functions as context to predict the activity of the new requested molecules.
+ Precisely, the provided active and inactive molecules are associated with a
+ large set of general molecules - called context molecules - to enrich the
+ provided information and to remove spurious correlations arising from the
+ decoration of molecules. This is analogous to a Large Language Model which would
+ not only use the provided information in the current prompt as context but would
+ also have access to way more information, e.g. a prompting history.
+
+ ## How to provide the data
+ * Molecules have to be provided in SMILES format.
+ * You can provide the molecules via the text boxes or via CSV upload.
+ - Text box: Replace the pseudo input by directly typing your molecules into
+ the text box. Please separate the molecules by comma.
+ - CSV upload: Upload a CSV file with the molecules.
+ * The CSV file should include a smiles column (both upper and lower
+ case "SMILES" are accepted).
+ * All other columns will be ignored.
+
+ ## When to trust the predictions
+ Just like all other machine learning models, the performance of MHNfs varies
+ and, generally, the model works well if the task is somehow close to tasks which
+ were used to train the model. The model performance for very different tasks is
+ unclear and might be poor.
+
+ MHNfs was trained on a the FS-Mol dataset which includes 5120 tasks (Roughly
+ 5000 tasks were used for training, rest for evaluation). The training tasks are
+ listed here: https://github.com/microsoft/FS-Mol/tree/main/datasets/targets.
+ """
+ return content
\ No newline at end of file
diff --git a/src/app/prediction_utils.py b/src/app/prediction_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..37613b9483327ab3ac2b101a2dbab324050e1dd4
--- /dev/null
+++ b/src/app/prediction_utils.py
@@ -0,0 +1,33 @@
+"""
+This module includes all functions which are called from the main app and are needed to
+make activity predictions and to output the results.
+"""
+
+#---------------------------------------------------------------------------------------
+# Deendencies
+import pandas as pd
+import mols2grid
+#---------------------------------------------------------------------------------------
+# Define functions
+
+def create_prediction_df(predictor, query_smiles, support_activces_smiles,
+ support_inactives_smiles):
+ """
+ This function creates a dataframe with the query molecules and the corresponding
+ predictions.
+ """
+ # Make predictions
+ predictions = predictor.predict(query_smiles, support_activces_smiles,
+ support_inactives_smiles)
+
+ smiles = predictor._return_query_mols_as_list()
+
+ # Create dataframe
+ prediction_df = pd.DataFrame({"Molecule": smiles,
+ "Predicted activity": predictions.astype('str')})
+
+ return prediction_df
+
+def create_molecule_grid_plot(df, smiles_col="Molecule"):
+ mol_html_grid = mols2grid.display(df,smiles_col=smiles_col)._repr_html_()
+ return mol_html_grid
\ No newline at end of file
diff --git a/src/data_preprocessing/__init__.py b/src/data_preprocessing/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/data_preprocessing/__pycache__/__init__.cpython-36.pyc b/src/data_preprocessing/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0ea3026f90c7b5c8ae0b1a772cbfb3ef5678fbce
Binary files /dev/null and b/src/data_preprocessing/__pycache__/__init__.cpython-36.pyc differ
diff --git a/src/data_preprocessing/__pycache__/__init__.cpython-37.pyc b/src/data_preprocessing/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fcac0f6f0dd8f2817ee437e9ef28311708500bb6
Binary files /dev/null and b/src/data_preprocessing/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/data_preprocessing/__pycache__/constants.cpython-37.pyc b/src/data_preprocessing/__pycache__/constants.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1f8dba5d790ecb68272c5420afaded6ed2e6a958
Binary files /dev/null and b/src/data_preprocessing/__pycache__/constants.cpython-37.pyc differ
diff --git a/src/data_preprocessing/__pycache__/create_descriptors.cpython-36.pyc b/src/data_preprocessing/__pycache__/create_descriptors.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e169defd0f2b9ec7587cae9bcec9aff4afce3a77
Binary files /dev/null and b/src/data_preprocessing/__pycache__/create_descriptors.cpython-36.pyc differ
diff --git a/src/data_preprocessing/__pycache__/create_descriptors.cpython-37.pyc b/src/data_preprocessing/__pycache__/create_descriptors.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..295a5c4e106008fc4c0684d43cf3ecc927f0ef56
Binary files /dev/null and b/src/data_preprocessing/__pycache__/create_descriptors.cpython-37.pyc differ
diff --git a/src/data_preprocessing/__pycache__/create_model_inputs.cpython-37.pyc b/src/data_preprocessing/__pycache__/create_model_inputs.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3f68b11a09f0b68718b3b033b27010ba1725101d
Binary files /dev/null and b/src/data_preprocessing/__pycache__/create_model_inputs.cpython-37.pyc differ
diff --git a/src/data_preprocessing/__pycache__/utils.cpython-37.pyc b/src/data_preprocessing/__pycache__/utils.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ce74fef01c85d90bfebc5abc8bfad540e3d57131
Binary files /dev/null and b/src/data_preprocessing/__pycache__/utils.cpython-37.pyc differ
diff --git a/src/data_preprocessing/constants.py b/src/data_preprocessing/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc0f7cbaf5fd1fb47811bbe489b6487c20bf5d60
--- /dev/null
+++ b/src/data_preprocessing/constants.py
@@ -0,0 +1,11 @@
+USED_200_DESCR = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,25,26,27,28,29,30, 31,32,33,
+ 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,
+ 57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,
+ 102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,
+ 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,
+ 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,
+ 153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,
+ 170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,
+ 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,
+ 204,205,206,207]
diff --git a/src/data_preprocessing/create_descriptors.py b/src/data_preprocessing/create_descriptors.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc36d5cb84104e64046d21b3a7c06b9ee069a7b5
--- /dev/null
+++ b/src/data_preprocessing/create_descriptors.py
@@ -0,0 +1,148 @@
+"""
+This file includes all necessary code to preprocess molecules (assumed to be in SMILES
+format) and create descriptors which can be fed into MHNfs.
+"""
+
+#---------------------------------------------------------------------------------------
+# Dependencies
+import numpy as np
+import pandas as pd
+import pickle
+from typing import List
+from rdkit import Chem, DataStructs
+from rdkit.Chem.rdchem import Mol
+from rdkit.Chem import Descriptors, rdFingerprintGenerator
+
+from src.data_preprocessing.constants import USED_200_DESCR
+from src.data_preprocessing.utils import Standardizer
+
+#---------------------------------------------------------------------------------------
+# Define main function
+
+def preprocess_molecules(input_molecules: [str, List[str], pd.DataFrame]):
+ """
+ This function preprocesses molecules (assumed to be in SMILES format) and creates
+ descriptors which can be fed into MHNfs.
+ """
+
+ # Load needed objects
+ current_loc = __file__.rsplit("/",3)[0]
+ with open(current_loc + "/assets/data_preprocessing_objects/scaler_fitted.pkl",
+ "rb") as fl:
+ scaler = pickle.load(fl)
+
+ with open(current_loc + "/assets/data_preprocessing_objects/ecdfs.pkl", "rb") as fl:
+ ecdfs = pickle.load(fl)
+
+ # Ensure that input_molecules is an Iterable with strs
+ input_smiles = handle_inputs(input_molecules)
+
+ # Create cleanded rdkit mol objects
+ input_molecules = create_cleaned_mol_objects(input_smiles)
+
+ # Create fingerprints and descriptors
+ ecfps = create_ecfp_fps(input_molecules)
+ rdkit_descrs = create_rdkit_descriptors(input_molecules)
+
+ # Create quantils
+ rdkit_descr_quantils = create_quantils(rdkit_descrs, ecdfs)
+
+ # Concatenate features
+ raw_features = np.concatenate((ecfps, rdkit_descr_quantils), axis=1)
+
+ # Normalize feature vectors
+ normalized_features = scaler.transform(raw_features)
+
+ # Return feature vectors
+ return normalized_features
+
+#---------------------------------------------------------------------------------------
+# Define helper functions
+def handle_inputs(input_molecules: [str, List[str], pd.DataFrame]):
+ """
+ This function handles the input molecules.
+ """
+
+ if isinstance(input_molecules, list):
+ return input_molecules
+
+ elif isinstance(input_molecules, pd.DataFrame):
+ input_molecules.columns = [c.lower() for c in input_molecules.columns]
+ if "smiles" not in input_molecules.columns:
+ raise ValueError(("Input DataFrame must have a column named 'Smiles'."))
+ iterable = list(input_molecules["smiles"].values)
+ return iterable
+
+ elif isinstance(input_molecules, str):
+ smiles_list = input_molecules.split(",")
+ smiles_list_cleaned = [smiles.strip() for smiles in smiles_list]
+
+ smiles_list_cleaned = [smiles for smiles in smiles_list_cleaned if smiles != ""]
+ return smiles_list_cleaned
+ else:
+ raise TypeError(("Input molecules must be a string,a list of strings or a "
+ "pandas DataFrame."))
+
+def create_ecfp_fps(mols: List[Mol]) -> np.ndarray:
+ """
+ This function ECFP fingerprints for a list of molecules.
+ """
+ ecfps = list()
+
+ for mol in mols:
+ fp_sparse_vec = rdFingerprintGenerator.GetCountFPs(
+ [mol], fpType=rdFingerprintGenerator.MorganFP
+ )[0]
+ fp = np.zeros((0,), np.int8)
+ DataStructs.ConvertToNumpyArray(fp_sparse_vec, fp)
+
+ ecfps.append(fp)
+
+ return np.array(ecfps)
+
+def create_rdkit_descriptors(mols: List[Mol]) -> np.ndarray:
+ """
+ This function creates RDKit descriptors for a list of molecules.
+ """
+ rdkit_descriptors = list()
+
+ for mol in mols:
+ descrs = []
+ for _, descr_calc_fn in Descriptors._descList:
+ descrs.append(descr_calc_fn(mol))
+
+ descrs = np.array(descrs)
+ descrs = descrs[USED_200_DESCR]
+ rdkit_descriptors.append(descrs)
+
+ return np.array(rdkit_descriptors)
+
+def create_quantils(raw_features: np.ndarray, ecdfs: list) -> np.ndarray:
+
+ quantils = np.zeros_like(raw_features)
+
+ for column in range(raw_features.shape[1]):
+ raw_values = raw_features[:, column].reshape(-1)
+ ecdf = ecdfs[column]
+ q = ecdf(raw_values)
+ quantils[:, column] = q
+
+ return quantils
+
+def create_cleaned_mol_objects(smiles: List[str]) -> List[Mol]:
+ """
+ This function creates cleaned RDKit mol objects from a list of SMILES.
+ """
+ sm = Standardizer(canon_taut=True)
+
+ mols = list()
+ for smile in smiles:
+ #try:
+ mol = Chem.MolFromSmiles(smile)
+ standardized_mol, _ = sm.standardize_mol(mol)
+ can_mol = Chem.MolFromSmiles(Chem.MolToSmiles(standardized_mol))
+ mols.append(can_mol)
+ return mols
+
+#---------------------------------------------------------------------------------------
+
diff --git a/src/data_preprocessing/create_model_inputs.py b/src/data_preprocessing/create_model_inputs.py
new file mode 100644
index 0000000000000000000000000000000000000000..d254817c1b788c9ad866f878a88edb76a53d46b6
--- /dev/null
+++ b/src/data_preprocessing/create_model_inputs.py
@@ -0,0 +1,46 @@
+"""
+In this file, the input functions for query and support set molecules are defined.
+Input is assumed to be either a SMILES string, a list of SMILES strings, or a pandas
+dataframe.
+"""
+
+#---------------------------------------------------------------------------------------
+# Dependencies
+import pandas as pd
+from typing import List
+import torch
+
+from src.data_preprocessing.create_descriptors import preprocess_molecules
+
+#---------------------------------------------------------------------------------------
+# Define main functions
+def create_query_input(smiles_input: [str, List[str], pd.DataFrame]):
+ """
+ This function creates the input for the query molecules.
+ """
+
+ # Create vector representation
+ numpy_vector_representation = preprocess_molecules(smiles_input)
+ assert len(numpy_vector_representation.shape) == 2
+
+ # Create pytorch tensor
+ tensor = torch.from_numpy(numpy_vector_representation).unsqueeze(1).float()
+
+ return tensor
+
+def create_support_set_input(smiles_input: [str, List[str], pd.DataFrame]):
+ """
+ This function creates the input for the support set molecules.
+ """
+
+ # Create vector representation
+ numpy_vector_representation = preprocess_molecules(smiles_input)
+ assert len(numpy_vector_representation.shape) == 2
+
+ size = numpy_vector_representation.shape[0]
+
+ # Create pytorch tensors
+ tensor = torch.from_numpy(numpy_vector_representation).unsqueeze(0).float()
+ size = torch.tensor(size)
+
+ return tensor, size
\ No newline at end of file
diff --git a/src/data_preprocessing/utils.py b/src/data_preprocessing/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..fc42b448b08f891fa6314f02cd35f65d6af7a42d
--- /dev/null
+++ b/src/data_preprocessing/utils.py
@@ -0,0 +1,247 @@
+## These MolStandardizer classes are due to Paolo Tosco
+## It was taken from the FS-Mol github
+## (https://github.com/microsoft/FS-Mol/blob/main/fs_mol/preprocessing/utils/
+## standardizer.py)
+## They ensure that a sequence of standardization operations are applied
+## https://gist.github.com/ptosco/7e6b9ab9cc3e44ba0919060beaed198e
+
+import logging
+
+from rdkit import Chem, RDLogger
+from rdkit.Chem.MolStandardize import rdMolStandardize
+
+
+class BaseLogger:
+ """
+ Simple logging base class.
+
+ Inherit from this class and call self.get_logger() to
+ get a logger bearing the class name.
+ """
+
+ DEFAULT_LOG_LEVEL = logging.WARNING
+
+ def __init__(self):
+ self._log_level = self.DEFAULT_LOG_LEVEL
+
+ def set_log_level(self, log_level):
+ if not getattr(logging, log_level):
+ raise TypeError(f"log_level {log_level} does not exist in logging")
+ self._log_level = log_level
+
+ def get_logger(self):
+ """Return a logger bearing the class name."""
+ logger = logging.getLogger(self.__class__.__name__)
+ if not logger.hasHandlers():
+ handler = logging.StreamHandler()
+ formatter = logging.Formatter("[%(asctime)s:%(name)s:%(levelname)s] %(message)s")
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
+ logger.setLevel(self._log_level)
+ return logger
+
+
+class Standardizer(BaseLogger):
+ """
+ Simple wrapper class around rdkit Standardizer.
+ """
+
+ DEFAULT_CANON_TAUT = False
+ DEFAULT_METAL_DISCONNECT = False
+ MAX_TAUTOMERS = 100
+ MAX_TRANSFORMS = 100
+ MAX_RESTARTS = 200
+ PREFER_ORGANIC = True
+
+ def __init__(
+ self,
+ metal_disconnect=None,
+ canon_taut=None,
+ ):
+ """
+ Constructor.
+
+ All parameters are optional.
+ :param metal_disconnect: if True, metallorganic complexes are
+ disconnected
+ :param canon_taut: if True, molecules are converted to their
+ canonical tautomer
+ """
+ super().__init__()
+ if metal_disconnect is None:
+ metal_disconnect = self.DEFAULT_METAL_DISCONNECT
+ if canon_taut is None:
+ canon_taut = self.DEFAULT_CANON_TAUT
+ self._canon_taut = canon_taut
+ self._metal_disconnect = metal_disconnect
+ self._taut_enumerator = None
+ self._rdlogger = None
+ self._uncharger = None
+ self._lfrag_chooser = None
+ self._metal_disconnector = None
+ self._normalizer = None
+ self._reionizer = None
+ self._params = None
+
+ @property
+ def params(self):
+ """Return the MolStandardize CleanupParameters."""
+ if self._params is None:
+ self._params = rdMolStandardize.CleanupParameters()
+ self._params.maxTautomers = self.MAX_TAUTOMERS
+ self._params.maxTransforms = self.MAX_TRANSFORMS
+ self._params.maxRestarts = self.MAX_RESTARTS
+ self._params.preferOrganic = self.PREFER_ORGANIC
+ self._params.tautomerRemoveSp3Stereo = False
+ return self._params
+
+ @property
+ def canon_taut(self):
+ """Return whether tautomer canonicalization will be done."""
+ return self._canon_taut
+
+ @property
+ def metal_disconnect(self):
+ """Return whether metallorganic complexes will be disconnected."""
+ return self._metal_disconnect
+
+ @property
+ def taut_enumerator(self):
+ """Return the TautomerEnumerator object."""
+ if self._taut_enumerator is None:
+ self._taut_enumerator = rdMolStandardize.TautomerEnumerator(self.params)
+ return self._taut_enumerator
+
+ @property
+ def uncharger(self):
+ """Return the Uncharger object."""
+ if self._uncharger is None:
+ self._uncharger = rdMolStandardize.Uncharger()
+ return self._uncharger
+
+ @property
+ def lfrag_chooser(self):
+ """Return the LargestFragmentChooser object."""
+ if self._lfrag_chooser is None:
+ self._lfrag_chooser = rdMolStandardize.LargestFragmentChooser(self.params.preferOrganic)
+ return self._lfrag_chooser
+
+ @property
+ def metal_disconnector(self):
+ """Return the MetalDisconnector object."""
+ if self._metal_disconnector is None:
+ self._metal_disconnector = rdMolStandardize.MetalDisconnector()
+ return self._metal_disconnector
+
+ @property
+ def normalizer(self):
+ """Return the Normalizer object."""
+ if self._normalizer is None:
+ self._normalizer = rdMolStandardize.Normalizer(
+ self.params.normalizationsFile, self.params.maxRestarts
+ )
+ return self._normalizer
+
+ @property
+ def reionizer(self):
+ """Return the Reionizer object."""
+ if self._reionizer is None:
+ self._reionizer = rdMolStandardize.Reionizer(self.params.acidbaseFile)
+ return self._reionizer
+
+ def charge_parent(self, mol_in):
+ """Sequentially apply a series of MolStandardize operations:
+
+ * MetalDisconnector
+ * Normalizer
+ * Reionizer
+ * LargestFragmentChooser
+ * Uncharger
+
+ The net result is that a desalted, normalized, neutral
+ molecule with implicit Hs is returned.
+ """
+ params = Chem.RemoveHsParameters()
+ params.removeAndTrackIsotopes = True
+ mol_in = Chem.RemoveHs(mol_in, params, sanitize=False)
+ if self._metal_disconnect:
+ mol_in = self.metal_disconnector.Disconnect(mol_in)
+ normalized = self.normalizer.normalize(mol_in)
+ Chem.SanitizeMol(normalized)
+ normalized = self.reionizer.reionize(normalized)
+ Chem.AssignStereochemistry(normalized)
+ normalized = self.lfrag_chooser.choose(normalized)
+ normalized = self.uncharger.uncharge(normalized)
+ # need this to reassess aromaticity on things like
+ # cyclopentadienyl, tropylium, azolium, etc.
+ Chem.SanitizeMol(normalized)
+ return Chem.RemoveHs(Chem.AddHs(normalized))
+
+ def standardize_mol(self, mol_in):
+ """
+ Standardize a single molecule.
+
+ :param mol_in: a Chem.Mol
+ :return: * (standardized Chem.Mol, n_taut) tuple
+ if success. n_taut will be negative if
+ tautomer enumeration was aborted due
+ to reaching a limit
+ * (None, error_msg) if failure
+
+ This calls self.charge_parent() and, if self._canon_taut
+ is True, runs tautomer canonicalization.
+ """
+ logger = self.get_logger()
+ if self._rdlogger is None:
+ self._rdlogger = RDLogger.logger()
+ self._rdlogger.setLevel(RDLogger.CRITICAL)
+ n_tautomers = 0
+ if isinstance(mol_in, Chem.Mol):
+ name = None
+ try:
+ name = mol_in.GetProp("_Name")
+ except KeyError:
+ pass
+ if not name:
+ name = "NONAME"
+ else:
+ error = f"Expected SMILES or Chem.Mol as input, got {str(type(mol_in))}"
+ logger.critical(error)
+ return None, error
+ try:
+ mol_out = self.charge_parent(mol_in)
+ except Exception as e:
+ error = f"charge_parent FAILED: {str(e).strip()}"
+ logger.critical(error)
+ return None, error
+ if self._canon_taut:
+ try:
+ res = self.taut_enumerator.Enumerate(mol_out, False)
+ except TypeError:
+ # we are still on the pre-2021 RDKit API
+ res = self.taut_enumerator.Enumerate(mol_out)
+ except Exception as e:
+ # something else went wrong
+ error = f"canon_taut FAILED: {str(e).strip()}"
+ logger.critical(error)
+ return None, error
+ n_tautomers = len(res)
+ if hasattr(res, "status"):
+ completed = res.status == rdMolStandardize.TautomerEnumeratorStatus.Completed
+ else:
+ # we are still on the pre-2021 RDKit API
+ completed = len(res) < 1000
+ if not completed:
+ n_tautomers = -n_tautomers
+ try:
+ mol_out = self.taut_enumerator.PickCanonical(res)
+ except AttributeError:
+ # we are still on the pre-2021 RDKit API
+ mol_out = max([(self.taut_enumerator.ScoreTautomer(m), m) for m in res])[1]
+ except Exception as e:
+ # something else went wrong
+ error = f"canon_taut FAILED: {str(e).strip()}"
+ logger.critical(error)
+ return None, error
+ mol_out.SetProp("_Name", name)
+ return mol_out, n_tautomers
\ No newline at end of file
diff --git a/src/mhnfs/__init__.py b/src/mhnfs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/mhnfs/__pycache__/__init__.cpython-37.pyc b/src/mhnfs/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fba5ad560e223c1e1893671503c646d9c56befd9
Binary files /dev/null and b/src/mhnfs/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/mhnfs/__pycache__/initialization.cpython-37.pyc b/src/mhnfs/__pycache__/initialization.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2d2ef68d4230e8bb8d83a729df808c1938a8b55b
Binary files /dev/null and b/src/mhnfs/__pycache__/initialization.cpython-37.pyc differ
diff --git a/src/mhnfs/__pycache__/model.cpython-37.pyc b/src/mhnfs/__pycache__/model.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f3ee2a7bbffadf8060504f08dd61abe0a918a882
Binary files /dev/null and b/src/mhnfs/__pycache__/model.cpython-37.pyc differ
diff --git a/src/mhnfs/__pycache__/modules.cpython-37.pyc b/src/mhnfs/__pycache__/modules.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a84eb2cf9aaeb0bf00f019b67066dbf143d1414a
Binary files /dev/null and b/src/mhnfs/__pycache__/modules.cpython-37.pyc differ
diff --git a/src/mhnfs/hopfield/LICENSE b/src/mhnfs/hopfield/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..47a0284f6bbbea8399f555abb5ff5932c873e95f
--- /dev/null
+++ b/src/mhnfs/hopfield/LICENSE
@@ -0,0 +1,79 @@
+From Hopfield layers:
+
+Copyright (c) 2020, Institute for Machine Learning, Johannes Kepler University Linz (Bernhard SchΓ€fl)
+All rights reserved.
+
+All other contributions:
+Copyright (c) 2020 the respective contributors
+All rights reserved.
+
+From PyTorch:
+
+Copyright (c) 2016- Facebook, Inc (Adam Paszke)
+Copyright (c) 2014- Facebook, Inc (Soumith Chintala)
+Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
+Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)
+Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
+Copyright (c) 2011-2013 NYU (Clement Farabet)
+Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain Melvin, Jason Weston)
+Copyright (c) 2006 Idiap Research Institute (Samy Bengio)
+Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio, Johnny Mariethoz)
+
+From Caffe2:
+
+Copyright (c) 2016-present, Facebook Inc. All rights reserved.
+
+All contributions by Facebook:
+Copyright (c) 2016 Facebook Inc.
+
+All contributions by Google:
+Copyright (c) 2015 Google Inc.
+All rights reserved.
+
+All contributions by Yangqing Jia:
+Copyright (c) 2015 Yangqing Jia
+All rights reserved.
+
+All contributions from Caffe:
+Copyright(c) 2013, 2014, 2015, the respective contributors
+All rights reserved.
+
+All other contributions:
+Copyright(c) 2015, 2016 the respective contributors
+All rights reserved.
+
+Caffe2 uses a copyright model similar to Caffe: each contributor holds
+copyright over their contributions to Caffe2. The project versioning records
+all such contribution and copyright details. If a contributor wants to further
+mark their specific copyright on a particular contribution, they should
+indicate their copyright solely in the commit message of the change when it is
+committed.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the names of Facebook, Deepmind Technologies, NYU, NEC Laboratories America
+ and IDIAP Research Institute 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.
diff --git a/src/mhnfs/hopfield/README.md b/src/mhnfs/hopfield/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..bc3afb01437ec35fcf8864ae87e6055b4886d473
--- /dev/null
+++ b/src/mhnfs/hopfield/README.md
@@ -0,0 +1,119 @@
+# Hopfield Networks is All You Need
+
+_Hubert Ramsauer1 ,
+Bernhard SchΓ€fl1 ,
+Johannes Lehner1 ,
+Philipp Seidl1 ,
+Michael Widrich1 ,
+Lukas Gruber1 ,
+Markus Holzleitner1 ,
+Milena PavloviΔ3, 4 ,
+Geir Kjetil Sandve4 ,
+Victor Greiff3 ,
+David Kreil2 ,
+Michael Kopp2 ,
+GΓΌnter Klambauer1 ,
+Johannes Brandstetter1 ,
+Sepp Hochreiter1, 2 _
+
+1 ELLIS Unit Linz and LIT AI Lab, Institute for Machine Learning, Johannes Kepler University Linz, Austria
+2 Institute of Advanced Research in Artificial Intelligence (IARAI)
+3 Department of Immunology, University of Oslo, Norway
+4 Department of Informatics, University of Oslo, Norway
+
+---
+
+##### Detailed blog post on this paper as well as the necessary background on Hopfield networks at [this link](https://ml-jku.github.io/hopfield-layers/).
+
+---
+
+The transformer and BERT models pushed the performance on NLP tasks to new levels via their attention mechanism. We show
+that this attention mechanism is the update rule of a modern Hopfield network with continuous states. This new Hopfield
+network can store exponentially (with the dimension) many patterns,converges with one update, and has exponentially
+small retrieval errors. The number of stored patterns must be traded off against convergence speed and retrieval error.
+The new Hopfield network has three types of energy minima (fixed points of the update):
+
+1. global fixed point averaging over all patterns,
+2. metastable states averaging over a subset of patterns, and
+3. fixed points which store a single pattern.
+
+Transformers learn an attention mechanism by constructing an embedding of patterns and queries into an associative
+space. Transformer and BERT models operate in their first layers preferably in the global averaging regime, while they
+operate in higher layers in metastable states. The gradient in transformers is maximal in the regime of metastable
+states, is uniformly distributed when averaging globally, and vanishes when a fixed point is near a stored pattern.
+Based on the Hopfield network interpretation, we analyzed learning of transformer and BERT architectures. Learning starts
+with attention heads that average and then most of them switch to metastable states. However, the majority of heads in
+the first layers still averages and can be replaced by averaging operations like the Gaussian weighting that we propose.
+In contrast, heads in the last layers steadily learn and seem to use metastable states to collect information created in
+lower layers. These heads seem a promising target for improving transformers. Neural networks that integrate Hopfield
+networks that are equivalent to attention heads outperform other methods on immune repertoire classification, where the
+Hopfield net stores several hundreds of thousands of patterns.
+
+With _this_ repository, we provide a PyTorch implementation of a new layer called
+βHopfieldβ which allows to equip deep learning architectures with Hopfield networks as new memory concepts.
+
+The full paper is available at [https://arxiv.org/abs/2008.02217](https://arxiv.org/abs/2008.02217).
+
+## Requirements
+
+The software was developed and tested on the following 64-bit operating systems:
+
+- CentOS Linux release 8.1.1911 (Core)
+- macOS 10.15.5 (Catalina)
+
+As the development environment, [Python](https://www.python.org) 3.8.3 in combination with [PyTorch](https://pytorch.org) 1.6.0 was used (a version of at least 1.5.0 should be sufficient). More details on how to install PyTorch are available on the [official project page](https://pytorch.org).
+
+## Usage
+
+To get up and running with Hopfield-based networks, only one argument needs to be set, the size (depth) of the input.
+
+```python
+hopfield = Hopfield(input_size=...)
+```
+
+It is also possible to replace commonly used pooling functions with a Hopfield-based one. Internally, a state pattern is trained, which in turn is used to compute pooling weights with respect to the input.
+
+```python
+hopfield_pooling = HopfieldPooling(input_size=...)
+```
+
+A second variant of our Hopfield-based modules is one which employs a trainable but fixed lookup mechanism. Internally, one or multiple stored patterns and pattern projections are trained (optionally in a non-shared manner), which in turn are used as a lookup mechanism independent of the input data.
+
+```python
+hopfield_lookup = HopfieldLayer(input_size=...)
+```
+
+The usage is as simple as with the main module, but equally powerful .
+
+## Examples
+
+Generally, the Hopfield layer is designed to be used to implement or to substitute different layers like:
+
+- Pooling layers: We consider the Hopfield layer as a pooling layer if only one static state (query) pattern exists. Then, it is de facto a pooling over the sequence, which results from the softmax values applied on the stored patterns. Therefore, our Hopfield layer can act as a pooling layer.
+
+- Permutation equivariant layers: Our Hopfield layer can be used as a plug-in replacement for permutation equivariant layers. Since the Hopfield layer is an associative memory it assumes no dependency between the input patterns.
+
+- GRU & LSTM layers: Our Hopfield layer can be used as a plug-in replacement for GRU & LSTM layers. Optionally, for substituting GRU & LSTM layers, positional encoding might be considered.
+
+- Attention layers: Our Hopfield layer can act as an attention layer, where state (query) and stored (key) patterns are different, and need to be associated.
+
+The folder [examples](examples/) contains multiple demonstrations on how to use the Hopfield
, HopfieldPooling
as well as the HopfieldLayer
modules. To successfully run the contained [Jupyter notebooks](https://jupyter.org), additional third-party modules like [pandas](https://pandas.pydata.org) and [seaborn](https://seaborn.pydata.org) are required.
+
+- [Bit Pattern Set](examples/bit_pattern/bit_pattern_demo.ipynb): The dataset of this demonstration falls into the category of binary classification tasks in the domain of Multiple Instance Learning (MIL) problems. Each bag comprises a collection of bit pattern instances, wheres each instance is a sequence of 0s and 1s . The positive class has specific bit patterns injected, which are absent in the negative one. This demonstration shows, that Hopfield
, HopfieldPooling
and HopfieldLayer
are capable of learning and filtering each bag with respect to the class-defining bit patterns.
+
+- [Latch Sequence Set](examples/latch_sequence/latch_sequence_demo.ipynb): We study an easy example of learning long-term dependencies by using a simple latch task , see [Hochreiter and Mozer](https://link.springer.com/chapter/10.1007/3-540-44668-0_92). The essence of this task is that a sequence of inputs is presented, beginning with one of two symbols, A or B , and after a variable number of time steps, the model has to output a corresponding symbol. Thus, the task requires memorizing the original input over time. It has to be noted, that both class-defining symbols must only appear at the first position of a sequence. This task was specifically designed to demonstrate the capability of recurrent neural networks to capture long term dependencies. This demonstration shows, that Hopfield
, HopfieldPooling
and HopfieldLayer
adapt extremely fast to this specific task, concentrating only on the first entry of the sequence.
+
+- [Attention-based Deep Multiple Instance Learning](examples/mnist_bags/mnist_bags_demo.ipynb): The dataset of this demonstration falls into the category of binary classification tasks in the domain of Multiple Instance Learning (MIL) problems, see [Ilse and Tomczak](https://arxiv.org/abs/1802.04712). Each bag comprises a collection of 28x28 grayscale images/instances, whereas each instance is a sequence of pixel values in the range of [0; 255] . The amount of instances per pag is drawn from a Gaussian with specified mean and variance. The positive class is defined by the presence of the target number/digit, whereas the negative one by its absence.
+
+## Disclaimer
+
+Some implementations of this repository are based on existing ones of the official [PyTorch repository v1.6.0](https://github.com/pytorch/pytorch/tree/v1.6.0) and accordingly extended and modified. In the following, the involved parts are listed:
+
+- The implementation of [HopfieldCore](modules/activation.py#L11) is based on the implementation of [MultiheadAttention](https://github.com/pytorch/pytorch/blob/b31f58de6fa8bbda5353b3c77d9be4914399724d/torch/nn/modules/activation.py#L771).
+- The implementation of [hopfield_core_forward](modules/functional.py#L8) is based on the implementation of [multi_head_attention_forward](https://github.com/pytorch/pytorch/blob/b31f58de6fa8bbda5353b3c77d9be4914399724d/torch/nn/functional.py#L3854).
+- The implementation of [HopfieldEncoderLayer](modules/transformer.py#L12) is based on the implementation of [TransformerEncoderLayer](https://github.com/pytorch/pytorch/blob/b31f58de6fa8bbda5353b3c77d9be4914399724d/torch/nn/modules/transformer.py#L241).
+- The implementation of [HopfieldDecoderLayer](modules/transformer.py#L88) is based on the implementation of [TransformerDecoderLayer](https://github.com/pytorch/pytorch/blob/b31f58de6fa8bbda5353b3c77d9be4914399724d/torch/nn/modules/transformer.py#L303).
+
+## License
+
+This repository is BSD-style licensed (see [LICENSE](LICENSE)), except where noted otherwise.
\ No newline at end of file
diff --git a/src/mhnfs/hopfield/__init__.py b/src/mhnfs/hopfield/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/mhnfs/hopfield/__pycache__/__init__.cpython-37.pyc b/src/mhnfs/hopfield/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a185a4fc0f402dd6c0a9a82821c064767effe6c0
Binary files /dev/null and b/src/mhnfs/hopfield/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/mhnfs/hopfield/__pycache__/__init__.cpython-38.pyc b/src/mhnfs/hopfield/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2e46ddbbf242fac3d42ab6d882c300182e12c288
Binary files /dev/null and b/src/mhnfs/hopfield/__pycache__/__init__.cpython-38.pyc differ
diff --git a/src/mhnfs/hopfield/__pycache__/__init__.cpython-39.pyc b/src/mhnfs/hopfield/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f41640cb4dbe924a93ab5b0a7fc03b89300f2ed
Binary files /dev/null and b/src/mhnfs/hopfield/__pycache__/__init__.cpython-39.pyc differ
diff --git a/src/mhnfs/hopfield/auxiliary/__init__.py b/src/mhnfs/hopfield/auxiliary/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/mhnfs/hopfield/auxiliary/data.py b/src/mhnfs/hopfield/auxiliary/data.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c3e393145921d6588d6b0adc41f036b6bd5f4a9
--- /dev/null
+++ b/src/mhnfs/hopfield/auxiliary/data.py
@@ -0,0 +1,252 @@
+import torch
+
+from math import ceil
+from torch.utils.data import Dataset
+from typing import Dict, Optional, Sequence, Tuple, Union
+
+
+class BitPatternSet(Dataset):
+ """
+ Binary multiple instance learning (MIL) data set comprising bit patterns as instances,
+ with implanted bit patterns unique to one of the classes.
+ """
+
+ def __init__(self, num_bags: int, num_instances: int, num_signals: int, num_signals_per_bag: int = 1,
+ fraction_targets: float = 0.5, num_bits: int = 8, dtype: torch.dtype = torch.float32,
+ seed_signals: int = 43, seed_data: int = 44):
+ """
+ Create new binary bit pattern data set conforming to the specified properties.
+
+ :param num_bags: amount of bags
+ :param num_instances: amount of instances per bag
+ :param num_signals: amount of unique signals used to distinguish both classes
+ :param num_signals_per_bag: amount of unique signals to be implanted per bag
+ :param fraction_targets: fraction of targets
+ :param num_bits: amount of bits per instance
+ :param dtype: data type of instances
+ :param seed_signals: random seed used to generate the signals of the data set (excl. samples)
+ :param seed_data: random seed used to generate the samples of the data set (excl. signals)
+ """
+ super(BitPatternSet, self).__init__()
+ assert (type(num_bags) == int) and (num_bags > 0), r'"num_bags" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_signals) == int) and (num_signals > 0), r'"num_signals" must be a positive integer!'
+ assert (type(num_signals_per_bag) == int) and (num_signals_per_bag >= 0) and (
+ num_signals_per_bag <= num_instances), r'"num_signals_per_bag" must be a non-negative integer!'
+ assert (type(fraction_targets) == float) and (fraction_targets > 0) and (
+ fraction_targets < 1), r'"fraction_targets" must be in interval (0; 1)!'
+ assert (type(num_bits) == int) and (num_bits > 0), r'"num_bits" must be a positive integer!'
+ assert ((2 ** num_bits) - 1) > num_signals, r'"num_signals" must be smaller than "2 ** num_bits - 1"!'
+ assert type(seed_signals) == int, r'"seed_signals" must be an integer!'
+ assert type(seed_data) == int, r'"seed_data" must be an integer!'
+
+ self.__num_bags = num_bags
+ self.__num_instances = num_instances
+ self.__num_signals = num_signals
+ self.__num_signals_per_bag = num_signals_per_bag
+ self.__fraction_targets = fraction_targets
+ self.__num_targets = min(self.__num_bags, max(1, ceil(self.__num_bags * self.__fraction_targets)))
+ self.__num_bits = num_bits
+ self.__dtype = dtype
+ self.__seed_signals = seed_signals
+ self.__seed_data = seed_data
+ self.__data, self.__targets, self.__signals = self._generate_bit_pattern_set()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of bags.
+
+ :return: amount of bags
+ """
+ return self.__num_bags
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific bag.
+
+ :param item_index: specific bag to fetch
+ :return: specific bag as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_bit_pattern_set(self) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying bit pattern data set.
+
+ :return: tuple containing generated bags, targets and signals
+ """
+ torch.random.manual_seed(seed=self.__seed_signals)
+
+ # Generate signal patterns.
+ generated_signals = torch.randint(low=0, high=2, size=(self.__num_signals, self.__num_bits))
+ check_instances = True
+ while check_instances:
+ generated_signals = torch.unique(input=generated_signals, dim=0)
+ generated_signals = generated_signals[generated_signals.sum(axis=1) != 0]
+ missing_signals = self.__num_signals - generated_signals.shape[0]
+ if missing_signals > 0:
+ generated_signals = torch.cat(tensors=(
+ generated_signals, torch.randint(low=0, high=2, size=(missing_signals, self.__num_bits))), dim=0)
+ else:
+ check_instances = False
+
+ # Generate data and target tensors.
+ torch.random.manual_seed(seed=self.__seed_data)
+ generated_data = torch.randint(low=0, high=2, size=(self.__num_bags, self.__num_instances, self.__num_bits))
+ generated_targets = torch.zeros(size=(self.__num_bags,), dtype=generated_data.dtype)
+ generated_targets[:self.__num_targets] = 1
+
+ # Check invalid (all-zero and signal) instances and re-sample them.
+ check_instances = True
+ while check_instances:
+ invalid_instances = (generated_data.sum(axis=2) == 0).logical_or(
+ torch.sum(torch.stack([(generated_data == _).all(axis=2) for _ in generated_signals]), axis=0))
+ if invalid_instances.sum() > 0:
+ generated_data[invalid_instances] = torch.randint(
+ low=0, high=2, size=(invalid_instances.sum(), self.__num_bits))
+ else:
+ check_instances = False
+
+ # Re-implant signal into respective bags.
+ for data_index in range(self.__num_targets):
+ implantation_indices = []
+ for _ in range(self.__num_signals_per_bag):
+ while True:
+ current_implantation_index = torch.randint(low=0, high=generated_data.shape[1], size=(1,))
+ if current_implantation_index not in implantation_indices:
+ implantation_indices.append(current_implantation_index)
+ break
+ current_signal_index = torch.randint(low=0, high=generated_signals.shape[0], size=(1,))
+ generated_data[data_index, current_implantation_index] = generated_signals[current_signal_index]
+
+ return generated_data, generated_targets, generated_signals
+
+ @property
+ def num_bags(self) -> int:
+ return self.__num_bags
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_bits(self) -> int:
+ return self.__num_bits
+
+ @property
+ def num_targets_high(self) -> int:
+ return self.__num_targets
+
+ @property
+ def num_targets_low(self) -> int:
+ return self.__num_bags - self.__num_targets
+
+ @property
+ def num_signals(self) -> int:
+ return self.__num_signals
+
+ @property
+ def num_signals_per_bag(self) -> int:
+ return self.__num_signals_per_bag
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def bags(self) -> torch.Tensor:
+ return self.__data.clone()
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
+
+ @property
+ def signals(self) -> torch.Tensor:
+ return self.__signals.clone()
+
+
+class LatchSequenceSet(Dataset):
+ """
+ Latch data set comprising patterns as one-hot encoded instances.
+ """
+
+ def __init__(self, num_samples: int, num_instances: int = 20, num_characters: int = 6,
+ dtype: torch.dtype = torch.float32, seed: int = 43):
+ """
+ Create new latch sequence data set conforming to the specified properties.
+
+ :param num_samples: amount of samples
+ :param num_instances: amount of instances per sample
+ :param num_characters: amount of different characters
+ :param dtype: data type of samples
+ :param seed: random seed used to generate the samples of the data set
+ """
+ super(LatchSequenceSet, self).__init__()
+ assert (type(num_samples) == int) and (num_samples > 0), r'"num_samples" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_characters) == int) and (num_characters > 0), r'"num_characters" must be a positive integer!'
+ assert type(seed) == int, r'"seed" must be an integer!'
+
+ self.__num_samples = num_samples
+ self.__num_instances = num_instances
+ self.__num_characters = num_characters
+ self.__dtype = dtype
+ self.__seed = seed
+ self.__data, self.__targets = self._generate_latch_sequences()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of samples.
+
+ :return: amount of samples
+ """
+ return self.__num_samples
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific sample.
+
+ :param item_index: specific sample to fetch
+ :return: specific sample as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_latch_sequences(self) -> Tuple[torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying latch sequence data set.
+
+ :return: tuple containing generated data and targets
+ """
+ torch.random.manual_seed(seed=self.__seed)
+
+ # Generate data and target tensors.
+ generated_data = torch.randint(
+ low=2, high=self.__num_characters, size=(self.__num_samples, self.__num_instances))
+ generated_signal = torch.randint(low=0, high=2, size=(self.__num_samples,))
+ generated_data[:, 0] = generated_signal
+ generated_data = torch.nn.functional.one_hot(input=generated_data, num_classes=self.__num_characters)
+
+ return generated_data, generated_signal
+
+ @property
+ def num_samples(self) -> int:
+ return self.__num_samples
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_characters(self) -> int:
+ return self.__num_characters
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/auxiliary/__init__.py b/src/mhnfs/hopfield/examples/bit_pattern/auxiliary/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/auxiliary/data.py b/src/mhnfs/hopfield/examples/bit_pattern/auxiliary/data.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c3e393145921d6588d6b0adc41f036b6bd5f4a9
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/auxiliary/data.py
@@ -0,0 +1,252 @@
+import torch
+
+from math import ceil
+from torch.utils.data import Dataset
+from typing import Dict, Optional, Sequence, Tuple, Union
+
+
+class BitPatternSet(Dataset):
+ """
+ Binary multiple instance learning (MIL) data set comprising bit patterns as instances,
+ with implanted bit patterns unique to one of the classes.
+ """
+
+ def __init__(self, num_bags: int, num_instances: int, num_signals: int, num_signals_per_bag: int = 1,
+ fraction_targets: float = 0.5, num_bits: int = 8, dtype: torch.dtype = torch.float32,
+ seed_signals: int = 43, seed_data: int = 44):
+ """
+ Create new binary bit pattern data set conforming to the specified properties.
+
+ :param num_bags: amount of bags
+ :param num_instances: amount of instances per bag
+ :param num_signals: amount of unique signals used to distinguish both classes
+ :param num_signals_per_bag: amount of unique signals to be implanted per bag
+ :param fraction_targets: fraction of targets
+ :param num_bits: amount of bits per instance
+ :param dtype: data type of instances
+ :param seed_signals: random seed used to generate the signals of the data set (excl. samples)
+ :param seed_data: random seed used to generate the samples of the data set (excl. signals)
+ """
+ super(BitPatternSet, self).__init__()
+ assert (type(num_bags) == int) and (num_bags > 0), r'"num_bags" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_signals) == int) and (num_signals > 0), r'"num_signals" must be a positive integer!'
+ assert (type(num_signals_per_bag) == int) and (num_signals_per_bag >= 0) and (
+ num_signals_per_bag <= num_instances), r'"num_signals_per_bag" must be a non-negative integer!'
+ assert (type(fraction_targets) == float) and (fraction_targets > 0) and (
+ fraction_targets < 1), r'"fraction_targets" must be in interval (0; 1)!'
+ assert (type(num_bits) == int) and (num_bits > 0), r'"num_bits" must be a positive integer!'
+ assert ((2 ** num_bits) - 1) > num_signals, r'"num_signals" must be smaller than "2 ** num_bits - 1"!'
+ assert type(seed_signals) == int, r'"seed_signals" must be an integer!'
+ assert type(seed_data) == int, r'"seed_data" must be an integer!'
+
+ self.__num_bags = num_bags
+ self.__num_instances = num_instances
+ self.__num_signals = num_signals
+ self.__num_signals_per_bag = num_signals_per_bag
+ self.__fraction_targets = fraction_targets
+ self.__num_targets = min(self.__num_bags, max(1, ceil(self.__num_bags * self.__fraction_targets)))
+ self.__num_bits = num_bits
+ self.__dtype = dtype
+ self.__seed_signals = seed_signals
+ self.__seed_data = seed_data
+ self.__data, self.__targets, self.__signals = self._generate_bit_pattern_set()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of bags.
+
+ :return: amount of bags
+ """
+ return self.__num_bags
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific bag.
+
+ :param item_index: specific bag to fetch
+ :return: specific bag as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_bit_pattern_set(self) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying bit pattern data set.
+
+ :return: tuple containing generated bags, targets and signals
+ """
+ torch.random.manual_seed(seed=self.__seed_signals)
+
+ # Generate signal patterns.
+ generated_signals = torch.randint(low=0, high=2, size=(self.__num_signals, self.__num_bits))
+ check_instances = True
+ while check_instances:
+ generated_signals = torch.unique(input=generated_signals, dim=0)
+ generated_signals = generated_signals[generated_signals.sum(axis=1) != 0]
+ missing_signals = self.__num_signals - generated_signals.shape[0]
+ if missing_signals > 0:
+ generated_signals = torch.cat(tensors=(
+ generated_signals, torch.randint(low=0, high=2, size=(missing_signals, self.__num_bits))), dim=0)
+ else:
+ check_instances = False
+
+ # Generate data and target tensors.
+ torch.random.manual_seed(seed=self.__seed_data)
+ generated_data = torch.randint(low=0, high=2, size=(self.__num_bags, self.__num_instances, self.__num_bits))
+ generated_targets = torch.zeros(size=(self.__num_bags,), dtype=generated_data.dtype)
+ generated_targets[:self.__num_targets] = 1
+
+ # Check invalid (all-zero and signal) instances and re-sample them.
+ check_instances = True
+ while check_instances:
+ invalid_instances = (generated_data.sum(axis=2) == 0).logical_or(
+ torch.sum(torch.stack([(generated_data == _).all(axis=2) for _ in generated_signals]), axis=0))
+ if invalid_instances.sum() > 0:
+ generated_data[invalid_instances] = torch.randint(
+ low=0, high=2, size=(invalid_instances.sum(), self.__num_bits))
+ else:
+ check_instances = False
+
+ # Re-implant signal into respective bags.
+ for data_index in range(self.__num_targets):
+ implantation_indices = []
+ for _ in range(self.__num_signals_per_bag):
+ while True:
+ current_implantation_index = torch.randint(low=0, high=generated_data.shape[1], size=(1,))
+ if current_implantation_index not in implantation_indices:
+ implantation_indices.append(current_implantation_index)
+ break
+ current_signal_index = torch.randint(low=0, high=generated_signals.shape[0], size=(1,))
+ generated_data[data_index, current_implantation_index] = generated_signals[current_signal_index]
+
+ return generated_data, generated_targets, generated_signals
+
+ @property
+ def num_bags(self) -> int:
+ return self.__num_bags
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_bits(self) -> int:
+ return self.__num_bits
+
+ @property
+ def num_targets_high(self) -> int:
+ return self.__num_targets
+
+ @property
+ def num_targets_low(self) -> int:
+ return self.__num_bags - self.__num_targets
+
+ @property
+ def num_signals(self) -> int:
+ return self.__num_signals
+
+ @property
+ def num_signals_per_bag(self) -> int:
+ return self.__num_signals_per_bag
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def bags(self) -> torch.Tensor:
+ return self.__data.clone()
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
+
+ @property
+ def signals(self) -> torch.Tensor:
+ return self.__signals.clone()
+
+
+class LatchSequenceSet(Dataset):
+ """
+ Latch data set comprising patterns as one-hot encoded instances.
+ """
+
+ def __init__(self, num_samples: int, num_instances: int = 20, num_characters: int = 6,
+ dtype: torch.dtype = torch.float32, seed: int = 43):
+ """
+ Create new latch sequence data set conforming to the specified properties.
+
+ :param num_samples: amount of samples
+ :param num_instances: amount of instances per sample
+ :param num_characters: amount of different characters
+ :param dtype: data type of samples
+ :param seed: random seed used to generate the samples of the data set
+ """
+ super(LatchSequenceSet, self).__init__()
+ assert (type(num_samples) == int) and (num_samples > 0), r'"num_samples" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_characters) == int) and (num_characters > 0), r'"num_characters" must be a positive integer!'
+ assert type(seed) == int, r'"seed" must be an integer!'
+
+ self.__num_samples = num_samples
+ self.__num_instances = num_instances
+ self.__num_characters = num_characters
+ self.__dtype = dtype
+ self.__seed = seed
+ self.__data, self.__targets = self._generate_latch_sequences()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of samples.
+
+ :return: amount of samples
+ """
+ return self.__num_samples
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific sample.
+
+ :param item_index: specific sample to fetch
+ :return: specific sample as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_latch_sequences(self) -> Tuple[torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying latch sequence data set.
+
+ :return: tuple containing generated data and targets
+ """
+ torch.random.manual_seed(seed=self.__seed)
+
+ # Generate data and target tensors.
+ generated_data = torch.randint(
+ low=2, high=self.__num_characters, size=(self.__num_samples, self.__num_instances))
+ generated_signal = torch.randint(low=0, high=2, size=(self.__num_samples,))
+ generated_data[:, 0] = generated_signal
+ generated_data = torch.nn.functional.one_hot(input=generated_data, num_classes=self.__num_characters)
+
+ return generated_data, generated_signal
+
+ @property
+ def num_samples(self) -> int:
+ return self.__num_samples
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_characters(self) -> int:
+ return self.__num_characters
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/bit_pattern_demo.ipynb b/src/mhnfs/hopfield/examples/bit_pattern/bit_pattern_demo.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..e1755c9079da99dc1ea7af7e0d619b5082ea5dcf
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/bit_pattern_demo.ipynb
@@ -0,0 +1,946 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Example: Bit Pattern Set \n",
+ "\n",
+ "The dataset of this demonstration falls into the category of binary classification tasks in the domain of Multiple Instance Learning (MIL) problems. Each bag comprises a collection of bit pattern instances, wheres each instance is a sequence of 0s and 1s . The positive class has specific bit patterns injected, which are absent in the negative one. This demonstration shows, that Hopfield
, HopfieldPooling
and HopfieldLayer
are capable of learning and filtering each bag with respect to the class-defining bit patterns.\n",
+ "\n",
+ "This demonstration instructs how to apply Hopfield
, HopfieldPooling
and HopfieldLayer
for an exemplary Multiple Instance Learning problem.\n",
+ "\n",
+ "\n",
+ "\n",
+ "In order to run this notebook, a few modules need to be imported. The installation of third-party modules is not covered here."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import general modules used e.g. for plotting.\n",
+ "import matplotlib.pyplot as plt\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "import seaborn as sns\n",
+ "import sys\n",
+ "import torch\n",
+ "\n",
+ "# Importing Hopfield-specific modules.\n",
+ "from auxiliary.data import BitPatternSet\n",
+ "from modules import Hopfield, HopfieldPooling, HopfieldLayer\n",
+ "\n",
+ "# Import auxiliary modules.\n",
+ "from distutils.version import LooseVersion\n",
+ "from typing import List, Tuple\n",
+ "\n",
+ "# Importing PyTorch specific modules.\n",
+ "from torch import Tensor\n",
+ "from torch.nn import Flatten, Linear, Module, Sequential\n",
+ "from torch.nn.functional import binary_cross_entropy_with_logits\n",
+ "from torch.nn.utils import clip_grad_norm_\n",
+ "from torch.optim import AdamW\n",
+ "from torch.utils.data import DataLoader\n",
+ "from torch.utils.data.sampler import SubsetRandomSampler\n",
+ "\n",
+ "# Set plotting style.\n",
+ "sns.set()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Specific minimum versions of Python itself as well as of some used modules is required."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Installed Python version: 3.8.8 (β)\n",
+ "Installed PyTorch version: 1.7.0 (β)\n"
+ ]
+ }
+ ],
+ "source": [
+ "python_check = '(\\u2713)' if sys.version_info >= (3, 8) else '(\\u2717)'\n",
+ "pytorch_check = '(\\u2713)' if torch.__version__ >= LooseVersion(r'1.5') else '(\\u2717)'\n",
+ "\n",
+ "print(f'Installed Python version: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} {python_check}')\n",
+ "print(f'Installed PyTorch version: {torch.__version__} {pytorch_check}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create Dataset \n",
+ "\n",
+ "The dataset itself falls into the category of binary classification tasks in the domain of Multiple Instance Learning (MIL) problems. Defining arguments are:\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " num_bags
\n",
+ " 2048 \n",
+ " Amount of bags (samples) of the full dataset. \n",
+ " \n",
+ " \n",
+ " num_instances
\n",
+ " 16 \n",
+ " Amount of instances per bag (sample). \n",
+ " \n",
+ " \n",
+ " num_signals
\n",
+ " 8 \n",
+ " Amount of unique instances indicative for the positive class. \n",
+ " \n",
+ " \n",
+ " num_signals_per_bag
\n",
+ " 1 \n",
+ " Amount of signals implanted into one bag of a positive class. \n",
+ " \n",
+ " \n",
+ " num_bits
\n",
+ " 8 \n",
+ " Amount of \"bits\" (feature size) per instance. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this demo. \n",
+ " \n",
+ "
\n",
+ "\n",
+ "Let's define the dataset using previously mentioned properties as well as a logging directory for storing all auxiliary outputs like performance plots."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bit_pattern_set = BitPatternSet(\n",
+ " num_bags=2048,\n",
+ " num_instances=16,\n",
+ " num_signals=8,\n",
+ " num_signals_per_bag=1,\n",
+ " num_bits=8)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "log_dir = f'resources/'\n",
+ "os.makedirs(log_dir, exist_ok=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create Auxiliaries \n",
+ "\n",
+ "Before digging into Hopfield-based networks, a few auxiliary variables and functions need to be defined. This is nothing special with respect to Hopfield-based networks, but rather common preparation work of (almost) every machine learning setting (e.g. definition of a data loader as well as a training loop ). We will see, that this comprises the most work of this whole demo."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "device = torch.device(r'cuda:0' if torch.cuda.is_available() else r'cpu')\n",
+ "\n",
+ "# Create data loader of training set.\n",
+ "sampler_train = SubsetRandomSampler(list(range(256, 2048 - 256)))\n",
+ "data_loader_train = DataLoader(dataset=bit_pattern_set, batch_size=32, sampler=sampler_train)\n",
+ "\n",
+ "# Create data loader of validation set.\n",
+ "sampler_eval = SubsetRandomSampler(list(range(256)) + list(range(2048 - 256, 2048)))\n",
+ "data_loader_eval = DataLoader(dataset=bit_pattern_set, batch_size=32, sampler=sampler_eval)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def train_epoch(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float]:\n",
+ " \"\"\"\n",
+ " Execute one training epoch.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader: data loader instance providing training data\n",
+ " :return: tuple comprising training loss as well as accuracy\n",
+ " \"\"\"\n",
+ " network.train()\n",
+ " losses, accuracies = [], []\n",
+ " for sample_data in data_loader:\n",
+ " data, target = sample_data[r'data'], sample_data[r'target']\n",
+ " data, target = data.to(device=device), target.to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " model_output = network.forward(input=data)\n",
+ "\n",
+ " # Update network parameters.\n",
+ " optimiser.zero_grad()\n",
+ " loss = binary_cross_entropy_with_logits(input=model_output, target=target, reduction=r'mean')\n",
+ " loss.backward()\n",
+ " clip_grad_norm_(parameters=network.parameters(), max_norm=1.0, norm_type=2)\n",
+ " optimiser.step()\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " accuracy = (model_output.sigmoid().round() == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " losses.append(loss.detach().item())\n",
+ " \n",
+ " # Report progress of training procedure.\n",
+ " return (sum(losses) / len(losses), sum(accuracies) / len(accuracies))\n",
+ "\n",
+ "\n",
+ "def eval_iter(network: Module,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float]:\n",
+ " \"\"\"\n",
+ " Evaluate the current model.\n",
+ " \n",
+ " :param network: network instance to evaluate\n",
+ " :param data_loader: data loader instance providing validation data\n",
+ " :return: tuple comprising validation loss as well as accuracy\n",
+ " \"\"\"\n",
+ " network.eval()\n",
+ " with torch.no_grad():\n",
+ " losses, accuracies = [], []\n",
+ " for sample_data in data_loader:\n",
+ " data, target = sample_data[r'data'], sample_data[r'target']\n",
+ " data, target = data.to(device=device), target.to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " model_output = network.forward(input=data)\n",
+ " loss = binary_cross_entropy_with_logits(input=model_output, target=target, reduction=r'mean')\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " accuracy = (model_output.sigmoid().round() == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " losses.append(loss.detach().item())\n",
+ "\n",
+ " # Report progress of validation procedure.\n",
+ " return (sum(losses) / len(losses), sum(accuracies) / len(accuracies))\n",
+ "\n",
+ "\n",
+ "def operate(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader_train: DataLoader,\n",
+ " data_loader_eval: DataLoader,\n",
+ " num_epochs: int = 1\n",
+ " ) -> Tuple[pd.DataFrame, pd.DataFrame]:\n",
+ " \"\"\"\n",
+ " Train the specified network by gradient descent using backpropagation.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader_train: data loader instance providing training data\n",
+ " :param data_loader_eval: data loader instance providing validation data\n",
+ " :param num_epochs: amount of epochs to train\n",
+ " :return: data frame comprising training as well as evaluation performance\n",
+ " \"\"\"\n",
+ " losses, accuracies = {r'train': [], r'eval': []}, {r'train': [], r'eval': []}\n",
+ " for epoch in range(num_epochs):\n",
+ " \n",
+ " # Train network.\n",
+ " performance = train_epoch(network, optimiser, data_loader_train)\n",
+ " losses[r'train'].append(performance[0])\n",
+ " accuracies[r'train'].append(performance[1])\n",
+ " \n",
+ " # Evaluate current model.\n",
+ " performance = eval_iter(network, data_loader_eval)\n",
+ " losses[r'eval'].append(performance[0])\n",
+ " accuracies[r'eval'].append(performance[1])\n",
+ " \n",
+ " # Report progress of training and validation procedures.\n",
+ " return pd.DataFrame(losses), pd.DataFrame(accuracies)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def set_seed(seed: int = 42) -> None:\n",
+ " \"\"\"\n",
+ " Set seed for all underlying (pseudo) random number sources.\n",
+ " \n",
+ " :param seed: seed to be used\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " torch.manual_seed(42)\n",
+ " torch.backends.cudnn.deterministic = True\n",
+ " torch.backends.cudnn.benchmark = False\n",
+ "\n",
+ "\n",
+ "def plot_performance(loss: pd.DataFrame,\n",
+ " accuracy: pd.DataFrame,\n",
+ " log_file: str\n",
+ " ) -> None:\n",
+ " \"\"\"\n",
+ " Plot and save loss and accuracy.\n",
+ " \n",
+ " :param loss: loss to be plotted\n",
+ " :param accuracy: accuracy to be plotted\n",
+ " :param log_file: target file for storing the resulting plot\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " fig, ax = plt.subplots(1, 2, figsize=(20, 7))\n",
+ " \n",
+ " loss_plot = sns.lineplot(data=loss, ax=ax[0])\n",
+ " loss_plot.set(xlabel=r'Epoch', ylabel=r'Cross-entropy Loss')\n",
+ " \n",
+ " accuracy_plot = sns.lineplot(data=accuracy, ax=ax[1])\n",
+ " accuracy_plot.set(xlabel=r'Epoch', ylabel=r'Accuracy')\n",
+ " \n",
+ " ax[1].yaxis.set_label_position(r'right')\n",
+ " fig.tight_layout()\n",
+ " fig.savefig(log_file)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Network \n",
+ "\n",
+ "The instantiation of the heart of a Hopfield-based network, the module Hopfield
, is rather straightforward. Only one argument, the size of the input, needs to be set.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_bits (8) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
\n",
+ "\n",
+ "An additional output projection is defined, to downproject the result of Hopfield
to the correct output size. Afterwards, everything is wrapped into a container of type torch.nn.Sequential
and a corresponding optimiser is defined. Now the Hopfield-based network and all auxiliaries are set up and ready to associate !"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield = Hopfield(\n",
+ " input_size=bit_pattern_set.num_bits)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield.output_size * bit_pattern_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield, Flatten(), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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lFCWk8LwpYMnBc/IyxIdioiIiEhSUEJZRERERBLO7XIw4dQuTDi1S6JDkSRjmA7Srnso0WGIiIiIJI3WufKJiIiIiIiIiIiIiDQ7JZRFREREREREREREpFGUUBYRERERERERERGRRlFCWUREREREREREREQaRQllEREREREREREREWkUJZRFREREREREREREpFGUUBYRERERERERERGRRlFCWUREREREREREREQaRQllEREREREREREREWkUJZRFREREREREREREpFGUUBYRERERERERERGRRlFCWUREREREREREREQaRQllEREREREREREREWkUJZRFREREREREREREpFGUUBYRERERERERERGRRlFCWUREREREREREREQaRQllEREREREREREREWkUZ6IDaE6mabSp60rT09wmL81t8tLcJi/NbXJrjvltrf8fSkTcrfV3JY2j+U1emtvkpblNXprb5NWan28N27btJjmziIiIiIiIiIiIiCQVtbwQERERERERERERkUZRQllEREREREREREREGkUJZRERERERERERERFpFCWURURERERERERERKRRlFAWERERERERERERkUZRQllEREREREREREREGkUJZRERERERERERERFpFCWURURERERERERERKRRlFAWERERERERERERkUZRQrmJzJ49mwsvvJDx48fz7LPPJjocOUHXXnstEydO5OKLL+biiy9m2bJlzJ8/n8mTJzN+/Hjuv//+RIcox6impoZJkyaxY8cOgMPO5+rVq7n00kuZMGEC//u//0skEklUyNJIX53bn//854wfPz7+/n377bcBzW1r9Je//IWJEycyceJE7rnnHkDv3WRxqLnVe7dl0jNuctEzbvLRM27y0jNuctLzbfJK+udbW066PXv22Geffba9b98+u7a21p48ebK9fv36RIclx8myLHvcuHF2OByO76uvr7fPPPNMe9u2bXY4HLanTZtmv//++wmMUo7F0qVL7UmTJtkDBgywt2/ffsT5nDhxor1kyRLbtm375z//uf3ss88mMHI5mq/OrW3b9qRJk+zi4uKDxmpuW5ePP/7YvvLKK+1gMGiHQiF76tSp9uzZs/XeTQKHmtu5c+fqvdsC6Rk3uegZN/noGTd56Rk3Oen5Nnm1hedbVSg3gfnz5zN69GgyMzPx+/1MmDCBN998M9FhyXHatGkTANOmTeOiiy7imWeeYfny5XTt2pXOnTvjdDqZPHmy5rgVefHFF7nzzjvJy8sDOOx87ty5k0AgwNChQwG49NJLNc8t3Ffntr6+nl27dnHHHXcwefJk/vznP2NZlua2FcrNzeX222/H7Xbjcrno0aMHW7Zs0Xs3CRxqbnft2qX3bgukZ9zkomfc5KNn3OSlZ9zkpOfb5NUWnm+diQ4gGZWUlJCbmxvfzsvLY/ny5QmMSE5EVVUVY8aM4Ze//CXhcJipU6dy4403HjTHxcXFCYxSjsVvf/vbBtuHes8WFxcftD83N1fz3MJ9dW737t3L6NGjufPOO0lLS+M73/kOL730Er169dLctjK9evWK/7xlyxbeeOMNvvnNb+q9mwQONbfPPvssixYt0nu3hdEzbnLRM27y0TNu8tIzbnLS823yagvPt6pQbgKWZWEYRnzbtu0G29K6DBs2jHvuuYe0tDSys7O5/PLL+fOf/6w5TiKHe8/qvdz6de7cmYceeoi8vDx8Ph/XXnstH3zwgea2FVu/fj3Tpk3jpz/9KZ07d9Z7N4l8eW67d++u924LpN9/ctEzbvLTM27y0jNuctHzbfJK5udbJZSbQEFBAaWlpfHt0tLS+FdTpPVZvHgxCxYsiG/btk3Hjh01x0nkcO/Zr+7fu3ev5rmVWbt2LW+99VZ827ZtnE6n5raV+uyzz7j++uv5n//5H77+9a/rvZtEvjq3eu+2THrGTS56xk1++ncyeenfyeSh59vklezPt0ooN4GxY8eyYMECysvLqa+vZ+7cuZxxxhmJDkuOU3V1Nffccw/BYJCamhpmzpzJrbfeyubNm9m6dSvRaJTXX39dc9yKDRky5JDz2bFjRzweD5999hkAr776qua5lbFtm9/97ndUVlYSDod54YUXOO+88zS3rdDu3bv5/ve/z7333svEiRMBvXeTxaHmVu/dlknPuMlFz7jJT/9OJi/9O5kc9HybvNrC8616KDeB/Px8pk+fztSpUwmHw1x++eUMHjw40WHJcTr77LNZtmwZl1xyCZZlcc011zBs2DB+//vf88Mf/pBgMMiZZ57J+eefn+hQ5Th5PJ7Dzue9997LL37xC2pqahgwYABTp05NcLRyLPr27cu3v/1trr76aiKRCOPHj2fSpEmA5ra1eeqppwgGg/z+97+P77vqqqv03k0Ch5tbvXdbHj3jJhc94yY/PeMmLz3jJgc93yavtvB8a9i2bSc6CBERERERERERERFp+dTyQkREREREREREREQaRQllEREREREREREREWkUJZRFREREREREREREpFGUUBYRERERERERERGRRlFCWUREREREREREREQaxZnoAERE5Pj16dOH3r17Y5oNPx986KGH6NSp00m/1oIFC8jOzj6p5xURERER+YKeb0VEWj4llEVEWrmnn35aD8EiIiIikjT0fCsi0rIpoSwikqQWLlzIvffeS4cOHdi0aRNer5ff//739OjRg+rqau666y7WrFmDYRicfvrp3HrrrTidTpYtW8bdd99NfX09LpeLn/70p4wZMwaABx98kGXLllFRUcG3vvUtpkyZkuC7FBEREZG2Qs+3IiItgxLKIiKt3HXXXdfgK4GdOnXioYceAqCoqIif/exnjBgxgueee47bbruNV155hbvvvpvMzExmz55NOBzm5ptv5q9//Ss33HAD3//+97n77rs566yzKCoq4uc//zmvvvoqAJ07d+bOO+9k1apVXHnllVxxxRW4XK6E3LeIiIiIJCc934qItGxKKIuItHJH+kpg3759GTFiBACXXXYZM2bMYN++fcybN4/nnnsOwzBwu91cddVVPP3005x22mmYpslZZ50FwMCBA5k9e3b8fJMmTQKgX79+hEIhampqyMrKatobFBEREZE2Rc+3IiItm3n0ISIi0lo5HI5D7rMsC8Mw4vssyyISieBwOBrsB1i3bh2RSAQApzP2OeQXY2zbbqrQRUREREQOoudbEZHEU0JZRCSJrVmzhjVr1gDwwgsvMGzYMNLT0xk3bhzPPPMMtm0TCoV48cUXGTt2LN27d8cwDD7++GMAVq5cyXXXXYdlWYm8DRERERERQM+3IiItgVpeiIi0cl/tMQdw66234vV6adeuHQ888AA7d+4kOzube+65B4Bf/OIX3H333UyePJlwOMzpp5/Od7/7XdxuNw8++CC/+93vuOeee3C5XDz44IO43e5E3JqIiIiItEF6vhURadkMW9/nEBFJSgsXLuQ3v/kNr7/+eqJDERERERE5YXq+FRFpGdTyQkREREREREREREQaRRXKIiIiIiIiIiIiItIoqlAWERERERERERERkUZRQllEREREREREREREGkUJZRERERERERERERFpFCWURURERERERERERKRRlFAWERERERERERERkUZRQllEREREREREREREGuX/AwWBX63+bJ4+AAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_base.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Network \n",
+ "We can now explore the functionality of our Hopfield layer Hopfield
. \n",
+ "\n",
+ "As described in the paper the Hopfield layer allows:\n",
+ "- association of two sets\n",
+ "- multiple updates\n",
+ "- variable beta\n",
+ "- changing the dimension of the associative space\n",
+ "- pattern normalization\n",
+ "- static patterns for fixed pattern search\n",
+ "\n",
+ "This time, additional arguments are set to increase the training as well as the validation performance of the Hopfield-based network.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_bits (8) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " hidden_size
\n",
+ " 8 \n",
+ " Size (depth) of the association space. \n",
+ " \n",
+ " \n",
+ " num_heads
\n",
+ " 8 \n",
+ " Amount of parallel association heads. \n",
+ " \n",
+ " \n",
+ " update_steps_max
\n",
+ " 3 \n",
+ " Number of updates in one Hopfield head. \n",
+ " \n",
+ " \n",
+ " scaling
\n",
+ " 0.25 \n",
+ " Beta parameter that determines the kind of fixed point. \n",
+ " \n",
+ " \n",
+ " dropout
\n",
+ " 0.5 \n",
+ " Dropout probability applied on the association matrix. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield = Hopfield(\n",
+ " input_size=bit_pattern_set.num_bits,\n",
+ " hidden_size=8,\n",
+ " num_heads=8,\n",
+ " update_steps_max=3,\n",
+ " scaling=0.25,\n",
+ " dropout=0.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield.output_size * bit_pattern_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield, Flatten(), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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iIiIyLlKgbKIiIjIGXKYJvmBLGpKciZ7KKdkfnUee490c8//vEpj+wC3XjX3hO0NBivJi4O+EcG5y+ngyx++gGvPrx7XMcvEsFIpsqwwlufs/j+ddcWHMfPKwXVu900XEREReTNTywsRERGRs+BTt60453oHL6jJ44+v12Ng8A/vXUVN6YnDw8FAuSR/9BYlOT73qM9PJ48++ijf/e53SSQSvO997+O2224b9vq3v/1tHn74YQIBuw/1u9/9bm677TYaGxu5++676ejooLa2lq997Wv4/VO3j7AVDWFiYXjPbsW5a85aXHPWntVtioiIiMjEUqAsIiIichYU5p57faCXzS7gA9fNZ8XcIrK9Jw/DMxXKeefesZ4NLS0t3HffffziF7/A7XZzyy23sGbNGmbPnp1ZZtu2bXz9619nxYoVw9b9whe+wK233soNN9zA/fffz3e+8x3uvvvuiT6EMbNcfr7Q/Q6uX7ZgsociIiIiIlOMWl6IiIiIvEk5TJNLlpWPKUwGKArabQpK8t6cE6q9+OKLXHDBBQSDQXw+H9deey2PPfbYsGW2bdvG9773PdavX88999xDNBolHo/z6quvcu211wLwjne8Y8R6U01/NElnKpvsYHCyhyIiIiIiU4wqlEVERERkTGaW57KoNp+FM/ImeyiTorW1laKioUkLi4uL2bJlS+Zxf38/CxYs4O6776ampoZPf/rTfOc73+G2224jOzsbp9O+9C4qKqKlpeWU919QMHET2QXzUpy/sJRlc4soKjq3eoPLqdH5nd50fqc3nd/pT+d4ejuXz68CZREREREZk2yvi797z/LJHsakSaVSwyYjtCxr2GO/388DDzyQeXzHHXfw2c9+lltvvXXEJIbHPh6Ljo4QqZR1GiM/PR9920KKinJoa+ubsH3KxNL5nd50fqc3nd/pT+d4epuo82uaxrgUJajlhYiIiIjIGJSWltLW1pZ53NbWRnFxceZxY2MjP//5zzOPLcvC6XSSn59PX18fyWRy1PVERERERM4lCpRFRERERMZg7dq1bNiwgc7OTsLhME888QSXXnpp5vWsrCy++tWvcuTIESzL4sEHH+Tqq6/G5XKxevVqfve73wHwyCOPDFtPRERERORcokBZRERERGQMSkpKuOuuu7j99tu56aabWLduHUuXLuXOO+9k69at5Ofnc8899/Cxj32Mt771rViWxQc+8AEAPv/5z/PTn/6U66+/ntdee42//du/ndyDERERERE5TYZlWRPXiO0sm+g+cqAeNtOdzu/0p3M8ven8Tm86v9PbRJ7f8eolN9507Stnm87v9KbzO73p/E5/OsfTm3ooi4iIiIiIiIiIiMibggJlERERERERERERERkTBcoiIiIiIiIiIiIiMiYKlEVERERERERERERkTBQoi4iIiIiIiIiIiMiYKFAWERERERERERERkTFRoCwiIiIiIiIiIiIiY6JAWURERERERERERETGRIGyiIiIiIiIiIiIiIyJAmURERERERERERERGRMFyiIiIiIiIiIiIiIyJgqURURERERERERERGRMFCiLiIiIiIiIiIiIyJg4J3sAZ8I0jTfVfmVi6PxOfzrH05vO7/Sm8zu9TdT5PVf/P9K1r4wHnd/pTed3etP5nf50jqe3iTi/47UPw7Isa1y2LCIiIiIiIiIiIiLTilpeiIiIiIiIiIiIiMiYKFAWERERERERERERkTFRoCwiIiIiIiIiIiIiY6JAWURERERERERERETGRIGyiIiIiIiIiIiIiIyJAmURERERERERERERGRMFyiIiIiIiIiIiIiIyJgqURURERERERERERGRMFCiLiIiIiIiIiIiIyJgoUB6jRx99lOuvv55rrrmGBx98cLKHI2fJe9/7Xm644QZuvPFGbrzxRjZv3syLL77I+vXrueaaa7jvvvsme4hyGkKhEOvWraO+vh7guOd0586dvOMd7+Daa6/lH/7hH0gkEpM1ZDkFx57fz3zmM1xzzTWZz/GTTz4J6Pyei7797W9zww03cMMNN3DvvfcC+vxOJ6OdX31+py5d+04/uu6dnnTdO73pund607Xv9Dbtr30tOanm5mbriiuusLq6uqz+/n5r/fr11t69eyd7WHKGUqmUdfHFF1vxeDzzXDgcti677DKrrq7Oisfj1h133GE9/fTTkzhKOVWbNm2y1q1bZy1atMg6cuTICc/pDTfcYG3cuNGyLMv6zGc+Yz344IOTOHIZi2PPr2VZ1rp166yWlpYRy+r8nlteeOEF6z3veY8VjUatWCxm3X777dajjz6qz+80Mdr5feKJJ/T5naJ07Tv96Lp3etJ17/Sm697pTde+09ub4dpXFcpj8OKLL3LBBRcQDAbx+Xxce+21PPbYY5M9LDlDBw4cAOCOO+7gbW97Gz/60Y/YsmULNTU1VFVV4XQ6Wb9+vc71OeanP/0pn//85ykuLgY47jltaGggEomwfPlyAN7xjnfoXJ8Djj2/4XCYxsZGPvvZz7J+/Xq++c1vkkqldH7PQUVFRXz605/G7XbjcrmYNWsWhw4d0ud3mhjt/DY2NurzO0Xp2nf60XXv9KTr3ulN173Tm659p7c3w7Wvc7IHcC5obW2lqKgo87i4uJgtW7ZM4ojkbOjt7eXCCy/kH//xH4nH49x+++186EMfGnGuW1paJnGUcqr++Z//edjj0T6/LS0tI54vKirSuT4HHHt+29vbueCCC/j85z9PTk4OH/nIR/j5z3/OnDlzdH7PMXPmzMn8+9ChQ/z+97/nz//8z/X5nSZGO78PPvggr7zyij6/U5CufacfXfdOT7rund503Tu96dp3enszXPuqQnkMUqkUhmFkHluWNeyxnJtWrFjBvffeS05ODvn5+dx8881885vf1LmeZo73+dXnenqoqqri/vvvp7i4GK/Xy3vf+16eeeYZnd9z2N69e7njjjv45Cc/SVVVlT6/08zR53fmzJn6/E5ROgfTj6573xx03Tu96bp3etK17/Q2na99FSiPQWlpKW1tbZnHbW1tmdtO5Nz12muvsWHDhsxjy7KoqKjQuZ5mjvf5Pfb59vZ2netz0O7du3n88cczjy3Lwul06vyeo15//XXe//7383d/93e8/e1v1+d3mjn2/OrzO3Xp2nf60XXvm4N+b05v+r05/ejad3qb7te+CpTHYO3atWzYsIHOzk7C4TBPPPEEl1566WQPS85QX18f9957L9FolFAoxC9/+Us+8YlPcPDgQQ4fPkwymeQ3v/mNzvU5btmyZaOe04qKCjweD6+//joAv/rVr3Suz0GWZfHlL3+Znp4e4vE4Dz30EFdffbXO7zmoqamJv/zLv+RrX/saN9xwA6DP73Qy2vnV53fq0rXv9KPr3jcH/d6c3vR7c3rRte/09ma49lUP5TEoKSnhrrvu4vbbbycej3PzzTezdOnSyR6WnKErrriCzZs3c9NNN5FKpbj11ltZsWIFX/nKV/jrv/5rotEol112GW9961sne6hyBjwez3HP6de+9jU+97nPEQqFWLRoEbfffvskj1ZO1fz58/nwhz/Mn/3Zn5FIJLjmmmtYt24doPN7rvmv//ovotEoX/nKVzLP3XLLLfr8ThPHO7/6/E5NuvadfnTd++ag697pTde904uufae3N8O1r2FZljXZgxARERERERERERGRqU8tL0RERERERERERERkTBQoi4iIiIiIiIiIiMiYKFAWERERERERERERkTFRoCwiIiIiIiIiIiIiY6JAWURERERERERERETGxDnZAxARkZHmzZvH3LlzMc3h3/vdf//9VFZWnvV9bdiwgfz8/LO6XRERERGRsdC1r4jIuUWBsojIFPWDH/xAF7oiIiIi8qaga18RkXOHAmURkXPMyy+/zNe+9jXKy8s5cOAAWVlZfOUrX2HWrFn09fXxhS98gV27dmEYBpdccgmf+MQncDqdbN68mS996UuEw2FcLhef/OQnufDCCwH41re+xebNm+nu7uaDH/wgt9122yQfpYiIiIiIrn1FRKYiBcoiIlPU+973vmG3/VVWVnL//fcDsG3bNj71qU+xevVqfvKTn3D33Xfzi1/8gi996UsEg0EeffRR4vE4H/vYx/jv//5vPvCBD/CXf/mXfOlLX+Lyyy9n27ZtfOYzn+FXv/oVAFVVVXz+859nx44dvOc97+Hd7343LpdrUo5bRERERN58dO0rInLuUKAsIjJFnei2v/nz57N69WoA3vnOd3LPPffQ1dXFs88+y09+8hMMw8DtdnPLLbfwgx/8gIsuugjTNLn88ssBWLx4MY8++mhme+vWrQNgwYIFxGIxQqEQeXl543uAIiIiIiJpuvYVETl3mCdfREREphqHwzHqc6lUCsMwMs+lUikSiQQOh2PY8wB79uwhkUgA4HTa3y8OLmNZ1ngNXURERETklOjaV0RkalGgLCJyDtq1axe7du0C4KGHHmLFihUEAgEuvvhifvSjH2FZFrFYjJ/+9KesXbuWmTNnYhgGL7zwAgDbt2/nfe97H6lUajIPQ0RERETkpHTtKyIytajlhYjIFHVsHzmAT3ziE2RlZVFYWMg3vvENGhoayM/P59577wXgc5/7HF/60pdYv3498XicSy65hI9+9KO43W6+9a1v8eUvf5l7770Xl8vFt771Ldxu92QcmoiIiIjIMLr2FRE5dxiW7u0QETmnvPzyy3zxi1/kN7/5zWQPRURERERkXOnaV0Rk6lHLCxEREREREREREREZE1Uoi4iIiIiIiIiIiMiYqEJZRERERERERERERMZEgbKIiIiIiIiIiIiIjIkCZREREREREREREREZEwXKIiIiIiIiIiIiIjImCpRFREREREREREREZEwUKIuIiIiIiIiIiIjImPz/ep8YfRarJNsAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_adapted.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Pooling \n",
+ "\n",
+ "The previous examples manually downprojected the result of Hopfield
by applying a linear layer afterwards. It would've also been possible to apply some kind of pooling . Exactly for such use cases, the module HopfieldPooling
might be the right choice. Internally, a state pattern is trained, which in turn is used to compute pooling weights with respect to the input."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_pooling = HopfieldPooling(\n",
+ " input_size=bit_pattern_set.num_bits)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_pooling.output_size, out_features=1)\n",
+ "network = Sequential(hopfield_pooling, output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Pooling "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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d9LjuSvJ3/3jPDA5uf+69KNMIvaU2MgQfnrZmC63yYmOCOGys9q/57NP78+WgprgJHwWi8GIrDhWbC7D5ze56MysI/7sH8gwDOKinB1aNABMHp5y0P329l0+UQzD4OxD3JA4GiF2K7fMH8GX60q44IwBRHfjTbnQEBsPfHcSXp+fqrpWIsMOfhNt74Srj/57LWeOTuWCM7I6TOYqJxdraATW1CE9HYaIiIiI9DDDNM0T2xviBFDLCzneNL59V28ZW79pkl9UH5xwrqe9/EkeH6/cw/cvGH7IZNyJ1tji4f9eWs3YnATmT8siNSX6qMfXNE0WLN3F8My4k+Z9P5Us3VDCc+9tZmj/GP7fleM6TTT2lvNXjpxaXhxeT13v7vrLHRh2J2Hzfn5Cn1u6l36e9m0a375N49t3aWz7thM1vt11rXtylJWJiMghWQzjpEpqTh2ZQml1M2OPst1Fd4kItfPr7046LscyDIMLzsg6LseSIzd+cCKzTmvkvEn9VbUqchKxZYzCUC9lERERkVOaEsoiInLEMlMiuf3yMT0dhvRhToeNK88Z1NNhiMgBQk6/tKdDEBEREZEe1rWmmiIiIiIiIiIiIiJyylNCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERERERGRLlFCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERERERGRLlFCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERERERGRLlFCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERERERGRLrH1dADdwWIxTqnnlRND49t3aWz7No1v36bx7btO1GYA4HIAAAlySURBVNj21s+QrnfleNPY9m0a375N49t3aWz7thMxvt31HIZpmma3HFlERERERERERERE+hS1vBARERERERERERGRLlFCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERERERGRLlFCWURERERERERERES6RAllEREREREREREREekSJZRFREREREREREREpEuUUBYRERERERER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zgJg5MiRLFiwIHi8uXPnAjBs2DDcbjeNjY3ExsZ27wsUERERkVOarndFRE5+lsNvIiIivYHVau30Mb/fj2EYwcf8fj9erxer1drucYBt27bh9XoBsNkC9xz3bmOaZneFLiIiIiJyWLreFRE5OSihLCLSR2zZsoUtW7YA8MorrzBu3DiioqKYNm0aL7zwAqZp4na7efXVV5k6dSrZ2dkYhsGSJUsA2LhxI9dffz1+v78nX4aIiIiISKd0vSsicnJQywsRkV7kwJ5yAHfccQdOp5OEhAQef/xxioqKiIuL4+GHHwbg3nvv5cEHH2TevHl4PB7OPPNMbrnlFhwOB0888QS/+c1vePjhh7Hb7TzxxBM4HI6eeGkiIiIiIrreFRHpBQxT3+kQEen1li9fzq9//Wvee++9ng5FREREROS40/WuiMjJQy0vRERERERERERERKRLVKEsIiIiIiIiIiIiIl2iCmURERERERERERER6RIllEVERERERERERESkS5RQFhEREREREREREZEuUUJZRERERERERERERLpECWURERERERERERER6RIllEVERERERERERESkS/4/nWfNoOgxrksAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_pooling.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Pooling \n",
+ "We can now again explore the functionality of our Hopfield-based pooling layer HopfieldPooling
. \n",
+ "\n",
+ "Again, additional arguments are set to increase the training as well as the validation performance of the Hopfield-based pooling.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_bits (8) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " hidden_size
\n",
+ " 8 \n",
+ " Size (depth) of the association space. \n",
+ " \n",
+ " \n",
+ " num_heads
\n",
+ " 8 \n",
+ " Amount of parallel association heads. \n",
+ " \n",
+ " \n",
+ " \n",
+ " update_steps_max
\n",
+ " 3 \n",
+ " Number of updates in one Hopfield head. \n",
+ " \n",
+ " \n",
+ " scaling
\n",
+ " 0.25 \n",
+ " Beta parameter that determines the kind of fixed point. \n",
+ " \n",
+ " \n",
+ " dropout
\n",
+ " 0.5 \n",
+ " Dropout probability applied on the association matrix. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_pooling = HopfieldPooling(\n",
+ " input_size=bit_pattern_set.num_bits,\n",
+ " hidden_size=8,\n",
+ " num_heads=8,\n",
+ " update_steps_max=3,\n",
+ " scaling=0.25,\n",
+ " dropout=0.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_pooling.output_size, out_features=1)\n",
+ "network = Sequential(hopfield_pooling, output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_pooling_adapted.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Lookup \n",
+ "\n",
+ "In contrast to the first Hopfield
setting, in which the state patterns as well as the stored patterns are directly dependent on the input, HopfieldLayer
employs a trainable but fixed stored pattern matrix, which in turn acts as a learnable lookup table."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bit_samples_unique = [_[r'data'] for _ in data_loader_train]\n",
+ "bit_samples_unique = torch.cat(bit_samples_unique).view(-1, bit_samples_unique[0].shape[2]).unique(dim=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_lookup = HopfieldLayer(\n",
+ " input_size=bit_pattern_set.num_bits,\n",
+ " quantity=len(bit_samples_unique))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_lookup.output_size * bit_pattern_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield_lookup, Flatten(start_dim=1), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Lookup "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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rXNTfJ2b4uu8rmVszWZTm01GEBERERFpj1qth3JYWBglJSWO7ZKSEkJCQhzbwcHBxMTEkJCQAEBSUlKjGcyffPIJt9xyS2sNT0REREREREREREQuU6sVlIcPH8727dspKyujurqa9evXO/olA/Tv35+ysjLS09MB2LhxI71793Y8vn//fgYNUt81ERERERERERERketFq7W8CA0N5cknn2T69OlYrVamTp1KYmIiDz30ELNmzSIhIYFFixYxe/ZsqqurCQsLY/78+Y7n5+XlERYW1lrDExEREREREREREZHL1GoFZYDk5GSSk5Mb7Xvttdcc/+7bty8ffPBBs89NSUlpzaGJiIiIiIiIiIiIyGVqtZYXIiIiIiIiIiIiIuJcVFAWERERERERERERkRZRQVlEREREREREREREWkQFZRERERERERERERFpERWURURERERERERERKRFVFAWERERERERERERkRZRQVlEREREREREREREWkQFZRERERERERERERFpERWURURERERERERERKRFVFAWERERERERERERkRZRQVlEREREREREREREWkQFZRERERERERERERFpEde2HkBrMJtN36nzyrWh+Dovxda5Kb7OTfF1Xtcqtu31b0j5rlxtiq1zU3ydm+LrvBRb53Yt4tta5zAZhmG0yiuLiIiIiIiIiIiIiFNRywsRERERERERERERaREVlEVERERERERERESkRVRQFhEREREREREREZEWUUFZRERERERERERERFpEBWURERERERERERERaREVlEVERERERERERESkRVRQFhEREREREREREZEWUUFZRERERERERERERFpEBWURERERERERERERaREVlK/QqlWruOWWWxg/fjxLlixp6+HIVXD//fczadIkJk+ezOTJk0lJSWHbtm0kJyczfvx4XnzxxbYeolymyspKkpKSOHHiBMBF43n48GFuv/12JkyYwK9//WtsNltbDVkuw4XxffbZZxk/frzjHt6wYQOg+LZHf/nLX5g0aRKTJk1i/vz5gO5fZ9JcfHX/Xp+U7zof5bvOR/muc1O+65yU6zo3p891DfmvnTx50hg7dqxRXl5uVFVVGcnJycbRo0fbelhyBex2uzFy5EjDarU69lVXVxujR482cnNzDavVasycOdP47LPP2nCUcjn2799vJCUlGb179zby8vK+NZ6TJk0y9u3bZxiGYTz77LPGkiVL2nDk0hIXxtcwDCMpKckoKipqcqzi275s3brVuPvuu43a2lqjrq7OmD59urFq1Srdv06iufiuX79e9+91SPmu81G+63yU7zo35bvOSbmuc/su5LqaoXwFtm3bxtChQ/H398fLy4sJEyawdu3ath6WXIGsrCwAZs6cya233srixYtJTU0lJiaGqKgoXF1dSU5OVpzbkffee485c+YQEhICcNF45ufnU1NTQ79+/QC4/fbbFed24ML4VldXU1BQwK9+9SuSk5N5+eWXsdvtim87FBwczDPPPIObmxsWi4X4+HhycnJ0/zqJ5uJbUFCg+/c6pHzX+SjfdT7Kd52b8l3npFzXuX0Xcl3Xth5Ae1ZcXExwcLBjOyQkhNTU1DYckVypiooKhg0bxnPPPYfVamX69Ok8+OCDTeJcVFTUhqOUy/G73/2u0XZz921RUVGT/cHBwYpzO3BhfEtLSxk6dChz5szBx8eHH//4x3zwwQd07dpV8W1nunbt6vh3Tk4Oa9as4b777tP96ySai++SJUvYtWuX7t/rjPJd56N81/ko33Vuynedk3Jd5/ZdyHU1Q/kK2O12TCaTY9swjEbb0v7079+f+fPn4+PjQ0BAAFOnTuXll19WnJ3Ixe5b3c/OISoqikWLFhESEoKnpyf3338/n3/+ueLbjh09epSZM2fy9NNPExUVpfvXyXwzvnFxcbp/r0N6/52P8l3np3zXuSnfdS7KdZ2bM+e6KihfgbCwMEpKShzbJSUljp+hSPu0e/dutm/f7tg2DIOIiAjF2Ylc7L69cH9paani3A4dOXKEdevWObYNw8DV1VXxbaf27NnDD3/4Q37+858zZcoU3b9O5sL46v69PinfdT7Kd52fPi+dmz4vnYdyXefm7LmuCspXYPjw4Wzfvp2ysjKqq6tZv349N954Y1sPS67A2bNnmT9/PrW1tVRWVrJs2TKeeuopsrOzOX78OPX19axevVpxbsf69u3bbDwjIiJwd3dnz549AKxYsUJxbocMw+D3v/89Z86cwWq1snTpUm666SbFtx0qLCzkscceY8GCBUyaNAnQ/etMmouv7t/rk/Jd56N81/np89K56fPSOSjXdW7fhVxXPZSvQGhoKE8++STTp0/HarUydepUEhMT23pYcgXGjh1LSkoKt912G3a7nXvuuYf+/fszb948nnjiCWpraxk9ejQTJ05s66HKf8nd3f2i8VywYAGzZ8+msrKS3r17M3369DYerVyuHj168PDDD/ODH/wAm83G+PHjSUpKAhTf9ub111+ntraWefPmOfZNmzZN96+TuFh8df9ef5TvOh/lu85P+a5zU77rHJTrOrfvQq5rMgzDaOtBiIiIiIiIiIiIiMj1Ty0vRERERERERERERKRFVFAWERERERERERERkRZRQVlEREREREREREREWkQFZRERERERERERERFpERWURURERERERERERKRFXNt6ACIi0jLdu3enW7dumM2NvwtctGgRkZGRV/1c27dvJyAg4Kq+roiIiIjIxSjfFRFpH1RQFhFpR9544w0lvSIiIiLitJTviohc/1RQFhFxAjt37mTBggV06tSJrKwsPDw8mDdvHvHx8Zw9e5b//d//JT09HZPJxKhRo3jqqadwdXUlJSWFuXPnUl1djcVi4emnn2bYsGEALFy4kJSUFE6fPs2PfvQj7r333ja+ShERERH5rlK+KyJy/VBBWUSkHZkxY0ajnwBGRkayaNEiAA4ePMgvf/lLBg0axDvvvMMvfvELPvroI+bOnYu/vz+rVq3CarXy6KOP8s9//pMHHniAxx57jLlz5zJmzBgOHjzIs88+y4oVKwCIiopizpw5HDp0iLvvvpu77roLi8XSJtctIiIiIt8NyndFRK5/KiiLiLQj3/YTwB49ejBo0CAA7rjjDp5//nnKy8v54osveOeddzCZTLi5uTFt2jTeeOMNRowYgdlsZsyYMQD06dOHVatWOV4vKSkJgJ49e1JXV0dlZSUdO3Zs3QsUERERke805bsiItc/86UPERGR9sDFxaXZfXa7HZPJ5Nhnt9ux2Wy4uLg02g+QkZGBzWYDwNW14TvHr44xDKO1hi4iIiIicknKd0VErg8qKIuIOIn09HTS09MBWLp0Kf3798fX15eRI0eyePFiDMOgrq6O9957j+HDhxMXF4fJZGLr1q0ApKWlMWPGDOx2e1tehoiIiIhIs5TviohcH9TyQkSkHbmwpxzAU089hYeHB0FBQbz00kvk5+cTEBDA/PnzAZg9ezZz584lOTkZq9XKqFGjeOSRR3Bzc2PhwoX8/ve/Z/78+VgsFhYuXIibm1tbXJqIiIiIiPJdEZF2wGToNx0iIu3ezp07eeGFF1i9enVbD0VERERE5KpTvisicv1QywsRERERERERERERaRHNUBYRERERERERERGRFtEMZRERERERERERERFpERWURURERERERERERKRFVFAWERERERERERERkRZRQVlEREREREREREREWkQFZRERERERERERERFpERWURURERERERERERKRF/j8jM2fbdqbgBgAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_lookup.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Lookup \n",
+ "We can now again explore the functionality of our Hopfield-based lookup layer HopfieldLayer
. \n",
+ "\n",
+ "This lookup setting is especially pronounced, if the state patterns are initialized with a subset of the training set (and optionally provide the corresponding training targets as pattern projection inputs).\n",
+ "\n",
+ "Again, additional arguments are set to increase the training as well as the validation performance of the Hopfield-based lookup.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " lookup_weights_as_separated
\n",
+ " True \n",
+ " Separate lookup weights from lookup target weights (e.g. to set lookup target weights separately). \n",
+ " \n",
+ " \n",
+ " lookup_targets_as_trainable
\n",
+ " False \n",
+ " Employ trainable lookup target weights (used as pattern projection input). \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_lookup = HopfieldLayer(\n",
+ " input_size=bit_pattern_set.num_bits,\n",
+ " quantity=len(bit_samples_unique),\n",
+ " lookup_weights_as_separated=True,\n",
+ " lookup_targets_as_trainable=False,\n",
+ " normalize_stored_pattern_affine=True,\n",
+ " normalize_pattern_projection_affine=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initialize the trainable but fixed stored patterns with all unique samples from the training set. In this way, the Hopfield-based lookup already starts with meaningful stored patterns (instead of random noise). This may enhance the performance of the network, especially at the beginning of the training."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with torch.no_grad():\n",
+ " hopfield_lookup.lookup_weights[:] = bit_samples_unique.unsqueeze(dim=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_lookup.output_size * bit_pattern_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield_lookup, Flatten(start_dim=1), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=250)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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+OPXcWy73XFm9hCiO1bTtOw+AssfIPja73Fi0W6MVERERKTv6bKE8ooVK5g1axYZGRn4/X4WLFjAsmXLEvv9fj+vv/46AwYMIBAIUFlZSVraoXu0iYiIiEjvNroggzR/vFXAhGGZAKT5PUwakc3LH+zijj9+wBur91DXqE+mSddxYpHE14bZ/o88nvHzMTMH4zTVYCRnxFtlWOoKKCIiInIoXfa0tG/fPnJychKvc3NzWbt2bYsxbrebN998k+9+97vk5uZy6qmnHtE1srNTOiXWI5WTc+jVrqVv0/z2f5rj/k3z279pfvuGM04cwnvFe5k2YSCmGW+J8eMbT+Gtj3ez9J2tPPzyRh5ZvpExQzL55uVTGD4oHdD8SucxU7Kav7AOOc7KG0XyJT/uhohERERE+o8uSyjbtt2ip57jOG0uwnLaaafx/vvvc++99/KTn/yEX//61x2+RmVlA7bdvR+bzMlJpbxc/f/6K81v/6c57t80v/2b5rfvWHhyIQtmFFBZ2dBi+9QRWUwZnsnOsgbWfF7Bxp017NhTQ4rb7Nb5NU2jxwoTpHsYydm4hs/EfcLZPR2KiIiISL/TZQnl/Px8Pvroo8Tr8vJycnNzE69ramooLi5OVCUXFRWxZMmSrgpHRERERLqJZZpYnrb3GYbB0PxUhuanwpzujUuOH4Zp4jv7Wz0dhoiIiEi/1GU9lGfPns3KlSupqqoiEAiwfPly5s2bl9jvOA633norJSUlACxbtozp06d3VTgiIiIiIiIiIiIicoy6rEI5Ly+PJUuWsHjxYiKRCJdffjmTJ0/mxhtv5Nvf/jaTJk3iZz/7Gd/4xjcwDINRo0bx05/+tKvCEREREREREREREZFj1KVLGBcVFVFUVNRi20MPPZT4+qyzzuKss87qyhBEREREREREREREpJN0WcsLEREREREREREREelflFAWERERERERERERkQ5RQllEREREREREREREOkQJZRERERERERERERHpECWURURERERERERERKRDlFAWERERERERERERkQ5RQllEREREREREREREOkQJZRERERERERERERHpECWURURERERERERERKRDlFAWERERERERERERkQ5RQllEREREREREREREOkQJZRERERERERERERHpECWURURERERERERERKRDlFAWERERERERERERkQ5x9XQAx8I0jePqutI9NL/9n+a4f9P89m+a3/6tu+a3r/450rOvdAXNb/+m+e3fNL/9n+a4f+uO+e2qaxiO4zhdcmYRERERERERERER6VfU8kJEREREREREREREOkQJZRERERERERERERHpECWURURERERERERERKRDlFAWERERERERERERkQ5RQllEREREREREREREOkQJZRERERERERERERHpECWURURERERERERERKRDlFAWERERERERERERkQ5RQllEREREREREREREOkQJ5Q5aunQp559/Pueccw6PPfZYT4cjneS6665j4cKFXHTRRVx00UWsWbOGFStWUFRUxDnnnMN9993X0yHKUWhoaOCCCy5g9+7dAO3O6fr167n00ktZsGABP/jBD4hGoz0VshyBL87vbbfdxjnnnJN4H7/yyiuA5rcv+u1vf8vChQtZuHAh99xzD6D3b3/S1vzq/dt76dm3/9Fzb/+k597+Tc+9/Zueffu3fv/s68hhlZaWOqeffrpTXV3tNDY2OkVFRc7mzZt7Oiw5RrZtO6eeeqoTiUQS2wKBgHPaaac5O3fudCKRiHPDDTc4b7zxRg9GKUfqk08+cS644AJn4sSJzq5duw45pwsXLnRWr17tOI7j3Hbbbc5jjz3Wg5FLR3xxfh3HcS644AKnrKys1VjNb9/y7rvvOldeeaUTCoWccDjsLF682Fm6dKnev/1EW/O7fPlyvX97KT379j967u2f9Nzbv+m5t3/Ts2//djw8+6pCuQNWrFjBrFmzyMjIwO/3s2DBApYtW9bTYckx2rp1KwA33HADF154IY8++ihr165l6NChFBYW4nK5KCoq0lz3MU8++SR33HEHubm5AO3O6Z49ewgGg0ydOhWASy+9VHPdB3xxfgOBACUlJdx+++0UFRXxm9/8Btu2Nb99UE5ODt///vfxeDy43W5GjhzJ9u3b9f7tJ9qa35KSEr1/eyk9+/Y/eu7tn/Tc27/pubd/07Nv/3Y8PPu6ejqAvmDfvn3k5OQkXufm5rJ27doejEg6Q11dHaeccgo/+tGPiEQiLF68mK997Wut5rqsrKwHo5Qj9fOf/7zF67bev2VlZa225+TkaK77gC/Ob0VFBbNmzeKOO+4gNTWVb3zjGzz11FOMHj1a89vHjB49OvH19u3beemll7j22mv1/u0n2prfxx57jA8++EDv315Iz779j557+yc99/Zveu7t3/Ts278dD8++qlDuANu2MQwj8dpxnBavpW+aNm0a99xzD6mpqWRlZXH55Zfzm9/8RnPdz7T3/tX7un8oLCzkwQcfJDc3F5/Px3XXXcebb76p+e3DNm/ezA033MB3v/tdCgsL9f7tZw6e3xEjRuj920tpDvofPfceH/Tc27/pubd/0rNv/9afn32VUO6A/Px8ysvLE6/Ly8sTHzuRvuujjz5i5cqVideO4zB48GDNdT/T3vv3i9srKio0133Qxo0befnllxOvHcfB5XJpfvuoVatW8ZWvfIXvfOc7XHLJJXr/9jNfnF+9f3svPfv2P3ruPT7o383+Tf9u9j969u3f+vuzrxLKHTB79mxWrlxJVVUVgUCA5cuXM2/evJ4OS45RfX0999xzD6FQiIaGBp599lluueUWtm3bxo4dO4jFYrzwwgua6z5uypQpbc7p4MGD8Xq9rFq1CoDnn39ec90HOY7DL37xC2pra4lEIjzxxBOcffbZmt8+aO/evXzzm9/kV7/6FQsXLgT0/u1P2ppfvX97Lz379j967j0+6N/N/k3/bvYvevbt346HZ1/1UO6AvLw8lixZwuLFi4lEIlx++eVMnjy5p8OSY3T66aezZs0aLr74Ymzb5pprrmHatGncfffd/Mu//AuhUIjTTjuNc889t6dDlWPg9XrbndNf/epX/PCHP6ShoYGJEyeyePHiHo5WjtS4ceP4+te/ztVXX000GuWcc87hggsuADS/fc3//M//EAqFuPvuuxPbrrrqKr1/+4n25lfv395Jz779j557jw967u3f9Nzbv+jZt387Hp59DcdxnJ4OQkRERERERERERER6P7W8EBEREREREREREZEOUUJZRERERERERERERDpECWURERERERERERER6RAllEVERERERERERESkQ5RQFhEREREREREREZEOcfV0ACIi0trYsWMZM2YMptny934PPvggBQUFnX6tlStXkpWV1annFRERERHpCD37ioj0LUooi4j0Un/+85/1oCsiIiIixwU9+4qI9B1KKIuI9DHvv/8+v/rVrxg0aBBbt24lKSmJu+++m5EjR1JfX89Pf/pTNmzYgGEYzJ07l1tuuQWXy8WaNWu46667CAQCuN1uvvvd73LKKacA8MADD7BmzRpqamr46le/yqJFi3r4LkVERERE9OwrItIbKaEsItJLffnLX27xsb+CggIefPBBAIqLi/ne977HzJkzefzxx7n11lt55plnuOuuu8jIyGDp0qVEIhFuuukm/vjHP3L99dfzzW9+k7vuuov58+dTXFzMbbfdxvPPPw9AYWEhd9xxB5999hlXXnklV1xxBW63u0fuW0RERESOP3r2FRHpO5RQFhHppQ71sb9x48Yxc+ZMAC677DLuvPNOqqureeutt3j88ccxDAOPx8NVV13Fn//8Z+bMmYNpmsyfPx+AE044gaVLlybOd8EFFwAwfvx4wuEwDQ0NZGZmdu0NioiIiIg007OviEjfYR5+iIiI9DaWZbW5zbZtDMNIbLNtm2g0imVZLbYDbNq0iWg0CoDLFf/94v4xjuN0VegiIiIiIkdEz74iIr2LEsoiIn3Qhg0b2LBhAwBPPPEE06ZNIy0tjVNPPZVHH30Ux3EIh8M8+eSTzJ49mxEjRmAYBu+++y4A69at48tf/jK2bffkbYiIiIiIHJaefUVEehe1vBAR6aW+2EcO4JZbbiEpKYkBAwZw//33s2fPHrKysrjnnnsA+OEPf8hdd91FUVERkUiEuXPn8k//9E94PB4eeOABfvGLX3DPPffgdrt54IEH8Hg8PXFrIiIiIiIt6NlXRKTvMBx9tkNEpE95//33+dnPfsYLL7zQ06GIiIiIiHQpPfuKiPQ+ankhIiIiIiIiIiIiIh2iCmURERERERERERER6RBVKIuIiIiIiIiIiIhIhyihLCIiIiIiIiIiIiIdooSyiIiIiIiIiIiIiHSIEsoiIiIiIiIiIiIi0iFKKIuIiIiIiIiIiIhIhyihLCIiIiIiIiIiIiId8v8BmYbsS6OgSHEAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_lookup_adapted.pdf')"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/modules/__init__.py b/src/mhnfs/hopfield/examples/bit_pattern/modules/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c11713739acb1aca3b32cca53acf0c3faf1fa9f6
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/modules/__init__.py
@@ -0,0 +1,898 @@
+import torch
+import torch.nn as nn
+
+from math import sqrt
+from torch import Tensor
+from torch.nn import Module, Parameter
+from typing import Optional, Tuple, Union
+
+from .activation import HopfieldCore
+
+
+class Hopfield(Module):
+ """
+ Module with underlying Hopfield association.
+ """
+
+ def __init__(self,
+ input_size: Optional[int] = None,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False
+ ):
+ """
+ Initialise new instance of a Hopfield module.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ """
+ super(Hopfield, self).__init__()
+ assert type(batch_first) == bool, f'"batch_first" needs to be a boolean, not {type(batch_first)}.'
+ assert (association_activation is None) or (type(association_activation) == str)
+
+ # Initialise Hopfield association module.
+ self.association_core = HopfieldCore(
+ embed_dim=input_size, num_heads=num_heads, dropout=dropout, bias=input_bias,
+ add_bias_kv=concat_bias_pattern, add_zero_attn=add_zero_association, kdim=stored_pattern_size,
+ vdim=pattern_projection_size, head_dim=hidden_size, pattern_dim=pattern_size, out_dim=output_size,
+ disable_out_projection=disable_out_projection, key_as_static=stored_pattern_as_static,
+ query_as_static=state_pattern_as_static, value_as_static=pattern_projection_as_static,
+ value_as_connected=pattern_projection_as_connected, normalize_pattern=normalize_hopfield_space,
+ normalize_pattern_affine=normalize_hopfield_space_affine)
+ self.association_activation = None
+ if association_activation is not None:
+ self.association_activation = getattr(torch, association_activation, None)
+
+ # Initialise stored pattern normalization.
+ self.norm_stored_pattern = None
+ if normalize_stored_pattern_affine:
+ assert normalize_stored_pattern, "affine normalization without normalization has no effect."
+ if normalize_stored_pattern:
+ normalized_shape = input_size if stored_pattern_size is None else stored_pattern_size
+ assert normalized_shape is not None, "stored pattern size required for setting up normalisation"
+ self.norm_stored_pattern = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_stored_pattern_affine)
+
+ # Initialise state pattern normalization.
+ self.norm_state_pattern = None
+ if normalize_state_pattern_affine:
+ assert normalize_state_pattern, "affine normalization without normalization has no effect."
+ if normalize_state_pattern:
+ assert input_size is not None, "input size required for setting up normalisation"
+ self.norm_state_pattern = nn.LayerNorm(
+ normalized_shape=input_size, elementwise_affine=normalize_state_pattern_affine)
+
+ # Initialise pattern projection normalization.
+ self.norm_pattern_projection = None
+ if normalize_pattern_projection_affine:
+ assert normalize_pattern_projection, "affine normalization without normalization has no effect."
+ if normalize_pattern_projection:
+ normalized_shape = input_size if pattern_projection_size is None else pattern_projection_size
+ assert normalized_shape is not None, "pattern projection size required for setting up normalisation"
+ self.norm_pattern_projection = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_pattern_projection_affine)
+
+ # Initialise remaining auxiliary properties.
+ if self.association_core.static_execution:
+ self.__scaling = 1.0 if scaling is None else scaling
+ else:
+ assert self.association_core.head_dim > 0, f'invalid hidden dimension encountered.'
+ self.__scaling = (1.0 / sqrt(self.association_core.head_dim)) if scaling is None else scaling
+ self.__batch_first = batch_first
+ self.__update_steps_max = update_steps_max
+ self.__update_steps_eps = update_steps_eps
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset Hopfield association.
+
+ :return: None
+ """
+ for module in (self.association_core, self.norm_stored_pattern,
+ self.norm_state_pattern, self.norm_pattern_projection):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def _maybe_transpose(self, *args: Tuple[Tensor, ...]) -> Union[Tensor, Tuple[Tensor, ...]]:
+ """
+ Eventually transpose specified data.
+
+ :param args: tensors to eventually transpose (dependent on the state of "batch_first")
+ :return: eventually transposed tensors
+ """
+ transposed_result = tuple(_.transpose(0, 1) for _ in args) if self.__batch_first else args
+ return transposed_result[0] if len(transposed_result) == 1 else transposed_result
+
+ def _associate(self, data: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ return_raw_associations: bool = False, return_projected_patterns: bool = False,
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tuple[Optional[Tensor], ...]:
+ """
+ Apply Hopfield association module on specified data.
+
+ :param data: data to be processed by Hopfield core module
+ :param return_raw_associations: return raw association (softmax) values, unmodified
+ :param return_projected_patterns: return pattern projection values, unmodified
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ assert (type(data) == Tensor) or ((type(data) == tuple) and (len(data) == 3)), \
+ r'either one tensor to be used as "stored pattern", "state pattern" and' \
+ r' "pattern_projection" must be provided, or three separate ones.'
+ if type(data) == Tensor:
+ stored_pattern, state_pattern, pattern_projection = data, data, data
+ else:
+ stored_pattern, state_pattern, pattern_projection = data
+
+ # Optionally transpose data.
+ stored_pattern, state_pattern, pattern_projection = self._maybe_transpose(
+ stored_pattern, state_pattern, pattern_projection)
+
+ # Optionally apply stored pattern normalization.
+ if self.norm_stored_pattern is not None:
+ stored_pattern = self.norm_stored_pattern(input=stored_pattern.reshape(
+ shape=(-1, stored_pattern.shape[2]))).reshape(shape=stored_pattern.shape)
+
+ # Optionally apply state pattern normalization.
+ if self.norm_state_pattern is not None:
+ state_pattern = self.norm_state_pattern(input=state_pattern.reshape(
+ shape=(-1, state_pattern.shape[2]))).reshape(shape=state_pattern.shape)
+
+ # Optionally apply pattern projection normalization.
+ if self.norm_pattern_projection is not None:
+ pattern_projection = self.norm_pattern_projection(input=pattern_projection.reshape(
+ shape=(-1, pattern_projection.shape[2]))).reshape(shape=pattern_projection.shape)
+
+ # Apply Hopfield association and optional activation function.
+ return self.association_core(
+ query=state_pattern, key=stored_pattern, value=pattern_projection,
+ key_padding_mask=stored_pattern_padding_mask, need_weights=False, attn_mask=association_mask,
+ scaling=self.__scaling, update_steps_max=self.__update_steps_max, update_steps_eps=self.__update_steps_eps,
+ return_raw_associations=return_raw_associations, return_pattern_projections=return_projected_patterns)
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield association on specified data.
+
+ :param input: data to be processed by Hopfield association module
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ association_output = self._maybe_transpose(self._associate(
+ data=input, return_raw_associations=False,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[0])
+ if self.association_activation is not None:
+ association_output = self.association_activation(association_output)
+ return association_output
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_raw_associations=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[2]
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_projected_patterns=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[3]
+
+ @property
+ def batch_first(self) -> bool:
+ return self.__batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.__scaling.clone() if type(self.__scaling) == Tensor else self.__scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.association_core.kdim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.association_core.embed_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.association_core.vdim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.state_pattern_dim
+
+ @property
+ def hidden_size(self) -> Optional[int]:
+ return self.association_core.head_dim
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.association_core.out_dim
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.association_core.pattern_dim
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.__update_steps_max.clone() if type(self.__update_steps_max) == Tensor else self.__update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.__update_steps_eps.clone() if type(self.__update_steps_eps) == Tensor else self.__update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.association_core.key_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.association_core.query_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.association_core.value_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.norm_stored_pattern is not None
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.normalize_stored_pattern and self.norm_stored_pattern.elementwise_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.norm_state_pattern is not None
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.normalize_state_pattern and self.norm_state_pattern.elementwise_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.norm_pattern_projection is not None
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.normalize_pattern_projection and self.norm_pattern_projection.elementwise_affine
+
+ @property
+ def normalize_hopfield_space(self) -> bool:
+ return self.hopfield.normalize_hopfield_space
+
+ @property
+ def normalize_hopfield_space_affine(self) -> bool:
+ return self.hopfield.normalize_hopfield_space_affine
+
+
+class HopfieldPooling(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed state pattern and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based pooling layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of state patterns
+ :param trainable: state pattern used for pooling is trainable
+ """
+ super(HopfieldPooling, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ pooling_weight_size = self.hopfield.hidden_size if state_pattern_as_static else self.hopfield.input_size
+ self.pooling_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if pooling_weight_size is None else pooling_weight_size)), requires_grad=trainable)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset pooling weights and underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise pooling weights.
+ nn.init.normal_(self.pooling_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Union[Tensor, Tuple[Tensor, Tensor]]) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ assert (type(input) == Tensor) or ((type(input) == tuple) and (len(input) == 2)), \
+ r'either one tensor to be used as "stored pattern" and' \
+ r' "pattern_projection" must be provided, or two separate ones.'
+ if type(input) == Tensor:
+ stored_pattern, pattern_projection = input, input
+ else:
+ stored_pattern, pattern_projection = input
+
+ batch_size = stored_pattern.shape[0 if self.batch_first else 1]
+ return stored_pattern, self.pooling_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.pooling_weights.shape[2])), pattern_projection
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor]], stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based pooling on specified data.
+
+ :param input: data to be pooled
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-pooled input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask).flatten(start_dim=1)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for pooling gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
+
+
+class HopfieldLayer(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed stored pattern, pattern projection and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+ lookup_weights_as_separated: bool = False,
+ lookup_targets_as_trainable: bool = True,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based lookup layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param lookup_weights_as_separated: separate lookup weights from lookup target weights
+ :param lookup_targets_as_trainable: employ trainable lookup target weights (used as pattern projection input)
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of stored patterns
+ :param trainable: stored pattern used for lookup is trainable
+ """
+ super(HopfieldLayer, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ lookup_weight_size = self.hopfield.hidden_size if stored_pattern_as_static else self.hopfield.stored_pattern_dim
+ self.lookup_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if lookup_weight_size is None else lookup_weight_size)), requires_grad=trainable)
+
+ if lookup_weights_as_separated:
+ target_weight_size = self.lookup_weights.shape[
+ 2] if pattern_projection_size is None else pattern_projection_size
+ self.target_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), target_weight_size)), requires_grad=lookup_targets_as_trainable)
+ else:
+ self.register_parameter(name=r'target_weights', param=None)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset lookup and lookup target weights, including underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise lookup and target weights.
+ nn.init.normal_(self.lookup_weights, mean=0.0, std=0.02)
+ if self.target_weights is not None:
+ nn.init.normal_(self.target_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Tensor) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ batch_size = input.shape[0 if self.batch_first else 1]
+ stored_pattern = self.lookup_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.lookup_weights.shape[2]))
+ if self.target_weights is None:
+ pattern_projection = stored_pattern
+ else:
+ pattern_projection = self.target_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.target_weights.shape[2]))
+
+ return stored_pattern, input, pattern_projection
+
+ def forward(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based lookup on specified data.
+
+ :param input: data to used in lookup
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: result of Hopfield-based lookup on input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_association_matrix(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for lookup gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/modules/activation.py b/src/mhnfs/hopfield/examples/bit_pattern/modules/activation.py
new file mode 100644
index 0000000000000000000000000000000000000000..6dcd6e56cddb954cf6b049687bdf5e7783aa2bc9
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/modules/activation.py
@@ -0,0 +1,337 @@
+import torch
+import torch.nn as nn
+
+from torch import Tensor
+from torch.nn import Linear, Module, Parameter
+from typing import Optional
+
+from .functional import hopfield_core_forward
+
+try:
+ from torch.nn.modules.linear import _LinearWithBias
+except ImportError:
+ _LinearWithBias = None
+
+
+class HopfieldCore(Module):
+ r"""Allows the model to jointly attend to information
+ from different representation subspaces.
+ See references: "Hopfield Networks is All You Need" and
+ "Attention Is All You Need" (on which this implementation is partly based on).
+
+ .. math::
+ \text{HopfieldHead}(Q, K, V) = \text{Concat}(head_1,\dots,head_h)W^O
+ \text{where} head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
+
+ Args:
+ embed_dim: total dimension of the model.
+ num_heads: parallel attention heads.
+ dropout: a Dropout layer on attn_output_weights. Default: 0.0.
+ bias: add bias as module parameter. Default: True.
+ add_bias_kv: add bias to the key and value sequences at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ kdim: total number of features in key. Default: None.
+ vdim: total number of features in value. Default: None.
+
+ Note: if kdim and vdim are None, they will be set to embed_dim such that
+ query, key, and value have the same number of features.
+
+ Examples::
+
+ >>> hopfield_attn = HopfieldCore(embed_dim, num_heads)
+ >>> attn_output, attn_output_weights, attn_matrix = hopfield_attn(query, key, value)
+ """
+ __annotations__ = {
+ 'bias_k': torch._jit_internal.Optional[torch.Tensor],
+ 'bias_v': torch._jit_internal.Optional[torch.Tensor],
+ }
+
+ def __init__(self,
+ embed_dim=None, # type: Optional[int]
+ num_heads=1, # type: int
+ dropout=0.0, # type: float
+ bias=True, # type: bool
+ add_bias_kv=False, # type: bool
+ add_zero_attn=False, # type: bool
+ kdim=None, # type: Optional[int]
+ vdim=None, # type: Optional[int]
+
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ out_dim=None, # type: Optional[int]
+ disable_out_projection=False, # type: bool
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ normalize_pattern_affine=False # type: bool
+ ):
+ super(HopfieldCore, self).__init__()
+
+ assert (type(key_as_static) == bool) and (type(query_as_static) == bool) and (type(value_as_static) == bool)
+ self.key_as_static, self.query_as_static, self.value_as_static = key_as_static, query_as_static, value_as_static
+ num_non_static = 3 - (self.key_as_static + self.query_as_static + self.value_as_static)
+ assert 0 <= num_non_static < 4
+
+ self.value_as_connected = value_as_connected
+ self.normalize_pattern, self.normalize_pattern_affine = normalize_pattern, normalize_pattern_affine
+ self.disable_out_projection = disable_out_projection
+
+ # In case of a static-only executions, check corresponding projections and normalizations.
+ self.static_execution = self._check_execution_mode()
+ if self.static_execution:
+ embed_dim, kdim, vdim = None, None, None
+ if embed_dim is None:
+ assert self.static_execution, r'static-only execution requires all projections to be deactivated.'
+
+ # Check and set all other properties, conditioned on .
+ self.embed_dim = embed_dim
+ self.kdim = kdim if kdim is not None else embed_dim
+ self.vdim = vdim if vdim is not None else embed_dim
+ self._qkv_same_embed_dim = all((
+ self.kdim == embed_dim, self.vdim == embed_dim, pattern_dim is None, not self.value_as_connected))
+ assert (not self.value_as_connected) or (self.kdim == self.vdim), r'key and value need to be of same dimension.'
+
+ self.num_heads = num_heads
+ self.dropout = dropout
+ self.head_dim = None
+ self.pattern_dim = pattern_dim
+ self.virtual_hopfield_dim = None
+ self.virtual_pattern_dim = None
+ if not self.static_execution:
+ if head_dim is None:
+ self.head_dim = embed_dim // num_heads
+ assert self.head_dim * num_heads == self.embed_dim, "embed_dim must be divisible by num_heads."
+ else:
+ assert head_dim > 0, "dimension of the association space has to be positive."
+ self.head_dim = head_dim
+ if self.pattern_dim is None:
+ self.pattern_dim = self.head_dim
+ self.virtual_hopfield_dim = self.num_heads * self.head_dim
+ self.virtual_pattern_dim = self.num_heads * self.pattern_dim
+
+ self.out_dim = embed_dim if out_dim is None else out_dim
+ assert disable_out_projection or (self.out_dim > 0), "output projection dimension has to be positive."
+
+ if normalize_pattern_affine:
+ assert normalize_pattern, "affine pattern normalization without pattern normalization has no effect."
+ self.p_norm_weight = Parameter(torch.Tensor(head_dim))
+ self.p_norm_bias = Parameter(torch.Tensor(head_dim))
+ else:
+ self.register_parameter('p_norm_weight', None)
+ self.register_parameter('p_norm_bias', None)
+
+ if self._qkv_same_embed_dim is False:
+ if query_as_static:
+ self.register_parameter('q_proj_weight', None)
+ else:
+ self.q_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, embed_dim))
+ if key_as_static:
+ self.register_parameter('k_proj_weight', None)
+ else:
+ self.k_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, self.kdim))
+ if value_as_static:
+ self.register_parameter('v_proj_weight', None)
+ else:
+ self.v_proj_weight = Parameter(torch.Tensor(
+ self.virtual_pattern_dim,
+ self.virtual_hopfield_dim if (value_as_connected and not key_as_static) else self.vdim))
+ self.register_parameter('in_proj_weight', None)
+ else:
+ if num_non_static > 0:
+ self.in_proj_weight = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim +
+ (not value_as_static) * self.virtual_pattern_dim, embed_dim))
+ else:
+ self.register_parameter('in_proj_weight', None)
+ self.register_parameter('q_proj_weight', None)
+ self.register_parameter('k_proj_weight', None)
+ self.register_parameter('v_proj_weight', None)
+
+ if bias and (num_non_static > 0):
+ self.in_proj_bias = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim + self.virtual_pattern_dim))
+ else:
+ self.register_parameter('in_proj_bias', None)
+ if disable_out_projection:
+ self.register_parameter('out_proj', None)
+ else:
+ if bias and _LinearWithBias is not None:
+ self.out_proj = _LinearWithBias(self.virtual_pattern_dim, self.out_dim)
+ else:
+ self.out_proj = Linear(self.virtual_pattern_dim, self.out_dim, bias=bias)
+
+ self.bias_k, self.bias_v = None, None
+ if add_bias_kv:
+ if not key_as_static:
+ self.bias_k = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ if not value_as_static:
+ self.bias_v = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ assert not (self.bias_k is None and self.bias_v is None), r'cannot set key/value bias if both are static.'
+
+ self.add_zero_attn = add_zero_attn
+ self.reset_parameters()
+
+ def _check_execution_mode(self) -> bool:
+ return all((
+ self.key_as_static, self.query_as_static, self.value_as_static, not self.value_as_connected,
+ not self.normalize_pattern, not self.normalize_pattern_affine, self.disable_out_projection
+ ))
+
+ def reset_parameters(self):
+ if self.p_norm_weight is not None:
+ nn.init.ones_(self.p_norm_weight)
+ nn.init.zeros_(self.p_norm_bias)
+
+ if self._qkv_same_embed_dim and (self.in_proj_weight is not None):
+ nn.init.normal_(self.in_proj_weight, mean=0.0, std=0.02)
+ else:
+ if self.q_proj_weight is not None:
+ nn.init.normal_(self.q_proj_weight, mean=0.0, std=0.02)
+ if self.k_proj_weight is not None:
+ nn.init.normal_(self.k_proj_weight, mean=0.0, std=0.02)
+ if self.v_proj_weight is not None:
+ nn.init.normal_(self.v_proj_weight, mean=0.0, std=0.02)
+
+ if self.in_proj_bias is not None:
+ nn.init.constant_(self.in_proj_bias, 0.0)
+ if not self.disable_out_projection:
+ nn.init.normal_(self.out_proj.weight, mean=0.0, std=0.02)
+ if self.out_proj.bias is not None:
+ nn.init.constant_(self.out_proj.bias, 0.0)
+ if self.bias_k is not None:
+ nn.init.normal_(self.bias_k, mean=0.0, std=0.02)
+ if self.bias_v is not None:
+ nn.init.normal_(self.bias_v, mean=0.0, std=0.02)
+
+ def __setstate__(self, state):
+ super(HopfieldCore, self).__setstate__(state)
+
+ def forward(self,
+ query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+
+ scaling=None, # type: Optional[Tensor]
+ update_steps_max=0, # type: Optional[int]
+ update_steps_eps=1e-4, # type: float
+ return_raw_associations=False, # type: bool
+ return_pattern_projections=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. When given a binary mask and a value is True,
+ the corresponding value on the attention layer will be ignored. When given
+ a byte mask and a value is non-zero, the corresponding value on the attention
+ layer will be ignored.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_pattern_projections: return pattern projection values, unmodified.
+
+ Shape:
+ - Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the position
+ with the zero positions will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensure that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ is not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ - Outputs:
+ - attn_output: :math:`(L, N, E)` where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)` where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if self.query_as_static and self.key_as_static:
+ assert query.shape[2] == key.shape[2], \
+ f'query shape[2] of {query.shape[2]} and key shape[2] of {key.shape[2]} need to be equal'
+ head_dim, embed_dim_to_check = query.shape[2], query.shape[2]
+ else:
+ assert self.query_as_static or (query.shape[2] == self.embed_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.embed_dim}.'
+ assert (not self.query_as_static) or (self.query_as_static and query.shape[2] == self.head_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.head_dim}'
+
+ assert self.key_as_static or (key.shape[2] == self.kdim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.kdim}.'
+ assert (not self.key_as_static) or (self.key_as_static and key.shape[2] == self.head_dim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.head_dim}'
+ head_dim, embed_dim_to_check = self.head_dim, self.head_dim if self.query_as_static else self.embed_dim
+
+ assert self.value_as_static or (value.shape[2] == self.vdim), \
+ f'value shape[2] of {value.shape[2]} invalid, needs to be {self.vdim}.'
+ assert any((
+ not self.value_as_static, self.value_as_static and value.shape[2] == self.pattern_dim,
+ self.disable_out_projection)
+ ), f'value shape[2] of {value.shape[2]} invalid, needs to be {self.pattern_dim}'
+
+ out_weights, out_bias = None, None
+ if not self.disable_out_projection:
+ out_weights, out_bias = self.out_proj.weight, self.out_proj.bias
+
+ if not self._qkv_same_embed_dim:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=True, q_proj_weight=self.q_proj_weight, k_proj_weight=self.k_proj_weight,
+ v_proj_weight=self.v_proj_weight,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
+ else:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/modules/functional.py b/src/mhnfs/hopfield/examples/bit_pattern/modules/functional.py
new file mode 100644
index 0000000000000000000000000000000000000000..2619c45fd87dc5f0348db393aa9b305611b4dd32
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/modules/functional.py
@@ -0,0 +1,450 @@
+import torch
+import torch.nn as nn
+
+from torch.tensor import Tensor
+from typing import Optional, Tuple, Union
+
+
+def hopfield_core_forward(query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ embed_dim_to_check, # type: int
+ num_heads, # type: int
+ in_proj_weight, # type: Optional[Tensor]
+ in_proj_bias, # type: Optional[Tensor]
+ bias_k, # type: Optional[Tensor]
+ bias_v, # type: Optional[Tensor]
+ add_zero_attn, # type: bool
+ dropout_p, # type: float
+ out_proj_weight, # type: Tensor
+ out_proj_bias, # type: Tensor
+ training=True, # type: bool
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+ use_separate_proj_weight=False, # type: bool
+ q_proj_weight=None, # type: Optional[Tensor]
+ k_proj_weight=None, # type: Optional[Tensor]
+ v_proj_weight=None, # type: Optional[Tensor]
+ static_k=None, # type: Optional[Tensor]
+ static_v=None, # type: Optional[Tensor]
+
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ p_norm_weight=None, # type: Optional[Tensor]
+ p_norm_bias=None, # type: Optional[Tensor]
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ scaling=None, # type: Optional[Union[float, Tensor]]
+ update_steps_max=0, # type: Optional[Union[int, Tensor]]
+ update_steps_eps=1e-4, # type: Union[float, Tensor]
+ return_raw_associations=False, # type: bool
+ return_projected_patterns=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ embed_dim_to_check: total dimension of the model (in case of default head dimension).
+ num_heads: parallel attention heads.
+ in_proj_weight, in_proj_bias: input projection weight and bias.
+ bias_k, bias_v: bias of the key and value sequences to be added at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ dropout_p: probability of an element to be zeroed.
+ out_proj_weight, out_proj_bias: the output projection weight and bias.
+ training: apply dropout if is ``True``.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. This is an binary mask. When the value is True,
+ the corresponding value on the attention layer will be filled with -inf.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+ use_separate_proj_weight: the function accept the proj. weights for query, key,
+ and value in different forms. If false, in_proj_weight will be used, which is
+ a combination of q_proj_weight, k_proj_weight, v_proj_weight.
+ q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias: input projection weight and bias.
+ static_k, static_v: static key and value used for attention operators.
+
+ key_as_static: interpret specified key as being static.
+ query_as_static: interpret specified key as being static.
+ value_as_static: interpret specified key as being static.
+ value_as_connected: connect value projection with key projection.
+ normalize_pattern: enable normalization of patterns.
+ p_norm_weight, p_norm_bias: pattern normalization weight and bias.
+ head_dim: dimensionality of each head.
+ pattern_dim: dimensionality of each projected value input.
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_projected_patterns: return pattern projection values, unmodified.
+
+ Shape:
+ Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the zero positions
+ will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensures that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ are not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+ - static_k: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+ - static_v: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ Outputs:
+ - attn_output: :math:`(L, N, E)`, where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if not torch.jit.is_scripting():
+ tens_ops = (query, key, value, in_proj_weight, in_proj_bias, bias_k, bias_v,
+ out_proj_weight, out_proj_bias)
+ if any([type(t) is not Tensor for t in tens_ops]) and nn.functional.has_torch_function(tens_ops):
+ return nn.functional.handle_torch_function(
+ hopfield_core_forward, tens_ops, query, key, value,
+ embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias,
+ bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight,
+ out_proj_bias, training=training, key_padding_mask=key_padding_mask,
+ need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=use_separate_proj_weight,
+ q_proj_weight=q_proj_weight, k_proj_weight=k_proj_weight,
+ v_proj_weight=v_proj_weight, static_k=static_k, static_v=static_v,
+ key_as_static=key_as_static, query_as_static=query_as_static,
+ value_as_static=value_as_static, value_as_connected=value_as_connected,
+ normalize_pattern=normalize_pattern, p_norm_weight=p_norm_weight, p_norm_bias=p_norm_bias,
+ head_dim=head_dim, pattern_dim=pattern_dim, scaling=scaling, update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps, return_raw_associations=return_raw_associations)
+ tgt_len, bsz, embed_dim = query.shape[0], value.shape[1], query.shape[2]
+ assert embed_dim == embed_dim_to_check
+ # allow MHA to have different sizes for the feature dimension
+ assert key.size(0) == value.size(0) and key.size(1) == value.size(1)
+
+ assert (scaling is None) or (type(scaling) in (float, torch.Tensor))
+ if type(scaling) == torch.Tensor:
+ assert scaling.ndimension() == 1 and scaling.shape[0] == num_heads, "only one entry per head."
+
+ assert (update_steps_max is None) or (type(update_steps_max) in (int, torch.Tensor))
+ if type(update_steps_max) == torch.Tensor:
+ assert update_steps_max.ndimension() == 1 and update_steps_max.shape[0] == num_heads, "only one entry per head."
+ elif type(update_steps_max) == int:
+ update_steps_max = torch.tensor([update_steps_max] * num_heads, dtype=torch.int32, device=query.device)
+ elif update_steps_max is None:
+ update_steps_max = -torch.ones(size=(num_heads,), dtype=torch.int32, device=query.device)
+
+ assert type(update_steps_eps) in (float, torch.Tensor)
+ if type(update_steps_eps) == torch.Tensor:
+ assert update_steps_eps.ndimension() == 1 and update_steps_eps.shape[0] == num_heads, "only one entry per head."
+ assert (update_steps_eps <= 0.0).sum() == 0, "only positive thresholds allowed."
+ update_steps_eps = update_steps_eps.to(device=query.device)
+ elif type(update_steps_eps) == float:
+ assert update_steps_eps > 0, "only positive thresholds allowed."
+ update_steps_eps = torch.tensor([update_steps_eps] * num_heads, dtype=query.dtype, device=query.device)
+
+ # Adapt dimensionality of each each.
+ if head_dim is None:
+ head_dim = embed_dim // num_heads
+ assert head_dim * num_heads == embed_dim, r'embed_dim must be divisible by num_heads.'
+ hopfield_dim = num_heads * head_dim
+
+ # Adapt dimensionality of each value projection.
+ if pattern_dim is None:
+ pattern_dim = head_dim
+ assert (not value_as_connected) or (pattern_dim == head_dim)
+
+ q, k, v, xi, src_len = None, None, None, None, 0
+ update_step, xi_old, xi_difference_norm = 0, None, float(r'+inf')
+ update_active_heads = torch.tensor([[[True]]] * num_heads * bsz, device=query.device)
+ assert update_active_heads.any(), "at least one head needs to be active."
+
+ ####################################################################################################################
+ # BEGIN HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ while update_active_heads.any():
+
+ # The query is already projected into the "Hopfield" space at "update_step" equals 0.
+ # No more projection necessary if "update_step" greater than 0.
+ if update_step == 0:
+ if not use_separate_proj_weight:
+
+ if torch.equal(query, key) and torch.equal(key, value) and not (
+ key_as_static or query_as_static or value_as_static):
+ # self-attention
+ q, k, v = nn.functional.linear(query, in_proj_weight, in_proj_bias).chunk(3, dim=-1)
+
+ elif torch.equal(key, value) and not (key_as_static or value_as_static):
+ # encoder-decoder attention
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start = hopfield_dim
+ _end = None
+
+ if key is None:
+ assert value is None
+ k = None
+ v = None
+ else:
+
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k, v = nn.functional.linear(key, _w, _b).chunk(2, dim=-1)
+
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k = nn.functional.linear(key, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if value_as_static:
+ v = value.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ v = nn.functional.linear(value, _w, _b)
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ q_proj_weight_non_opt = torch.jit._unwrap_optional(q_proj_weight)
+ len1, len2 = q_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == query.size(-1)
+ if in_proj_bias is not None:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias[_start:_end])
+ _start += hopfield_dim
+ _end += hopfield_dim
+ else:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias)
+
+ v = value
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ k_proj_weight_non_opt = torch.jit._unwrap_optional(k_proj_weight)
+ len1, len2 = k_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == key.size(-1)
+
+ _bias = None if in_proj_bias is None else in_proj_bias[_start:_end]
+ k = nn.functional.linear(key, k_proj_weight_non_opt, _bias)
+ if value_as_connected:
+ v = nn.functional.linear(v, k_proj_weight_non_opt, _bias)
+ _start += hopfield_dim
+ _end += num_heads * pattern_dim
+
+ if value_as_static:
+ if not (value_as_connected or key_as_static):
+ v = v.repeat(1, num_heads, 1)
+ else:
+ v_proj_weight_non_opt = torch.jit._unwrap_optional(v_proj_weight)
+ len1, len2 = v_proj_weight_non_opt.size()
+ assert len1 == (num_heads * pattern_dim) and len2 == v.size(-1)
+ if in_proj_bias is not None:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias[_start:])
+ else:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias)
+
+ if attn_mask is not None:
+ assert attn_mask.dtype == torch.float32 or attn_mask.dtype == torch.float64 or \
+ attn_mask.dtype == torch.float16 or attn_mask.dtype == torch.uint8 or \
+ attn_mask.dtype == torch.bool, \
+ 'Only float, byte, and bool types are supported for attn_mask, not {}'.format(attn_mask.dtype)
+ if attn_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for attn_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ attn_mask = attn_mask.to(torch.bool)
+
+ if attn_mask.dim() == 2:
+ attn_mask = attn_mask.unsqueeze(0)
+ if list(attn_mask.size()) != [1, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 2D attn_mask is not correct.')
+ elif attn_mask.dim() == 3:
+ if list(attn_mask.size()) != [bsz * num_heads, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 3D attn_mask is not correct.')
+ else:
+ raise RuntimeError("attn_mask's dimension {} is not supported".format(attn_mask.dim()))
+ # attn_mask's dim is 3 now.
+
+ # Optionally normalize patterns.
+ if normalize_pattern:
+ q = torch.nn.functional.layer_norm(
+ input=q.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=q.shape)
+ k = torch.nn.functional.layer_norm(
+ input=k.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=k.shape)
+
+ else:
+ active_xi = xi.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:]))
+ active_k = k.masked_select(mask=update_active_heads).view(size=(-1, *k.shape[1:]))
+ q = torch.masked_scatter(input=q, mask=update_active_heads, source=torch.bmm(active_xi, active_k))
+
+ # Optionally scale association heads (each head separately).
+ if type(scaling) == float:
+ q = q * scaling
+ elif type(scaling) == torch.Tensor:
+ q = q * scaling.view(1, 1, -1).repeat(repeats=(1, 1, q.shape[2] // scaling.shape[0]))
+
+ if update_step == 0:
+ # convert ByteTensor key_padding_mask to bool
+ if key_padding_mask is not None and key_padding_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for key_padding_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ key_padding_mask = key_padding_mask.to(torch.bool)
+
+ if bias_k is not None and bias_v is not None:
+ if static_k is None and static_v is None and key_as_static is None and value_as_static is None:
+ k = torch.cat([k, bias_k.repeat(1, bsz, 1)])
+ v = torch.cat([v, bias_v.repeat(1, bsz, 1)])
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+ else:
+ assert static_k is None, "bias cannot be added to static key."
+ assert static_v is None, "bias cannot be added to static value."
+ assert not key_as_static, "bias cannot be added to static key."
+ assert not value_as_static, "bias cannot be added to static value."
+ else:
+ assert bias_k is None
+ assert bias_v is None
+
+ q = q.contiguous().view(tgt_len, -1, head_dim).transpose(0, 1)
+ if k is not None:
+ k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
+ if v is not None:
+ v = v.contiguous().view(v.shape[0], bsz * num_heads, -1).transpose(0, 1)
+
+ if static_k is not None:
+ assert static_k.size(0) == bsz * num_heads
+ assert static_k.size(2) == head_dim
+ k = static_k
+
+ if static_v is not None:
+ assert static_v.size(0) == bsz * num_heads
+ assert static_v.size(2) == pattern_dim
+ v = static_v
+
+ src_len = k.size(1)
+
+ if key_padding_mask is not None:
+ assert key_padding_mask.size(0) == bsz
+ assert key_padding_mask.size(1) == src_len
+
+ if add_zero_attn:
+ src_len += 1
+ k = torch.cat([k, torch.zeros((k.size(0), 1) + k.size()[2:], dtype=k.dtype, device=k.device)], dim=1)
+ v = torch.cat([v, torch.zeros((v.size(0), 1) + v.size()[2:], dtype=v.dtype, device=v.device)], dim=1)
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+
+ attn_output_weights = torch.bmm(q, k.transpose(1, 2))
+ assert list(attn_output_weights.size()) == [bsz * num_heads, tgt_len, src_len]
+
+ if attn_mask is not None:
+ if attn_mask.dtype == torch.bool:
+ attn_output_weights.masked_fill_(attn_mask, float('-inf'))
+ else:
+ attn_output_weights += attn_mask
+
+ if key_padding_mask is not None:
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ attn_output_weights = attn_output_weights.masked_fill(
+ key_padding_mask.unsqueeze(1).unsqueeze(2),
+ float('-inf'),
+ )
+ attn_output_weights = attn_output_weights.view(bsz * num_heads, tgt_len, src_len)
+
+ # Compute new xi for Hopfield retrieve iterations.
+ if xi is None:
+ xi = nn.functional.softmax(attn_output_weights, dim=-1)
+ else:
+ xi = torch.masked_scatter(input=xi, mask=update_active_heads, source=nn.functional.softmax(
+ attn_output_weights.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:])), dim=-1))
+
+ # Compute threshold-based stopping criterion for Hopfield retrieve iterations.
+ with torch.no_grad():
+ xi_active = xi.view(size=(bsz, num_heads, tgt_len, src_len))
+ update_active_heads = (update_step < update_steps_max) | (update_steps_max < 0)
+ if xi_old is not None:
+ update_active_heads &= ((xi_old - xi_active).norm(p=2, dim=(2, 3)).max(axis=0)[0]) > update_steps_eps
+ update_active_heads = update_active_heads.unsqueeze(dim=1).unsqueeze(dim=2).repeat(repeats=(bsz, 1, 1))
+ xi_old = xi_active
+ update_step += 1
+
+ ####################################################################################################################
+ # END HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ attn_output_weights = nn.functional.dropout(xi, p=dropout_p, training=training)
+ attn_output = torch.bmm(attn_output_weights, v)
+ assert list(attn_output.shape[:2]) == [bsz * num_heads, tgt_len]
+ attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len, bsz, -1)
+ if out_proj_weight is not None:
+ assert attn_output.shape[2] == num_heads * pattern_dim
+ attn_output = nn.functional.linear(attn_output, out_proj_weight, out_proj_bias)
+
+ xi = xi.view(bsz, num_heads, tgt_len, src_len) if return_raw_associations else None
+ v = v.view(bsz, num_heads, src_len, -1) if return_projected_patterns else None
+ if need_weights:
+ # average attention weights over heads
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ return attn_output, attn_output_weights.sum(dim=1) / num_heads, xi, v
+ else:
+ return attn_output, None, xi, v
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/modules/transformer.py b/src/mhnfs/hopfield/examples/bit_pattern/modules/transformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..884e0cb4b57610cf1daf8147f2c3d59f17824750
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/bit_pattern/modules/transformer.py
@@ -0,0 +1,209 @@
+import torch
+import torch.nn as nn
+
+from copy import deepcopy
+from torch import Tensor
+from torch.nn.modules import Module
+from typing import Optional, Tuple, Union
+
+from . import Hopfield
+
+
+class HopfieldEncoderLayer(Module):
+ """
+ Module with underlying Hopfield association to be used as an encoder in transformer-like architectures.
+ """
+
+ def __init__(self,
+ hopfield_association: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association: instance of Hopfield association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ :param dropout: dropout probability to be applied internally
+ """
+ super(HopfieldEncoderLayer, self).__init__()
+ self.hopfield_association = deepcopy(hopfield_association)
+
+ self.linear_residual = nn.Linear(self.hopfield_association.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association.state_pattern_dim)
+
+ self.norm_residual = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.dropout_hopfield_association = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association, self.linear_residual,
+ self.linear_output, self.norm_residual, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, src: Tensor, src_mask: Optional[Tensor] = None,
+ src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield encoding on specified data.
+
+ :param src: data to be processed by Hopfield encoder module
+ :param src_mask: mask to be applied on association matrix
+ :param src_key_padding_mask: mask to be applied on stored patterns
+ :return: Hopfield-encoded input data
+ """
+ data_associated = self.hopfield_association(
+ input=src, stored_pattern_padding_mask=src_key_padding_mask, association_mask=src_mask)
+ src = src + self.dropout_hopfield_association(input=data_associated)
+ src = self.norm_residual(input=src)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=src))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ src = src + self.dropout_output(input=data_associated)
+
+ return self.norm_output(input=src)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output.out_features
+
+
+class HopfieldDecoderLayer(Module):
+
+ def __init__(self,
+ hopfield_association_self: Hopfield,
+ hopfield_association_cross: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association_self: instance of Hopfield self-association module
+ :param hopfield_association_cross: instance of Hopfield cross-association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param dropout: dropout probability to be applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ """
+ super(HopfieldDecoderLayer, self).__init__()
+ self.hopfield_association_self = deepcopy(hopfield_association_self)
+ self.hopfield_association_cross = deepcopy(hopfield_association_cross)
+
+ self.linear_residual = nn.Linear(self.hopfield_association_self.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association_self.state_pattern_dim)
+
+ self.norm_residual_self = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_residual_cross = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.dropout_hopfield_association_self = nn.Dropout(dropout)
+ self.dropout_hopfield_association_cross = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association_self, self.hopfield_association_cross,
+ self.linear_residual, self.linear_output, self.norm_residual_self,
+ self.norm_residual_cross, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None,
+ memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None,
+ memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield decoding on specified data.
+
+ :param tgt: data to be processed by Hopfield decoder module (self-association)
+ :param memory: data to be processed by Hopfield encoder module (cross-association)
+ :param tgt_mask: mask to be applied on self-association matrix
+ :param memory_mask: mask to be applied on cross-association matrix
+ :param tgt_key_padding_mask: mask to be applied on stored patterns
+ :param memory_key_padding_mask: mask to be applied on state patterns as well as pattern projection
+ :return: Hopfield-decoded input
+ """
+ data_associated = self.hopfield_association_self(
+ input=tgt, stored_pattern_padding_mask=tgt_key_padding_mask,
+ association_mask=tgt_mask)
+ tgt = tgt + self.dropout_hopfield_association_self(input=data_associated)
+ tgt = self.norm_residual_self(input=tgt)
+
+ data_associated = self.hopfield_association_cross(
+ input=(memory, tgt, memory), stored_pattern_padding_mask=memory_key_padding_mask,
+ association_mask=memory_mask)
+ tgt = tgt + self.dropout_hopfield_association_cross(input=data_associated)
+ tgt = self.norm_residual_cross(input=tgt)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=tgt))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ tgt = tgt + self.dropout_output(input=data_associated)
+ return self.norm_output(input=tgt)
+
+ def get_association_matrix_self(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield self-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_self.get_association_matrix(input=input)
+
+ def get_association_matrix_cross(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield cross-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_cross.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association_self.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association_self.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output_self.out_features
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_adapted.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..ff2b69a1262910659023ec30d589b806dda52785
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_base.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_base.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..bfb48f53d397db6a964c29c6d98868bf413ceba5
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_base.pdf differ
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..04f508591e7386d44cfdb211a9c69b056ed64ad3
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup.pdf differ
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup_adapted.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..6bf00e7255e2fe19981f78692a7ca43b1b55b3ad
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_lookup_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..176f73ac652d4b1fa7620dee9320a842afceb22e
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling.pdf differ
diff --git a/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling_adapted.pdf b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..e58252a1cafc2cdd695675cf94fd31890b4b88e5
Binary files /dev/null and b/src/mhnfs/hopfield/examples/bit_pattern/resources/hopfield_pooling_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/auxiliary/__init__.py b/src/mhnfs/hopfield/examples/latch_sequence/auxiliary/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/auxiliary/data.py b/src/mhnfs/hopfield/examples/latch_sequence/auxiliary/data.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c3e393145921d6588d6b0adc41f036b6bd5f4a9
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/auxiliary/data.py
@@ -0,0 +1,252 @@
+import torch
+
+from math import ceil
+from torch.utils.data import Dataset
+from typing import Dict, Optional, Sequence, Tuple, Union
+
+
+class BitPatternSet(Dataset):
+ """
+ Binary multiple instance learning (MIL) data set comprising bit patterns as instances,
+ with implanted bit patterns unique to one of the classes.
+ """
+
+ def __init__(self, num_bags: int, num_instances: int, num_signals: int, num_signals_per_bag: int = 1,
+ fraction_targets: float = 0.5, num_bits: int = 8, dtype: torch.dtype = torch.float32,
+ seed_signals: int = 43, seed_data: int = 44):
+ """
+ Create new binary bit pattern data set conforming to the specified properties.
+
+ :param num_bags: amount of bags
+ :param num_instances: amount of instances per bag
+ :param num_signals: amount of unique signals used to distinguish both classes
+ :param num_signals_per_bag: amount of unique signals to be implanted per bag
+ :param fraction_targets: fraction of targets
+ :param num_bits: amount of bits per instance
+ :param dtype: data type of instances
+ :param seed_signals: random seed used to generate the signals of the data set (excl. samples)
+ :param seed_data: random seed used to generate the samples of the data set (excl. signals)
+ """
+ super(BitPatternSet, self).__init__()
+ assert (type(num_bags) == int) and (num_bags > 0), r'"num_bags" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_signals) == int) and (num_signals > 0), r'"num_signals" must be a positive integer!'
+ assert (type(num_signals_per_bag) == int) and (num_signals_per_bag >= 0) and (
+ num_signals_per_bag <= num_instances), r'"num_signals_per_bag" must be a non-negative integer!'
+ assert (type(fraction_targets) == float) and (fraction_targets > 0) and (
+ fraction_targets < 1), r'"fraction_targets" must be in interval (0; 1)!'
+ assert (type(num_bits) == int) and (num_bits > 0), r'"num_bits" must be a positive integer!'
+ assert ((2 ** num_bits) - 1) > num_signals, r'"num_signals" must be smaller than "2 ** num_bits - 1"!'
+ assert type(seed_signals) == int, r'"seed_signals" must be an integer!'
+ assert type(seed_data) == int, r'"seed_data" must be an integer!'
+
+ self.__num_bags = num_bags
+ self.__num_instances = num_instances
+ self.__num_signals = num_signals
+ self.__num_signals_per_bag = num_signals_per_bag
+ self.__fraction_targets = fraction_targets
+ self.__num_targets = min(self.__num_bags, max(1, ceil(self.__num_bags * self.__fraction_targets)))
+ self.__num_bits = num_bits
+ self.__dtype = dtype
+ self.__seed_signals = seed_signals
+ self.__seed_data = seed_data
+ self.__data, self.__targets, self.__signals = self._generate_bit_pattern_set()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of bags.
+
+ :return: amount of bags
+ """
+ return self.__num_bags
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific bag.
+
+ :param item_index: specific bag to fetch
+ :return: specific bag as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_bit_pattern_set(self) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying bit pattern data set.
+
+ :return: tuple containing generated bags, targets and signals
+ """
+ torch.random.manual_seed(seed=self.__seed_signals)
+
+ # Generate signal patterns.
+ generated_signals = torch.randint(low=0, high=2, size=(self.__num_signals, self.__num_bits))
+ check_instances = True
+ while check_instances:
+ generated_signals = torch.unique(input=generated_signals, dim=0)
+ generated_signals = generated_signals[generated_signals.sum(axis=1) != 0]
+ missing_signals = self.__num_signals - generated_signals.shape[0]
+ if missing_signals > 0:
+ generated_signals = torch.cat(tensors=(
+ generated_signals, torch.randint(low=0, high=2, size=(missing_signals, self.__num_bits))), dim=0)
+ else:
+ check_instances = False
+
+ # Generate data and target tensors.
+ torch.random.manual_seed(seed=self.__seed_data)
+ generated_data = torch.randint(low=0, high=2, size=(self.__num_bags, self.__num_instances, self.__num_bits))
+ generated_targets = torch.zeros(size=(self.__num_bags,), dtype=generated_data.dtype)
+ generated_targets[:self.__num_targets] = 1
+
+ # Check invalid (all-zero and signal) instances and re-sample them.
+ check_instances = True
+ while check_instances:
+ invalid_instances = (generated_data.sum(axis=2) == 0).logical_or(
+ torch.sum(torch.stack([(generated_data == _).all(axis=2) for _ in generated_signals]), axis=0))
+ if invalid_instances.sum() > 0:
+ generated_data[invalid_instances] = torch.randint(
+ low=0, high=2, size=(invalid_instances.sum(), self.__num_bits))
+ else:
+ check_instances = False
+
+ # Re-implant signal into respective bags.
+ for data_index in range(self.__num_targets):
+ implantation_indices = []
+ for _ in range(self.__num_signals_per_bag):
+ while True:
+ current_implantation_index = torch.randint(low=0, high=generated_data.shape[1], size=(1,))
+ if current_implantation_index not in implantation_indices:
+ implantation_indices.append(current_implantation_index)
+ break
+ current_signal_index = torch.randint(low=0, high=generated_signals.shape[0], size=(1,))
+ generated_data[data_index, current_implantation_index] = generated_signals[current_signal_index]
+
+ return generated_data, generated_targets, generated_signals
+
+ @property
+ def num_bags(self) -> int:
+ return self.__num_bags
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_bits(self) -> int:
+ return self.__num_bits
+
+ @property
+ def num_targets_high(self) -> int:
+ return self.__num_targets
+
+ @property
+ def num_targets_low(self) -> int:
+ return self.__num_bags - self.__num_targets
+
+ @property
+ def num_signals(self) -> int:
+ return self.__num_signals
+
+ @property
+ def num_signals_per_bag(self) -> int:
+ return self.__num_signals_per_bag
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def bags(self) -> torch.Tensor:
+ return self.__data.clone()
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
+
+ @property
+ def signals(self) -> torch.Tensor:
+ return self.__signals.clone()
+
+
+class LatchSequenceSet(Dataset):
+ """
+ Latch data set comprising patterns as one-hot encoded instances.
+ """
+
+ def __init__(self, num_samples: int, num_instances: int = 20, num_characters: int = 6,
+ dtype: torch.dtype = torch.float32, seed: int = 43):
+ """
+ Create new latch sequence data set conforming to the specified properties.
+
+ :param num_samples: amount of samples
+ :param num_instances: amount of instances per sample
+ :param num_characters: amount of different characters
+ :param dtype: data type of samples
+ :param seed: random seed used to generate the samples of the data set
+ """
+ super(LatchSequenceSet, self).__init__()
+ assert (type(num_samples) == int) and (num_samples > 0), r'"num_samples" must be a positive integer!'
+ assert (type(num_instances) == int) and (num_instances > 0), r'"num_instances" must be a positive integer!'
+ assert (type(num_characters) == int) and (num_characters > 0), r'"num_characters" must be a positive integer!'
+ assert type(seed) == int, r'"seed" must be an integer!'
+
+ self.__num_samples = num_samples
+ self.__num_instances = num_instances
+ self.__num_characters = num_characters
+ self.__dtype = dtype
+ self.__seed = seed
+ self.__data, self.__targets = self._generate_latch_sequences()
+
+ def __len__(self) -> int:
+ """
+ Fetch amount of samples.
+
+ :return: amount of samples
+ """
+ return self.__num_samples
+
+ def __getitem__(self, item_index: int) -> Dict[str, torch.Tensor]:
+ """
+ Fetch specific sample.
+
+ :param item_index: specific sample to fetch
+ :return: specific sample as dictionary of tensors
+ """
+ return {r'data': self.__data[item_index].to(dtype=self.__dtype),
+ r'target': self.__targets[item_index].to(dtype=self.__dtype)}
+
+ def _generate_latch_sequences(self) -> Tuple[torch.Tensor, torch.Tensor]:
+ """
+ Generate underlying latch sequence data set.
+
+ :return: tuple containing generated data and targets
+ """
+ torch.random.manual_seed(seed=self.__seed)
+
+ # Generate data and target tensors.
+ generated_data = torch.randint(
+ low=2, high=self.__num_characters, size=(self.__num_samples, self.__num_instances))
+ generated_signal = torch.randint(low=0, high=2, size=(self.__num_samples,))
+ generated_data[:, 0] = generated_signal
+ generated_data = torch.nn.functional.one_hot(input=generated_data, num_classes=self.__num_characters)
+
+ return generated_data, generated_signal
+
+ @property
+ def num_samples(self) -> int:
+ return self.__num_samples
+
+ @property
+ def num_instances(self) -> int:
+ return self.__num_instances
+
+ @property
+ def num_characters(self) -> int:
+ return self.__num_characters
+
+ @property
+ def initial_seed(self) -> int:
+ return self.__seed
+
+ @property
+ def targets(self) -> torch.Tensor:
+ return self.__targets.clone()
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/latch_sequence_demo.ipynb b/src/mhnfs/hopfield/examples/latch_sequence/latch_sequence_demo.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..0d01559cd2c1af8c7f49dce43e93de42623b4a49
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/latch_sequence_demo.ipynb
@@ -0,0 +1,1047 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Example: Latch Problem \n",
+ "\n",
+ "We study an easy example of learning long-term dependencies by using a simple latch task (see [Hochreiter and Mozer](https://link.springer.com/chapter/10.1007/3-540-44668-0_92)). The essence of this task is that a sequence of inputs is presented, beginning with one of two symbols, A or B , and after a variable number of time steps, the model has to output a corresponding symbol. Thus, the task requires memorizing the original input over time. It has to be noted, that both class-defining symbols must only appear at the first position of a sequence. This task was specifically designed to demonstrate the capability of recurrent neural networks to capture long term dependencies. This demonstration shows, that Hopfield
, HopfieldPooling
and HopfieldLayer
adapt extremely fast to this specific task, concentrating only on the first entry of the sequence.\n",
+ "\n",
+ "This demonstration instructs how to apply Hopfield
, HopfieldPooling
and HopfieldLayer
for an exemplary sequential task, potentially substituting LSTM and GRU layers.\n",
+ "\n",
+ "NOTA BENE: No tweeking of the exemplary LSTM network is done. The focus is put on the technical details. Feel free to tune yourself and see what works better :)\n",
+ "\n",
+ "\n",
+ "\n",
+ "In order to run this notebook, a few modules need to be imported. The installation of third-party modules is not covered here."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import general modules used e.g. for plotting.\n",
+ "import matplotlib.pyplot as plt\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "import seaborn as sns\n",
+ "import sys\n",
+ "import torch\n",
+ "\n",
+ "# Importing Hopfield-specific modules.\n",
+ "from auxiliary.data import LatchSequenceSet\n",
+ "from modules import Hopfield, HopfieldPooling, HopfieldLayer\n",
+ "\n",
+ "# Import auxiliary modules.\n",
+ "from distutils.version import LooseVersion\n",
+ "from typing import List, Tuple\n",
+ "\n",
+ "# Importing PyTorch specific modules.\n",
+ "from torch import Tensor\n",
+ "from torch.nn import Flatten, Linear, LSTM, Module, Sequential\n",
+ "from torch.nn.functional import binary_cross_entropy_with_logits\n",
+ "from torch.nn.utils import clip_grad_norm_\n",
+ "from torch.optim import AdamW\n",
+ "from torch.utils.data import DataLoader\n",
+ "from torch.utils.data.sampler import SubsetRandomSampler\n",
+ "\n",
+ "# Set plotting style.\n",
+ "sns.set()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Specific minimum versions of Python itself as well as of some used modules is required."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Installed Python version: 3.8.8 (β)\n",
+ "Installed PyTorch version: 1.7.0 (β)\n"
+ ]
+ }
+ ],
+ "source": [
+ "python_check = '(\\u2713)' if sys.version_info >= (3, 8) else '(\\u2717)'\n",
+ "pytorch_check = '(\\u2713)' if torch.__version__ >= LooseVersion(r'1.5') else '(\\u2717)'\n",
+ "\n",
+ "print(f'Installed Python version: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} {python_check}')\n",
+ "print(f'Installed PyTorch version: {torch.__version__} {pytorch_check}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create Dataset \n",
+ "\n",
+ "We study an easy example of learning long-term dependencies by using a simple latch task . \n",
+ "The latch task was introcuded by Hochreiter and Mozer: \n",
+ "Sepp Hochreiter, Michael Mozer, 2001. A discrete probabilistic memory model for discovering dependencies in time. Artificial Neural Networks -- ICANN 2001, 13, pp.661-668. \n",
+ "The essence of this task is that a sequence of inputs is presented, beginning with one of two symbols, A or B , and after a variable number of time steps, the model has to output a corresponding symbol. Thus, the task requires memorizing the original input over time. It has to be noted, that both class-defining symbols must only appear at the first position of an instance. Defining arguments are:\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " num_samples
\n",
+ " 4096 \n",
+ " Amount of samples of the full dataset. \n",
+ " \n",
+ " \n",
+ " num_instances
\n",
+ " 32 \n",
+ " Amount of instances per sample (sample length). \n",
+ " \n",
+ " \n",
+ " num_characters
\n",
+ " 20 \n",
+ " Amount of different characters (size of the one-hot encoded vector). \n",
+ " \n",
+ "
\n",
+ "\n",
+ "Let's define the dataset using previously mentioned properties as well as a logging directory for storing all auxiliary outputs like performance plots."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "latch_sequence_set = LatchSequenceSet(\n",
+ " num_samples=4096,\n",
+ " num_instances=32,\n",
+ " num_characters=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "log_dir = f'resources/'\n",
+ "os.makedirs(log_dir, exist_ok=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create Auxiliaries \n",
+ "\n",
+ "Before digging into Hopfield-based networks, a few auxiliary variables and functions need to be defined. This is nothing special with respect to Hopfield-based networks, but rather common preparation work of (almost) every machine learning setting (e.g. definition of a data loader as well as a training loop ). We will see, that this comprises the most work of this whole demo."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "device = torch.device(r'cuda:0' if torch.cuda.is_available() else r'cpu')\n",
+ "\n",
+ "# Create data loader of training set.\n",
+ "sampler_train = SubsetRandomSampler(list(range(512, 4096 - 512)))\n",
+ "data_loader_train = DataLoader(dataset=latch_sequence_set, batch_size=32, sampler=sampler_train)\n",
+ "\n",
+ "# Create data loader of validation set.\n",
+ "sampler_eval = SubsetRandomSampler(list(range(512)) + list(range(4096 - 512, 4096)))\n",
+ "data_loader_eval = DataLoader(dataset=latch_sequence_set, batch_size=32, sampler=sampler_eval)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def train_epoch(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float]:\n",
+ " \"\"\"\n",
+ " Execute one training epoch.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader: data loader instance providing training data\n",
+ " :return: tuple comprising training loss as well as accuracy\n",
+ " \"\"\"\n",
+ " network.train()\n",
+ " losses, accuracies = [], []\n",
+ " for sample_data in data_loader:\n",
+ " data, target = sample_data[r'data'], sample_data[r'target']\n",
+ " data, target = data.to(device=device), target.to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " model_output = network.forward(input=data)\n",
+ "\n",
+ " # Update network parameters.\n",
+ " optimiser.zero_grad()\n",
+ " loss = binary_cross_entropy_with_logits(input=model_output, target=target, reduction=r'mean')\n",
+ " loss.backward()\n",
+ " clip_grad_norm_(parameters=network.parameters(), max_norm=1.0, norm_type=2)\n",
+ " optimiser.step()\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " accuracy = (model_output.sigmoid().round() == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " losses.append(loss.detach().item())\n",
+ " \n",
+ " # Report progress of training procedure.\n",
+ " return (sum(losses) / len(losses), sum(accuracies) / len(accuracies))\n",
+ "\n",
+ "\n",
+ "def eval_iter(network: Module,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float]:\n",
+ " \"\"\"\n",
+ " Evaluate the current model.\n",
+ " \n",
+ " :param network: network instance to evaluate\n",
+ " :param data_loader: data loader instance providing validation data\n",
+ " :return: tuple comprising validation loss as well as accuracy\n",
+ " \"\"\"\n",
+ " network.eval()\n",
+ " with torch.no_grad():\n",
+ " losses, accuracies = [], []\n",
+ " for sample_data in data_loader:\n",
+ " data, target = sample_data[r'data'], sample_data[r'target']\n",
+ " data, target = data.to(device=device), target.to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " model_output = network.forward(input=data)\n",
+ " loss = binary_cross_entropy_with_logits(input=model_output, target=target, reduction=r'mean')\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " accuracy = (model_output.sigmoid().round() == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " losses.append(loss.detach().item())\n",
+ "\n",
+ " # Report progress of validation procedure.\n",
+ " return (sum(losses) / len(losses), sum(accuracies) / len(accuracies))\n",
+ "\n",
+ "\n",
+ "def operate(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader_train: DataLoader,\n",
+ " data_loader_eval: DataLoader,\n",
+ " num_epochs: int = 1\n",
+ " ) -> Tuple[pd.DataFrame, pd.DataFrame]:\n",
+ " \"\"\"\n",
+ " Train the specified network by gradient descent using backpropagation.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader_train: data loader instance providing training data\n",
+ " :param data_loader_eval: data loader instance providing validation data\n",
+ " :param num_epochs: amount of epochs to train\n",
+ " :return: data frame comprising training as well as evaluation performance\n",
+ " \"\"\"\n",
+ " losses, accuracies = {r'train': [], r'eval': []}, {r'train': [], r'eval': []}\n",
+ " for epoch in range(num_epochs):\n",
+ " \n",
+ " # Train network.\n",
+ " performance = train_epoch(network, optimiser, data_loader_train)\n",
+ " losses[r'train'].append(performance[0])\n",
+ " accuracies[r'train'].append(performance[1])\n",
+ " \n",
+ " # Evaluate current model.\n",
+ " performance = eval_iter(network, data_loader_eval)\n",
+ " losses[r'eval'].append(performance[0])\n",
+ " accuracies[r'eval'].append(performance[1])\n",
+ " \n",
+ " # Report progress of training and validation procedures.\n",
+ " return pd.DataFrame(losses), pd.DataFrame(accuracies)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def set_seed(seed: int = 42) -> None:\n",
+ " \"\"\"\n",
+ " Set seed for all underlying (pseudo) random number sources.\n",
+ " \n",
+ " :param seed: seed to be used\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " torch.manual_seed(42)\n",
+ " torch.backends.cudnn.deterministic = True\n",
+ " torch.backends.cudnn.benchmark = False\n",
+ "\n",
+ "\n",
+ "def plot_performance(loss: pd.DataFrame,\n",
+ " accuracy: pd.DataFrame,\n",
+ " log_file: str\n",
+ " ) -> None:\n",
+ " \"\"\"\n",
+ " Plot and save loss and accuracy.\n",
+ " \n",
+ " :param loss: loss to be plotted\n",
+ " :param accuracy: accuracy to be plotted\n",
+ " :param log_file: target file for storing the resulting plot\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " fig, ax = plt.subplots(1, 2, figsize=(20, 7))\n",
+ " \n",
+ " loss_plot = sns.lineplot(data=loss, ax=ax[0])\n",
+ " loss_plot.set(xlabel=r'Epoch', ylabel=r'Cross-entropy Loss')\n",
+ " \n",
+ " accuracy_plot = sns.lineplot(data=accuracy, ax=ax[1])\n",
+ " accuracy_plot.set(xlabel=r'Epoch', ylabel=r'Accuracy')\n",
+ " \n",
+ " ax[1].yaxis.set_label_position(r'right')\n",
+ " fig.tight_layout()\n",
+ " fig.savefig(log_file)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "LSTM-based Network \n",
+ "\n",
+ "The instantiation of the heart of an LSTM-based network, the module LSTM
, is rather straightforward. Only two arguments, the size of the input as well as the site of the hidden state, need to be set.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_characters (20) \n",
+ " Size (depth) of the input. \n",
+ " \n",
+ " \n",
+ " hidden_size
\n",
+ " 4 \n",
+ " Size (depth) of the hidden state. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
\n",
+ "\n",
+ "An additional output projection is defined, to downproject the hidden state of the last time step of the LSTM
to the correct output size. Afterwards, everything is wrapped into a container of type torch.nn.Sequential
and a corresponding optimiser is defined."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "class LSTMNetwork(Module):\n",
+ " def __init__(self, input_size: int, hidden_size: int):\n",
+ " \"\"\"\n",
+ " Initialize a new instance of an LSTM-based network.\n",
+ " \n",
+ " :param input size: size (depth) of the input\n",
+ " :param hidden_size: size (depth) of the hidden state\n",
+ " \"\"\"\n",
+ " super(LSTMNetwork, self).__init__()\n",
+ " self.lstm = LSTM(input_size, hidden_size, batch_first=True)\n",
+ " self.projection = Linear(hidden_size, 1)\n",
+ " \n",
+ " def forward(self, input: Tensor) -> Tensor:\n",
+ " \"\"\"\n",
+ " Compute result of LSTM-based network on specified data.\n",
+ " \n",
+ " :param input: data to be processed by the LSTM-based network\n",
+ " :return: result as computed by the LSTM-based network\n",
+ " \"\"\"\n",
+ " out, _ = self.lstm.forward(input=input) \n",
+ " return self.projection.forward(input=out[:, -1, :]).flatten()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "network = LSTMNetwork(\n",
+ " input_size=latch_sequence_set.num_characters,\n",
+ " hidden_size=4).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate LSTM-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABZQAAAHsCAYAAABFbSiOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAADcgklEQVR4nOzdd3yV9fn/8dd9RvZOTjYEMggrCQGEsMUFKogCDsTZalv9Wlp+rVZR665gqbbWUautraNuVBAHKsoQENl7b0J2IGSfcf/+iI1SR8KB5GS8n48HDzjnPp/7vu6LKJ9znc+5PoZpmiYiIiIiIiIiIiIiIk2w+DoAEREREREREREREWkfVFAWERERERERERERkWZRQVlEREREREREREREmkUFZRERERERERERERFpFhWURURERERERERERKRZVFAWERERERERERERkWZRQVlEREREREREREREmsXm6wBaU3l5FR6P2arXjI4OobS0slWv2REob95R3ryjvHlHefOO8uYd5c07ytvJsVgMIiODfR3GSWvtOa5+rryn3HlHefOO8uYd5c07ypt3lDfvKG/N11Lz205VUPZ4zFYvKP/3unLylDfvKG/eUd68o7x5R3nzjvLmHeWt4/PFHFc/V95T7ryjvHlHefOO8uYd5c07ypt3lDffUssLEREREREREREREWkWFZRFREREREREREREpFk6VcuL7+N2uygvL8blqm+R8xcVWfB4PC1ybm/YbH5ERjqwWjv9X72IiIhIh2SaJpWVx6ipqcTjcZ/287e1+a3FYiUwMISQkHAMw/B1OCIiIiIdXqevKpaXFxMQEERwcHyLTEBtNgsuV9uYcJumSVVVBeXlxcTEJPg6HBERERFpAeXlxRiGQVRUHFar7bTPcdva/NbtdnH8+FHKy4uJior1dUgiIiIiHV6nb3nhctUTHBzWKVYzGIZBcHBYi63GFhERERHfq6+vJSIiGpvN3uHnuIZhYLPZiYiIpr6+1tfhiIiIiHQKnb6gDHT4ifa3daZ7FREREemcTAyjc03zG+5Xu72LiIiItIbONdMUEREREREREREREa+poNyGVFZWcscdv23267dt28LMmQ+0YEQiIiIiIqdGc1wRERGRjqXTb8rXlhw/XsHOndub/fqePXtz++29WzAiEREREZFTozmuiIiISMeignIb8uc//5GS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xqf57UVEREREpPSsgqMQKsKsnXz6jUVEgNO+7WnixIkcPXqUK664gssuu4zc3FzuvffeisgmIiI/IeD38MuL2nPZwHRWbj7ApFeXsivnuNOxRERERESkCsn/+M/kvTMBOxx0OoqIVBGnHcr24osv8sgjj1REFhEROUOGYTC0V2Oa1avF//t4PQ++voxrhrTmnPZpTkcTEREREZFKzso/jH00G7wBp6OISBVy2hHKc+bMqYAYIiJyNlo1rst91/WgaVptXp6+gTc+30QobDkdS0REREREKrHw1iUABMbcg+H2OpxGRKqK045QbtiwIddffz1du3YlNja25PPrrruuXIOJiMiZqRPnY8KVnfnwm218tngH2/cd5ZYL25NUJ8bpaCIi1d60adP429/+Rjgc5pprrmHcuHEnrH/uuef44IMPqF27NgCXXXbZCds8/fTTuFwufvOb31RobhERqdlCWYswExtj1kqkcMFkXGkZeJr3cDqWiFRypy0ox8fHA7B79+7yziIiImfJZZpcOjCd5vXr8M9PN3D/K0u5aXQ7OjRPdDqaiEi1lZ2dzVNPPcWHH36I1+vliiuuoFevXqSnp5dss27dOp588km6dOlywr7Hjh3j4YcfZsaMGfz85z+v6OgiIlKDWcdzsXK24et1Gbg8RHavJ7LnO9zNumMYhtPxRKQSO21B+eGHHy75/8FgEK9Xj0CIiFR23Vol0zC5B89/tI6n313NqD5NGd2nGaapjqGISFlbsGABmZmZJQMxhgwZwsyZM/n1r39dss26det48cUX2b17Nz169OCOO+7A5/Px1Vdf0bRpUz39JyIiFc6MSyD2yicwPH4Mw8TbaQSFc14msnMN7sadnI4nIpXYKQvKwWCQe++9lwsuuIBBgwYB8Jvf/IaEhAQeeOAB3O7T1qJFRMRBqQkB/ji+G298volP5m9n656j3DSqLbUCujEoIlKW9u/fT3JycslySkoKa9asKVnOy8ujTZs2TJgwgSZNmnDnnXfywgsvcNttt3HhhRcC8Oyzz0Z9/sTEuKj3jVZycq0KP2d1obaLjtotOmq36NSEdrNtGwDjv76rnXABO1Z8hL1+Jsnd+p7xMWtCu5UHtVt01G7OOmVV+JlnnuH48eN07dq15LNJkyZx//338+yzz3LbbbdVSEAREYmez+PihhFtSG9Yh7e+2Mz9ry7llxd2oHn92k5HExGpNizLOuHRYNu2T1iOjY3l5ZdfLlm+/vrrufvuu8usP33w4HEsyy6TY5VGcnItcnKOVdj5qhO1XXTUbtFRu0WnprRb5MAPFHz1AjHn3YIruWnJ5+72QyhcMJm9a5fjTsso9fFqSruVNbVbdNRupWeaRrkMPjBPtWLOnDn85S9/ITHxP/Nupqam8thjj/Hll1+WeRARESkfhmEwoHMD7r66G6Zh8PCby5m9YlfJqAQRETk7aWlp5OTklCzn5OSQkpJSsrxnzx7ef//9kmXbtvW0n4iIOCqUtRD72AHMWkknfO5p1Q8jpjZW9laHkolIVXDKgrLH48Hv95/0eVxcnOZRFhGpgpqm1eZP1/agXbME3py1mZenb6AoGHE6lohIlde7d28WLlxIbm4uBQUFzJo1i379+pWs9/v9PP744+zcuRPbtpk8eXLJlHIiIiIVzbYtwlsX42rYAcN/4shFw+Mj9vJH8XYa5lA6EakKTllQNk2T48ePn/T58ePHCYfD5RpKRETKR1yMh1sv6chF5zZj8fpsHnx9GXsP5jkdS0SkSktNTeW2225j/PjxXHjhhYwcOZKOHTty4403snbtWhISEpg0aRK33HILQ4cOxbZtvYRPREQcE9m7GTvvEJ70zB9db3hjsC2LyP5tFZxMRKqKUz5rN3LkSO655x4eeughAoEAAPn5+dxzzz0MHjy4wgKKiEjZMg2DUX2a0bx+HV78ZD0PvLaM64e3oXvrlNPvLCIiP2rUqFGMGjXqhM/+e97kIUOGMGTIkFPu/5vf/KbcsomIiPy3cNYicPtwN+lyym2Cq6YTXD6V2CsexayVfMrtRKRmOuUI5WuuuYZatWrRp08fLrvsMi655BL69OlD7dq1+dWvflWRGUVEpBy0a5bAfdf1oEFSLC9MXcc7X20hHLGcjiUiIiIiIuXIOrYfd9OuGB7fKbfxZPQFwyC4ZmYFJhORquKUI5RN0+SBBx7gF7/4BevXr8c0TTp27HjCC0ZERKRqS6jt545xXZkyO4tZS3eybe9RbhnTnrq1Tt25FBERERGRqisw4nbsSOgntzHjEvC07E1o47d4u47BjKldQelEpCo45Qjlf2vQoAGDBw/mggsuUDFZRKQacrtMxg3K4ObR7diZfZz7X1nCxh8OOR1LRERERETKmJV/GADD5Tnttp5OwyASJrTui3JOJSJVzWkLyiIiUjP0apvKPdd0JzbGw+PvrGTGwu1Ytu10LBERERERKQN2sIC8t2+naMUnpdreFV8fd9OuBNd/hR0sKOd0IlKVqKAsIiIlGiTFcs/47nRvlcIH32zjuQ/Wkl/404/DiYiIiIhI5Rf+YSVEgrjqtyn1Pt6uo/H3Hgfu049oFpGaQwVlERE5QYzPzS/GtOPKC1qydttBJr26jB3Zx5yOJSIiIiIiZyGUtQgjLhFXaotS7+NKaoInow+GecpXcIlIDaSCsoiInMQwDAZ1b8QdV3UlFLH48xvLmbtmj9OxREREREQkClbBUSK71uFJz8QwzqwUZIeLKJjzd0Kb5pZTOhGpalRQFhGRU0pvWIeJ1/YgvUEdXvl0I69+9h2hcMTpWCIiIiIicgbC25aCbeFOzzzznV1erNxdFK2ajm1ZZR9ORKocFZRFROQn1Y718vvLOzOydxO+Xb2XP7+xnP2H9VIOEREREZGqwvD4cDftiiuh0Znvaxh4O4/APpJNePvyckgnIlWNCsoiInJapmlwcb8W3HpJRw4cLmTSK0tZsGYPtm07HU1ERERERE7Dk9GXmMG3Rr2/u2k3jDqpBFfNqFZ/A9jhoNMRRKokFZRFRKTUOqcn8afrepAU7+fh15byx5cX88XSneQXhpyOJiIiIiIiPyKSnYV1LOesjmGYJt5Ow7EObCeye0MZJXNWeO8mjr/2S8I7VjkdRaTKUUFZRETOSEp8DH+8uju3XdmFWL+bt7/awu+em88/P/2O7fuOOh1PRERERET+S+HcVymY/eJZH8fTsjdGrWSsw9XjZd2u1BYQCVO08B3NDS1yhtxOBxARkarH4zY5r3tjOjSpyw/7jvH1yt0s2rCPeWv20qxeLQZ0aUDPNqn4PC6no4qIiIiI1FiR3J1Yubvw9fnZWR/LcHmIvexhDFfVLiXZto2VuwtXYiP8F/ySwi9fIJy1EE9GH6ejiVQZGqEsIiJnpUlaLa4d1ponf9WXcYMyKApZvPLpRn7/3Hze+WoL+3LznY4oIiIiIlIjhbMWgWHibt6zTI5nuNzYkRDhXevK5HhOCG34ivwP/0Rk/1bczbpjJjWhaPlH2BFN4ydSWiooi4hImQj43ZzfrSEP3NCTO67qQvvmCXy1fBd3v7SIx99eybKN+wlH9CiZiIiIiEhFsG2LUNYiXA3bYcbULrPjBtfMpODTv2Ad3ltmx6wokUN7KFo0BVfDDpjJzTEME1+PS7CPHSD03Ryn44lUGVX7OQUREal0DMOgVeO6tGpclyPHi/h2zV6+XbWbF6auIz7OS79O9enfuQF1a/mcjioiIiIiUm1FsrdiHz+Ip/vFZXpcT+v+BFdMI7j6U/z9byjTY5cnOxKmcPaLGB4//v7XYxgGAK6G7fFlXo67WXeHE4pUHSooi4hIuakT52NU76aMyGzCmq0Hmb1yF9Pmb2f6gh/o0jKJAV0b0KZJXcx/deZERERERKRsmLHxeDsNx920a9keN6Y2ntbnEvpuDt5uF2HGJZTp8ctLcNmHWAd/wD/4VsxAfMnnhmHg7TgMKJ5f2dDfJiKnpYKyiIiUO9M06Nwyic4tk9h/uIBvVu5m7pq9LN+cQ2rdGAZ0aUCfDvWIi/E4HVVEREREpFowayXj63VZuRzb23EooQ1fE1z7Of5zriyXc5QlO5hPaPM8PK374zlFgT28ax1FC98mMOouDH9cBScUqVo0h7KIiFSolPgYLh2Yzl9+1ZsbR7alVsDLlNlZ/P75+fxjxga27TmKbdtOxxQRERERqbIi+7YQXDsLO1xULsc3ayXjbtGL0HdzsAuPl8s5ypLhDRAYOwnfTxS/jUA81qE9BFd/WoHJRKomjVAWERFHeNwuzmmfxjnt09iRfYw5K3ezcH0289fuo0lqLQZ2bUCvtqn4PC6no4qIiIiIVCnBDbMJ71yDp+155XYOb9dReJr3BF+g3M5RFoLrv8KTnnnCNBc/xpXQEHd6JsF1X+BpPwgztm7FBBSpgjRCWUREHNc4tRbjh7bmyV/34WeDMwhHLF79bCO/e24+b32xmb0H85yOKCIiIiJSJdjhIsLbV+Bp1h3DVX7jCF3x9XE37YJhmJX2CcNQ1iKK5r9BaOO3pdre1/0isCyCKz4u52QiVZtGKIuISKUR43NzXteGDOzSgC27jvD1yt18vXI3Xy7fRevG8Qzs2pAuLZNwu3Q/VERERETkx4R/WAXhItzpmeV+LjscpHD2/+NoRhdoem65n+9MWMcPUjjvNczUdDwdBpdqH7N2Cp42/Ql99w3ejsMw66SWc0qRqkkFZRERqXQMwyCjUTwZjeK54vyWzFuzhzkr9/C3qeuoE+ulX6f6nNe1AXXifE5HFRERERGpVEJbFmLE1sWV1qrcz2W4vdiFxzmy6GP8jc/BMCtHmcm2LQq/fhlsm5iBN2GYpZ9Gz9t1NNbBndjBgnJMKFK1VY6fdBERkVOoE+tlxDlNGdarCWu3HeTrlbuZvmA7ny3+gXPapTGkZ2PqJ8U6HVNERERExHF24XEiu9biaT8Iw6yYp/q8nUdQMPMpwlmL8WT0qZBznk5ozUwiezfi738DZu2UM9rXDMQTGPPHckomUj2ooCwiIlWCaRp0Sk+iU3oS2bn5zFq6k3lr9zJ3zV46tUhkaK/GZDSKxzAMp6OKiIhIGYlkZ2HVbed0DKkgVv5hrNzduBq0VZ8uWr5YAiPvxDjNC+jKkqtRR7wpjQmunoG75TkYhvPT01kFR3E36447o2/Ux4gc3En4h5X4uo4uw2Qi1YPzP+UiIiJnKDUhwNVDWvH4L3szpm8ztu45yqNvreTB15exdON+IpbldEQRERE5A7ZtEcndRXDDbApmv1jyqHlw3RfseeVOIrm7HU4oZc22IkRythNcO4vwrvUARLK3UvDp44S3LHA4XdVlGAautJaYtZMr9Jzx51yMdWgPkR9WV9h5f4o/8wr85//yrG5MhHeuJrjsQ8L7tpRhMpHqQSOURUSkyqod8DKmbzOG9mrMgnX7+HzJDv42dR1JdfwM6dmYvh3q4fOWfr40ERERqVjB7+YQ/mEVkewtUJQHgBFTB+tYDq7Exngy+hD89h8EP7oPX6/L8LS7QCNXqzDrSDahrYuI7N1MZP9WCBUC4Gk/CHfDdrgbtMWITaBo8RTcTTpj+DSt2ZmwjudSOOdlfJmX40pqWqHnjm3bG3PuB1j5hyr0vP+raMl7mHXS8LQ696yn/PC2H0Ro7RcEl7yHa9Rd+t0j8l9UUBYRkSrP53ExsEsD+neqz8otB5i55Acmf7GZqXO3MbBrQ87v1pA6sV6nY4qIiNRYdrCAyP6tRPZuIpKdRczgWzG8MUT2fId1ZB+epl1xpWXgqtcKo1ZySeHG3agjyT9/kt0f/pWiBZMJ71yLv//1mBX4OL9Exy48TmTfFsL7NuOu1wp3k85Yh/cQXDYVM6EBnpa9i//N0zIw4xIAMLwxxAy5lfyP7qdo2Uf4+/zM4W9RtYS3Liay5zsMT0yFn9swXQTG3u/odBfhnWsIrpqBp/0gPGVwPMPtw9t1NEXz3yCycy3uxh3L4Kgi1YMKyiIiUm2YpkG3Vsl0a5VM1q4jfLb4B2Ys2M7MxTvo3T6NIT0bUS9RI11EREQqStGKTwhvX451cAfYNhgmZlIT7PwjGN4Y/ANvxDB/+s9Sd1w8MUNvI7RhNkWL3iG8bSne9oMq6BvImYgc2E7ouzlE9m3BOvSvaUpMN4Y3BneTzrgatCPumud+cuSxK6kpnjbnEdrwFZ5W5+JKalJB6au+UNYizOTmmHVSHTm/YZjYwQLCu9bhad6jQs9tFR6jcM4/MOs2wNfz0jI7rqd1f4JrZlK09H1cjdpXivmhRSoDFZRFRKRaSm9Yh9807Mi+3HxmLdnBvLX7+Hb1HjqnJzG0V2NaNqyjx9ZERETKgG3b2Eezi0ej7t2MtT+LwIV/wvDGYB3NwfAG8HYZXTwaNbUFhsdfsu/piskl2xkG3nbn427UAaNWEgDhHatw1W+D4faVy/eSU7NtC+vQbiL7thDZuxl3s654mvfEPn6IUNZiXGkt8aZnFv+bJzfDcBc/KWa4veA+/VNjvh4XE962hPDWxSool1Lk0B6sgz/gO+cqR3MEN8wmuOQ9zIvvr7B/O9u2Kfr2FeyiPGKG/77keisLhsuNr/tFFM57HevwXlx1G5TZsUWqMhWURUSkWktLCDB+aGsuPLc5s1fsYvaK3TwyeQXN69dmaM/GdM1IxjRVWBYRESkt27ZKRukVznud8PfLsAuOAmD44nCltcQO5hdPXzDghjI9t1k7BQDr2AEKPn8Ws04q/vNuVtGxgoT3fEdwzUwi2Vn/mfM6EI8rrSUArsYdibvm+bOeu9bwxRK4+H6M2LpnnbmmCG9dBIaBu0VPR3N42wwguHIawdWfEnP+LRVyzvCmuYS3ryieOzqxcZkf390ik9iG7TFjapf5sUWqKhWURUSkRqgd6+XCc5szLLMJ89fuZdaSnbwwdR3J8X4G92hM34718Hn0Aj8REZH/ZYeDxfMf79tCZN9mIjnfE3fVX4pHGpsuXA3a4arXCldaS8z4ehXySLhZK4mYYbdROOfv5E+dhK/HJXg6DtHj6GXEDhYQyc4q/vfetxlP6/54WvaGYCH2kWw8Tbvhqlc8//F/z3ltmGXXl/r3vMrhXetxJTXB8MeV2bGro/DuDbjqt3V8fnHDF4unzUBCa2di9RhbchOoPJkpzfC0PQ9PhyHlcnzDNDFiamOHCrGOZOsGlggqKIuISA3j87g4r2tDBnRuwIrNOcxcsoPJX2zm43nfM7BLA87v1pDaeoGfiIgIAMG1n1O0+D2wwoBR/DK1Fr2ww0EMjx9/73GOZXM3bE/gkgco+vYVihZPIbxrLf6BNzleUKvK7GABRQvfJrR57glzXvOvQr2rSWdim3apsDzWsQMUfPYXPG0G4O87vsLOWxUFRt2FXXjM6RgAeDsMJrTuC4KrP8N/7jXldh7bigA2roRGuCrg+iic/SKRA9uJvfzRMp1WQ6QqUkFZRERqJNM06N46hW6tktmy6wifL9nB9AXb+WzxDvp0SGNIz8akJQScjikiIuIY27axjubgatgOb5uBuNJa/uTL1Jxg+mvhH/QbQhu/IbhymtNxqrzIvs2ENs/F0/Z83E26nDzndQW/f8KslYSn3fmE1n1Z/IK+5GYVev6qwo6EMVxujEpyM8WMrYsnow+hzXPxdr+o3KaKCK6cTnjHKgIj7zjhOi0vng5DCE9/hNCGr/B2HFbu5xOpzFRQFhGRGs0wDDIaxZPRKJ69B/OYtXQn89fu49tVe+jcsvgFfukN9AI/ERGpOWzbxjq0G1dCQ3y9rwKbs54TtzwZhoG3zQA8GX0xXG7sojyKVk7H121MhRSZqjrbsgj/sBJPs264G3ci9rJHMOukOh2rhK/7RYS3LqFw3usExtxbqa9FJ9iWRd47t+Npex6+LiOdjlPC23kk7vRzMPy1yuX4kewsgis+xt2iV4X9nLvrt8bVsD3BlTPwtO6P4dXgE6m59JtYRETkX+olxnLN0NY8/svejOzdlM07D/Pwmyt46I3lLN+0H8uynY4oIiJSrmzLomjua+R/dB+Rw3swDLPKFPAMV/F4qfDu9YTWzCTvg4lE9m9zOFXlZh3LoWD6IxR+8SzhvZsAKlUxGcDwBvBlXo6V8z2hTd86HafSiez5Djsvt9L9u5m1k3HXb41hGNi2VabHtkOFFHz9EkZsXfx9ry7TY5+Or+cl2EXHCa6ZWaHnFalsqkbPQEREpALVifVyUb/mPPHLPowblMHR/CDPf7SOu19exNcrdpFXGHI6ooiISJmzrTCFc14itHEO3g5DMevUczpSVDzNexIz8g6IhMj/+M8UrZyGbZVtQas6CG1ZQN77fyJycCf+gTfhrtfK6Uin5E4/B1e9VoTWf1XmxcmqLpS1CDwxuBt3cjrKSexwkPzpjxJc/VmZHrdo4VvYR3PwD7ypwkcJu5Ka4m7eg+Caz7GL8ir03CKViaa8EBEROQWf18X53RoysEvxC/w+W7yDN2ZtZvIXW0hvWIdOLRLpmJ5E/cSApsQQEZEqzQ4HKfzqb4R/WIm35yX4OleeR+ej4a7fmthLHqBw7msEl35AZNc6Yob/AcPlcTqa4+xgAYXzXiOctQhXasviFxnWTnY61k8yDKOkeGgYGhf3b3Y4SPj7Zbibda+UL4kz3F4wXYTWfo63/aAyyRjet5nQxm/xdh7h2E0QX49L8LQ9v9LNKS9SkVRQFhEROY3/foHf9n3HWLnlAGuyDvDenK28N2crSXX8dGqRRMf0RFo3jsfjdjkdWURE5Iz8u5js6/MzvO0ucDpOmTB8sfjPv4Vw405Yh3armPxvpomVuwtv94vwdh6JYVaNfosZlwiAlX8YuygfV936DidyXnjHaggV4EnPdDrKKXk7j6Bg+qOENs/H23bgWR/PldoS/3k3427WowzSRcesk4pZJxXbtsEK63eL1EgqKIuIiJSSYRg0q1ebZvVqc3G/5uQeLWTNtoOsyTrI3DV7+GrFLrwek7ZNEuiUnkjHFknUreVzOraIiJwl27YIbZqLGVsXd6OOTscpF5525+Nu1g1PRl+no5QpwzDwZPQpWQ5tnk941zr8fa+uUS/Usq0wwZXT8bTsjVk7hcBF95XMOV2V2LZFwfTHwO0hcOHEKjO/d3mxC49hxtfHVb+N01FOyVWvNWZyc4KrP8XTul/UNzBs28Y6+AOupKZ40s8p45TR5SmY+RRGTG1iBvzc6TgiFa7q/RdERESkkkio7WdA5wYM6NyAYCjCxh2HWbP1AKuzDrIq6wCwicapcXRskUSn9ESa1avtdGQRETlDVv5hCr9+mcju9QB42gzAl3klhqfq3zC0Co4S2vQt3k4jcDds73ScCmEXHCW8dTF52VvwD7wZd1pLpyOVO+tINgWzX8TK2QYuD77OI6pkMRnAMEy83cZQ+NXfCH33Nd525zsdyVHetufhaTOwUk+9ZhgG3s4jil/8+P0yPC16RXWc0PqvKFowmcCYP+JKTS/jlGfOMAzM+HqE1s0i0mkYrroNnI4kUqGq5n9FREREKhmvx0XHFol0bJHIuEE2ew7ksXrrQdZkHWDGwu1MX7CdWgEPPdqm0aphHdo1TSDg13+GRUQqPSuCdXgPvr7jsY8dILj6MyJ7NhIz8g7M2LpOp4ualXeIghmPYx3Lwd2kS40phng7DcOV1pKC2S9SMO0hvF1G4+06uspM+3AmbNsmtGkuhfPfBNOF/4Jf4mne0+lYZ83dvCeu7+ZQtPQD3M17YMbUzBv21tH9GP5aGN4Yp6OclrtpF1xpGRAORrV/5NBuihZPwdWoA2ZKizJOFz1vl5GENn5DcOmHxAz+jdNxRCpUuf4lO23aNP72t78RDoe55pprGDdu3Anrt23bxsSJEzly5AjJyck8+eST1KlThzVr1nD//fcTDAapX78+Dz74IMnJ/3lJwHvvvcfy5ct55JFHyjO+iIhIVAzDoEFyHA2S4xie2YTjBSHWfV88NcbSDfuYvWwnLtOgZcM6dEpPomOLRNIS9GI/EZHKwg4VElw5HW/nEZhxicRe8VjJHJmuhu0JbZqLEajjcMroWUdzyJ/xGHbhMWKG/6HGFJP/zZWaTuzYSRQueJPgio+xjh+sdo+s27ZNzifPULjuW1z1WuMfeGPJHMRVnWEY+PpeTf7791K0+D1iBtzgdCRHFM59DbvgCLGXPOh0lNMyDJOYUXdF1de1I2EKZ7+I4fHj739Dpeovm/5aeDsOJbh8KpH923ClNHc6kkiFKbcJh7Kzs3nqqad46623mDp1KlOmTCErK6tkvW3b3HLLLdx444188skntGnThpdeegnbtrn11luZMGEC06ZNY8yYMdx7770AFBUV8cQTT/DQQw+VV2wREZEyFxfjIbNtGjeNbscb9w3lznFdGdKzMccKQkyZncUfX17MXS8t4q0vN7N+ey7hiOV0ZBGRGiuyfxt5H04kuGoG4V3rAE544ZK7QVtizrsZwzCJZGeRP+NxrOO5TsU9Y5FDe8j/5M/YwXwCI27HXa+V05EcYXhjiBlwI/7zf4m3w2AA7GBB8Uu2qgHDMPDVT8fb8zJiRtxebYrJ/+aKr4+3wxDCWxZgHT/odJwKZ+UfJrJnA+6mXZ2OUmqGYWAVHiO48Zsz2i+47EOsgzvw97sesxLeyPN2GILhr0XR0g+cjiJSocpthPKCBQvIzMwkPj4egCFDhjBz5kx+/etfA7B+/XoCgQD9+vUD4Be/+AVHjx7l0KFDFBYWkplZ/JbSgQMHcvvttxMMBlm6dCmWZTFhwgTWrFlTXtFFRETKjctlktEonoxG8VwyoAUHjhSwZutB1mw9yJyVe/hy2S58XhftmyaUTKFRJ67qz9MpIlLZ2ZZFcPWnBJd9hBGoQ8zI23Gf5kVXVt4hItlZ5H1wL/5zr8XTvEcFpY1e0YLJYFsERt2JK6GR03Ec52lRPAWEbYXJn/E4Zq1E/Odei+GLdTjZmbMjIYqWfojh9uLrfhF1eowgmHPM6Vjlxtt1DO6W51S7YnlphLcuAdvG3SLT6ShnJLxlAUUL38ZVt0Gp5kG2gwWEtizA03oA7qZdKiDhmTO8MXh7jMUuysO2LQyjZr8oUmqOciso79+//4RpKlJSUk4oAu/YsYOkpCTuvvtuvvvuO5o3b869995LnTp1CAQCzJs3j759+zJjxgxCoRCHDh2ib9++9O3blw8//DCqTImJcWf9vaKRnFzLkfNWdWq36KjdoqN2i47aLTr/3W7JybVok57C5UBhMMyarAMs3ZDNsg37WL45B4D0RvH0bJNK97aptGgQj2lWnkf9KpKut+io3UROzw4HKfjsL0T2bsLdvCf+c68pVUHR07wHrsTGFMx+kcIvnyeccS7+3ldVyjlN/13o8J93MwTzMeukOR2pkjFxN+tKcOlH5GVvxT/wxtPeUKhMIof2UDj7RayDP+Bpe161GWn9UwyPD1dCI2wrgnVoD67EmnODJJS1CDOxCa669Z2OckY8rftTtOITgqtmEDPkt6fd3vDGEBg7CcPtrYB00fO2GeB0BJEKV24FZcuyTpjbxrbtE5bD4TBLlizhzTffpEOHDjz99NM88sgjPPLIIzzzzDM8+uijPPHEE4wZM4b4+Hg8Hs+PneaMHDx4HMuq2P+wJifXIqca3xUuL2q36KjdoqN2i47aLTqna7dmybE069+cS/s1Y+f+46zZepDVWw/w9qxNvDVrE+kN63DTyLYkxVe+YkV50vUWHbXbmTFNw7EBCOIsw+3FTGyMp1U/3C17n9EcnWadVAJj7ia4/GOCq6aTf2g3gQvvrVTzfIZ3rado6fvEDL2t+AVmNfQlZj/FME18nUfibtCOgtn/j4Lpj+HtNAxv1zEYnsr7pJBt24S++5qihe9geHz4B9+KpwpNg1AWiha+TWjzfGIvfxgzEO90nHJnHcnGytmGr9flTkc5Y4bHj7fdBQRXfEzk0O6fnL89uO4LPOnnVJmXLtrhIMEVn+BKTcfdpLPTcUTKXbmNxU9LSyMnJ6dkOScnh5SUlJLl5ORkmjRpQocOHQAYOXJkyQhmt9vNG2+8wdSpUxk9ejSWZZVMnSEiIlITGIZB49RajOzdlD9e3Z2nbu3L1YMz2J1znImvLGHxhmynI4qIVGl2sICCr18mlLUIAH/vcXgy+kRVCDZMN74eY4kZeSe+bmMwDAM7XIRtRco69hkLbV9BwcynIBICW3P0n44ruRmxF0/C07ofwdWfEtn7HQCR/VsJb1+JXXjc4YQnCq6cRtG813HVyyBwyQM1rpgM4G1/AURCFC2a4nSUimFbuFv0wv2v6VqqGk/7C8DtJbj601NuE8paSNGCyYQ2fVuByc6S6SL8/TKKlryLbel3rVR/5VZQ7t27NwsXLiQ3N5eCggJmzZpVMl8yQJcuXcjNzWXjxo0AzJ49m3bt2gFw9913lxSXX3nlFYYOHYppah4aERGpuWoHvAzs2pD7rutJg6Q4XvxkPf+YvoGCorDT0UREqpzieY//RDhrAXZe2b1Qz12vFe7GnQAo/PZVCqY9gnUs5zR7lZ9Q1iIKv3gOM7ExgZF31ojRm2XB8Pjw97uOmFF34UorfmlhcP1sCmb9leOv/5q89+6mcO6rhLYswCo46khGO1gAgKd1P3x9fkbMsN/V2H9fs04a3k7DCGctJLx3k9Nxyp0ZX4+Y82+psnNHm/5aeFr3J7xl0Y/+/FjHD1I473XM1HQ8HYY4kDA6hunC2+NirEN7CGctcDqOSLkrtyptamoqt912G+PHj+fCCy9k5MiRdOzYkRtvvJG1a9fi9/t5/vnnueeeexgxYgSLFy/mzjvvBOC+++5j4sSJDB06lJ07d3LHHXeUV0wREZEqJTk+hjvGdWF0n6YsWL+P+19ZyrY9zvwxKyJS1dhWhKLlU8n/5CHAJmbU3Xg7DS+Xc7kbdSCSu4u89/9EaEvFFxeC382hcPaLuNIyCIyYgOHXdC5nyl2vVcl82P5zryFm1F14e4zFiEsilLWYwq9fwtq/FYDwnu8IbphNJHcndjmOBLfDQQoXTCbv/Xuwi/IwA/F4211Q418E5u0yEiMukaJ5b2Bb1fdmu3VkH6Hvl2FHqvZ39HYaTuCiP500nYVtWRR+/RLYNjEDb8IwXQ4ljI67WXfMpCYULfsIOxJyOo5IuTLsmjBb/79oDuWqQ+0WHbVbdNRu0VG7Racs223zzsO8PG09h48HufDcZgzr1aTavrBP11t01G5npqrOoVzRfdyqfF0VfP0y4S3zcbfsjb/P1eX+8jzrWA6Fs18ikr0Fd3omDcb8ktxjFfModOHCt7EO7yVm0K8r/QutTqcyXnO2ZWEd2oVZOwXD46dw/huE1n9VvNIbwJXWEldaBp7mPTBrp/z0wUopkruTwq9exDq0C0/7Qfh6XvqT/7aVsd3KU3j7Sgpm/RX/gBvxZPSJ+jiVud0KF71DaN0XxP3sr5XuJlE07WbbNlgRDFfx672Cqz+laPG7+PvfgKfVueURs9yFd66l4LO/4Os9Dm/7QafdvjJfb5WZ2q30yqt/W24v5RMREZHyldEonvuv78lrMzfxwTfbWP99Lj8f2ZaE2n6no4mIVBq2bUO4qPhlUO0vwN2oA570zAo5t1krmZhRdxJcNYPg8qkcWVgP2o8pt/PZto11ZC+u+Pr4Mq8AO4Jh6k++8mCYJq7ExiXLvt4/w9thCJF9m4v/t3czwR2rcdWtj1k7hfCO1USys3ClZeBKTT+jmxm2bRFa9yVFS97F8AaIGfY73I06lsfXqtJcTToTM+z3uBq2czpKubAti3DWItyNOla6YnI07HCQ/GkP427UEV/3i4o/K8rD3aw77oy+DqeLnqthe1z1WmPl7nY6iki5Uu9CRESkCgv4PfxiTDs6NE9k8hebmfjPJVw7rA3dWiU7HU1ExHF2UR6Fc1/Dzj9MzMg7cSU3w5XcrEIzGKYLX9fRuBu2J75lKw4eCRE58ANmQoMyLfbatk3RoncIrf+KwEUTcSU2AkN/7lUUwzAwaqdg1k7B869imFVwFMNTfJM3sn8bwVUzwJ4GhoGZ0BhXWks8rfudUJj+Mdb+bRQtfAtX4874+19/0jQBUswwDNyNOgBgHd1fZiPDK4vIvk3Y+YdxV9ANsfJmuL2YsXUJrv8Sb6dhGB4/vp6XYltWVC9HrSwMwyBm2O+q/JMhIqdTsydaEhERqQYMw6Bvx3rcd10PkuNjeP6jtbw2cyNFwYjT0UREHBPes5G89+8l/P1yXJVgNKcrpTmm149VeIz8aY+Q//GfsY7sK5Nj25ZF0dxXCa39HE+bAZgJDcrkuHJ2zJjaJUUlX/eLiLv2BWKGT8DbZTSGL0Bo47dYxw4AEPp+OQVz/l782eF92LZNZP82bNvGlZpOzKi7iBnyWxWTSyH8w0ry3rmD8O4NTkcpU+GsReD24W7S2ekoZcbbaTgU5ZH/8YMEv5sDFI/+r+oMtxfbtglvX4ldeNzpOCLlQresRUREqonUhAB3X92Nj+ZuY+aiHWzeeZibR7ejcWotp6OJiFQYOxImuHwqwVUzMOqkELjwngoflfxTTH8t/P2vp3Duq+R9MBFf76vwtOoX9Yg82wpTOOfvhLMW4e08svilcVV4dF91Znj8uBu2w/2vKRlsKwz/mv7czsslsmM14c3zirf1xWEXHcc/6Nd4mnXHXa+VU7GrHFeDdhi1kiia/wausQ+UzM9bldmREKHvl+Fu2hXD7XM6TplxpabjqteayN6NWIeq1xQR9pFsCmY9g7fTMHy9LnM6jkiZq/q/WUVERKSE22Vy6YB02jVN4O/TN/Dg68u4pH8LLujRCFMFBhGpAcJbFhBcNR1P6374zrmqZMqBysTTvAeulBYUznmZom9fIbJjDf5+10U1L2pJMbnnpfg6jyiHtFJe/nvKE2/7QXjaXYB1eO+/5mHeglk7GXfjTg4mrJoMtxd/n3EUzHya4NpZ+DoPdzpSGTDw9x2PWav6TWnm6z2O0MZv8PW81OkoZcqMT8Odnklw3Rd42g/CjK3rdCSRMqWCsoiISDXUtmkC91/fk1c/28g7s7NY930uN4xoQ5246jOqRUTk32zbxjq4A1dSE9yt+hJTOxl3/TZOx/pJZlwCMSMmEFozk6LlH2MdP4grioKyJ+NcXGkZeNueVw4ppSIZhoGrbn1cdetDmwFOx6nS3I07427SheCKj/Gk98KMS3Q60lkxXG48LXo5HaNcuBIb4erzM6djlAtf94sIb11CcMXH+M+91uk4ImWq6k9OIyIiIj+qVsDLry/uwNVDWrF552H+9M8lrNl6wOlYIiJlyio8RuEXz5L/0f1EDu7EMMxKX0z+N8Mw8XYaTtxVf8GV1ATbihBc9wV2JPST+9lFeQRXf4ptW7gbtlMxWeRH+HpfBbZF0bKPnI5yVuxgAQVz/kEkd5fTUeQMmbVT8LTpT2jjXKwj2U7HESlTKiiLiIhUY4ZhMLBLA+69tgd1Yn08/d4a3vpiM6GwXtgnIlVfeNc68t+/l/CONfh6XVZlX0b376kuIjvXUrRgMvlTHyRyaM+PbmsVHCV/+mMULf0A6+DOiowpUqWYtZKJGfRr/JlXOB3lrIR/WEl481zsYIHTUSQK3q6jwXQRXDfL6SgiZUoFZRERkRqgQVIs917TjUHdG/Hl8l088NoydufordMiUjXZkRCFC9+m4NMnMLwBAhfei7fjUAyjav95427SmZjBv8XOyyX/w/sIbpiNbdsl6628QxRMewTr8B5iBv8WV1ITB9OKVH7uxp0w/HHYRXmnHflfWYWyFmHEJeJKbeF0FImCGYgnMPJ2fFX8xobI/6raPS4REREpNY/bxZUXtOT/Lu3E0bwgk15bxuwVu04oVoiIVAV24XHCm+fjaXs+gYsnVqvCqrtpFwKXPICrXgZF816n4POnsUOFWEf3k//JQ1h5ucQM/wPuxh2djipSJVj5R8ibcifBNTOdjnLGrIKjRHatw5OeWeVvmNVkrtR0DJcHq+Co01FEyox+I4mIiNQwHVskcv8NvWjVOJ43Z23m2Q/Wciw/6HQsEZGfZNs2oY3fYgfzMWPrErjsIfx9r8ZwV7+XjZqBeGKG/Q5f73HFRSS3l8IFk7GD+QRG3I67XiunI4pUGWagDq56rQiumIZ1LMfpOGckvG0p2Bbu9Eyno8hZCu/eQN7k3xHet9npKACE92wkcuAHp2NIFaaCsoiISA1UJ9bL/13aiSvPb8m67w/yp38uYf32XKdjiYj8KCv/CAUzn6Lw238S2vgNAGZMbYdTlS/DMPG2H4R/8K0Yhom//w0ERt2NK6W509FEqhzfOVeCAUUL33Y6yhkJb1uCmdAQV0Ijp6PIWXKltsDwxRJc8n6FPx1oHc8llLWIwnlvYIeKAAit/5L8DyeSP+Nxwrs36IlFOWNupwOIiIiIM0zDYFCPRrRqHM+Ln6znL++sYmivxlzcrzlul+45i0jlEN6xisI5/8AOFeDr/TM87c53OlKFMgwD+FcBvZoX0UXKixmXiLfrGIJL3iO8YzXuxp2cjlQqMYNvxTquG/7VgeH24e06mqL5bxDZuabcr8FQ1iLCO9cQ2bcZ+9iB4g89fjyt++FKaoIv83LM5OaE1n5OwYzHMJOb4+0yAneTLppeRUpFBWUREZEarnFqLf50bQ+mzM5i5uIdfPfDIW4e3Y60hIDT0USkBrNti6L5kwlt+AozoREx592JK6GB07FEpIrydhhCeNNcChe8RWzD9himy+lIp2X4YnH5Yp2OIWXE07o/wTUzKVr6Pq5GHcqkcGtbYawDO4js20RkXxb+gTdheHyEv19GZN9mXGkZuNoPwpXWCjOxUcl1b9ZKxtd5ON72FxDaPJ/g6k8pWvg27sadwSieZurfNzRFfowKyiIiIoLP42L8kFa0b5bAK59+x32vLGHcBRn07VhPnUkRcYRhmGBbeDoMwdfzEgyXx+lIIlKFGS43/v43FP//KlBMzp/+KO4mnfF2GOJ0FCkjhsuNr/tFFH79EuGtS/CcxdzYwbWfE/5hFZH9WyFc/C4Uo3YKVt5BXPH1i691j/+0/XjD7cXbdiCe1v2wjx3AMF1Yxw6Q/+njeNsPwtOqH4bbG3VOqb5UUBYREZESXTOSaVavNn+fvoFXPtvI2u9zuWZoK2L9KuSI/JRp06bxt7/9jXA4zDXXXMO4ceNOWP/cc8/xwQcfULt28ZQFl112GePGjWPPnj1MmDCBgwcP0qxZM5544gliY2vuaDTbtgitnYURiMeTnomv73jd1BKRMuNKawkUj74kVIjhjXE40Y+L5O4ksuc73M26Ox1Fypg7PRNv7q5Sz4dvFRwlsm8LkX2biWRnERh5O4bbR2TfFuyiPDyt+uGql4ErtSVmbN2S/c702jZMF0adVADsYD6GvxZF898kuOITPO0H4213HoZXTy/Kf6igLCIiIieoW8vH76/ozOeLd/Dht9vYtucIN45sS6vGdU+/s0gNlJ2dzVNPPcWHH36I1+vliiuuoFevXqSnp5dss27dOp588km6dOlywr73338/V111FSNGjOD555/nhRdeYMKECRX9FSoFK+8QhXP+TmT3etwt++BJz1QxWUTKnG3bFHz+NAAxQ/6vUv6eCWctAsPE3byH01GkjBmGia/XZafdrmjxu4S3r8A6sq/4A5cHV0pz7IKjGLWS8V/wy3Kb69iV2JjA6D8S2buJ4KrpBJe+T3DVDPwDb8TTtGu5nFOqHs20LSIiIicxDYNhmU24++puuF0mj729kvfmZFFQFHY6mkils2DBAjIzM4mPjycQCDBkyBBmzpx5wjbr1q3jxRdfZNSoUUyaNImioiJCoRBLly5lyJDix5kvvvjik/arKULfLyfv/XuIZG/Bd+61+Af83OlIIlJNGYaBu35rIjtWE/lhldNxTmLbFqGsRbgati9+GadUS+HdG8if9giFe7IIrvuSgi9f4Pjbf8AOFwFgFx7DqJOKt+dlBEb/kbhrXyAw6i7MWskA5f7ivH//nASG/4HARffhbtQeV0JDACL7tmD9+0V/UmNphLKIiIicUrN6tbnvuh689eUWPlu0g/lr93HRuc04t2N9TLPyjegRccL+/ftJTk4uWU5JSWHNmjUly3l5ebRp04YJEybQpEkT7rzzTl544QXGjRtHXFwcbndxlzw5OZns7OwKz++0ohWfEFz2IWZSU2LO+wVmfJrTkUSkmvO0H0Ro01wKF7xJbMO2GG6f05FKRLK3Yh8/iKfHWKejSHkyTCJ7N7LnlTuKF2MTcKVlYAcLMNy+kvm+KwNXclNiLvgVUDzCv3DuK1iHs4un7+g8HFddvTC3JlJBWURERH6S3+vm+uFt6N+5PlNmZ/HazE18tXwXl52XTvtmiU7HE3GcZVknPDL9v29Gj42N5eWXXy5Zvv7667n77ru56qqrTnrUOppHrxMT46JIfXaSk2ud9TFsK4Jhuijq1Js8L9Ttd1mNePFeWbRdTaR2i47a7dQKRtzM3jcn4t70BQkDrjxhnZPtdmT7Pgq9MaR164fpq5xzPJ+KrrczkNyDY/wKTBf+xm3w1ElxOlGphX82kcOLPuHYqi/J3zKfQEZP4ntfjL9BywrNoevNWSooi4iISKm0qF+Hu8Z1ZfmmHN6bk8WTU1bTvnkClw9Mp0FyxRe0RCqLtLQ0li1bVrKck5NDSsp//jDcs2cPCxYs4JJLLgGKC85ut5uEhASOHTtGJBLB5XKdtF9pHTx4HMuyz/6LlFJyci1yco5Fvb9tWQRXf0pk5xpiRt6B4UqC9qM5kFsIFJZd0ErobNuuplK7RUftdhqBJrjTz+HwwqmEGvXErF38+9fxdmt6LrHjenDwaBioOv9+jrdbVVS/x3/arUq1nQ+6XEqgzVBC674gf92XFObsIXDJAxU2J7mut9IzTaNcBh9oDmUREREpNcMw6N46hQd/nsnl56WzbfdR/vTPJbw+cyNH8oJOxxNxRO/evVm4cCG5ubkUFBQwa9Ys+vXrV7Le7/fz+OOPs3PnTmzbZvLkyQwaNAiPx0P37t359NNPAZg6deoJ+1VH1vGDFMx4lODS9zEC8RAJOR1JRGowX+bl+HpdhhGX4HQUAOyiPGzbwvD4nY4iclqmvxa+7hcTd9Vf8F9wC4ZhEMndTd7UBwhtX45tW05HlHKkEcoiIiJyxjxukyE9G9OnQz0+mfc9X6/czaIN2QzPbMLgHo3welxORxSpMKmpqdx2222MHz+eUCjEJZdcQseOHbnxxhu59dZb6dChA5MmTeKWW24hFArRtWtXrrvuOgAmTpzInXfeyd/+9jfq1avHk08+6fC3KT+hrYspnPsq2Db+ATfibtm7wkYyiYj8GDMQj7fDYADsSMjxaXcK57+JlbuLwNhJ+v0oVYbhjcHlLZ5H2S48il1wlMJZz2LWrY+30wjc6b0wTJUfqxvDtu2Kez7OYRX9OCBoGH601G7RUbtFR+0WHbVbdKpru+3Lzee9r7NYueUACbV9jO3fgl5tUzHL6I+h6tpu5U3tdmbK65HA8lYVprwI71hDwcwnMVNaEHPezSWPltc0+pmMjtotOmq30guu/5Lg2lnEjn2AlPpJjrSbHS7i+Ou34knPxN/vugo//9nS9Rad6thuthUhvG0pwVXTsXJ3YcQlEnPeL3Clld0cy9Wx3cpLefVvdYtAREREzlpaQoDfjO3Iph2HeOerLF6etoEvl+3k8vNaktEo3ul4IuIQK+8QZmxdXI3a4+9/Q/GoZFNPMIhI5WImNsE+up/gymlQ35libnj7SggX4U7PdOT8ImXFMF140jNxt+hFZMdqgms/x6idDEBk/zbM+DQMb8DhlHK2VFAWERGRMtOqcV3uvbY7i9bv44NvtvHI5BV0y0jmkoEtSK2rjqNITWFbEYIrPiG4ajoxI+/EndYST6tznY4lIvKj3GktcWf0JbjmM3KMIgoLw3g7DsWsk0p4+0rCO9ecvE+TzrgbdyJyaA+hdV+ctN6Mr4e3w2Bsy6Jo/hsnn9Qw8PcdD0Bw9WeENs/FiK2Lq16rMv9+Ik4wDKP456RJZ6C4b1Aw6xnsUBHeLiPwdR7pbEA5Kyooi4iISJkyDYPe7evRrVUKs5bs4NNFO1iVdYDzujZkVJ+mxMU4Oz+hiJQv6+h+Cma/iLV/K+6WfXAlNHQ6kojIafl6XYZ1aDf5m5dgWTaeVn2BVCKHdhPevvyk7c06adC4E3bhsR9d70rLgA6DAftH12OY8K+CcnjvRuzC43g7jcAwzDL+ZiKVg2G6iBn6fxQt+4jgkvcx45LwaER+laWCsoiIiJQLn8fFqD7NOLdTfabO3caXy3eyYN1eRvVpxnldG+B26Q8mkerEtm3CWxZQOP+N4pF35/1CfyiKSJVhxtQm9qKJJ83N6usyEl+XU4+kdNdrRdzVz5xyvWG6fnI9QGDobWceWKQKciU1JWbwreR/8mcK572OK60lZlyi07EkCvpLTkRERMpVfJyPa4e14f7retI0rRbvfLWFe/6+mOWbcqhB7wYWqf6C+RQtegdXUhNiL3lQxWQRERE5iWG6iBl4M1gRCr99xek4EiWNUBYREZEK0TAljt9d3pm123J59+ssnv9oLRkN63D5+S1pVq+20/FEJErhvZtwJTTE8MUSGP1HjNopGKbGrYiIiMiPM+uk4h/wc41OrsJUUBYREZEKYxgGHVsk0q5ZXeau3svUudt44LVlZLZLZWy/FiTW8TsdUURKyY6ECS7/iOCqT/F0GIz/nCsx49OcjiUiIiJVgKd5DwBsy8IuPIoZiHc2kJwRFZRFRESkwrlMkwFdGtCrbSqfLvqBz5fsZPmmHAb3aMTwzCbE+NRFEanMrMN7i1+8d2A7ntb98XW/2OlIIiIiUgUVfv0iVu4uAhdNxHB7nY4jpaRn0URERMQxMT43Y/u34OGbMunWKpkZC3/grhcXMmflbiKW5XQ8EfkRR1d+Sd6HE7GO5eAf9Bv8/a7D8PicjiUiIiJVkCejL9ah3RQtec/pKHIGVFAWERERxyXW8XPTqHbcM747qQkBXv98E/f9cylrtx10OpqI/I/g/u24UlsWv3ivWTen44iIiEgV5m7UAU/7QYTWfUF41zqn40gpqaAsIiIilUbz+rW5c1xXfnVRe0Jhi6feXc1fpqzi+z1HnI4mIv+SeME1xAz/PWZsXaejiIiISDXg63kpZt36FM75O1bhMafjSClogkIRERGpVAzDoFurFDqlJzF7+S4+mb+dW/8yh3qJATqlJ9GpRSLpDevgMnVfXMQJhsuDYejnT0RERMqG4fbiH3gz+VMnEVr3Jb7uFzkdSU5DBWURERGplNwuk8E9G9O7Qz3Wbj/E/NW7+WLpTmYu3kGs302H5ol0TE+kQ/NEYv0ep+OKiIiIiEiUXElNCIy+GzOpmdNRpBRUUBYREZFKLS7Gw+h+LTinTQoFRWHWf5/L6qwDrN56kEUbsjENg5YN6xSPXk5PJC0hgGEYTscWEREREZEz4EppAUBk/zYMfxxm7RSHE8mpqKAsIiIiVUaMz0331il0b52CZdl8v/coq7IOsDrrIO9+ncW7X2eRUjeGTi2Ki8sZjeJxu/RovoiIiIhIVWCHiiiY+RRGnVQCo+7CMF1OR5IfoYKyiIiIVEmmadCiQR1aNKjD2P4tOHikkDVbD7Aq6yBfr9zNF8t2EuNz0a5ZIp1aJNKhRSK1A16nY4uIiIiIyCkYHh++3uMonP3/CK6ajq/rGKcjyY9QQVlERESqhcQ6fgZ2bcjArg0pCkbY8MO/psbIOsiyjfsxgOYNatM5PYlOLZJokByrqTFERERERCoZT3om4R2rCC7/GHfDDrhSmjsdSf6HCsoiIiJS7fi8Lrq0TKZLy2Qs22ZH9jFWZx1kVdYBPvhmGx98s43E2n46pSfSKT2J1o3j8bj1OJ2IiIiISGXg73M1efu2UDD7RWLH3o/h8TsdSf6LCsoiIiJSrZmGQdO02jRNq82Yvs04dKyItdsOsjrrAPPW7mX2it14PSbtmibQKT2Jji0SiY/zOR1bRERERKTGMnyx+AfcSOGXz2Md2qNRypWMCsoiIiJSo9St5aNfp/r061SfYCjCxh2HWb31AKuzDrByywEAmqbVKp4aIz2JxqlxmhpDRERERKSCueu3JvbKxzU6uRJSQVlERERqLK/HRccWiXRskcjPBmWwKyeveN7lrQf4eN73TJ33PfFxXrpmJNOjdQotG8Zjmioui4iIiIhUBMPjxw4WULT0fbxdRmEG4p2OJKigLCIiIgKAYRg0SomjUUocI3s35WhekLXbDrJyywHmrimeGqN2wEPXVil0b5VMq8bxuEzT6dgiIiIiItWalX+I0MZvsY7mEDP0NqfjCCooi4iIiPyo2rFe+nSoR58O9SgMhlm7LZdlG/ezYN1e5qzcTVyMh64ZyXRvnUzrxnVxu1RcFhEREREpa674+vgyL6do/puENnwFKRc5HanGU0FZRERE5DT8Xjc9WqfQo3UKRaEI67YdZNmmHBZ/l823q/cQ63fTpWVxcblt0wQVl0VEREREypCn7fmEd6ymaNEUgu17AHWcjlSjqaAsIiIicgZ8HhfdWqXQrVUKoXCEdd8Xj1xevnk/89buJcbnpkvLJLq3SqFds7p43C6nI4uIiIiIVGmGYeDvfwP579/L/qlP4x35RwyXyppOUcuLiIiIRMnjdtGlZTJdWiYTClts2J7Lsk37Wbn5AAvW7cPvddH5X8Xl9s0S8HpUXBYRERERiYYZiMfX7zo8+zdg2xFU1nSOWl5ERESkDHjcJp3Sk+iUnkR4qMV3Pxxi2cb9rNicw6L12fg8LjqlJ9K9VQodWiTiU3FZREREROSMeJp2JblHf3JyjmHbFoahqeacoIKyiIiISBlzu0w6NE+kQ/NErh7Sik07D7N8436Wb85hyXf78XpMOjZPpHvrFDq2SMTvVZdMRERERKS0wj+spGjZhwRG3YXhDTgdp8bRXy8iIiIi5cjtMmnXNIF2TRMYNziDzTuPsGzTfpZvymHZphw87uLic/dWyXRKTyLGp+6ZiIiIiMhPMfy1sHJ3UzjvDWLOu9npODWO/mIRERERqSAu06RNk7q0aVKXcRdkkLX7CEs37mf5puKpMdwug/bNEunWKpkuLZMI+D1ORxYRERERqXRcqel4u44muHwqocad8KRnOh2pRlFBWURERMQBpmmQ0SiejEbxXHlBS7btPsqyTftZtmk/q7IO4DIN2jVLYFivxrRqXNfpuCIiIiIilYq3yyjCO9dQOO91XGktMeMSnY5UY2jmahERERGHmYZBesM6XHF+Sx6/pTf3jO/OoO6N2Ln/OI++tZLXZm4kvzDsdEwRERERkUrDMF3EDLwZrAiF377idJwaRSOURURERCoRwzBoXr82zevXZsy5zfh47vd8vnQHq7MOcPXgVnTJSHY6ooiIiIhIpWDWScU/4OeYtdRHrkgaoSwiIiJSSfk8Li47L517xncnLsbLsx+u5YWp6ziSF3Q6moiIiIhIpeBp3gNXclNsy8LKO+R0nBpBBWURERGRSq5Zvdr86druXNyvOau25HDPy4uYv3Yvtm07HU1EREREpFIo/OoFCj59AjuswRflTQVlERERkSrA7TIZ2bsp91/fk3pJsfxjxnc8+e5qDhwucDqaiIiIiIjjPK37Yx3aTdGS95yOUu2poCwiIiJShdRLjOXOcV352eAMsnYf4Z5/LOaLpTuxLI1WFhEREZGay92oA572gwit+4LwrnVOx6nWVFAWERERqWJMw+C8rg158IZetG5cl7e/2sJDby5nd85xp6OJiIiIiDjG1/NSzLr1KZzzd6zCY07HqbZUUBYRERGpohLr+PntJR25aVRb9h8q4L5XlvLxvO8JRyyno4mIiIiIVDjD7cU/8GbswmOE1s92Ok615XY6gIiIiIhEzzAMMtul0bZZAu98tYWP533Pso37uXZYa5KTazkdT0RERESkQrmSmhAYcw9mUhOno1Rb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Nm1axQeuJP633WzbtkeOHGlnZ2f/5H663k5ut3/bv3+/ff7559vff//9SfvV9OtNSkf92+iofxsd9W/Pnvq3p6f+bXTUv42O+rfRUf+26tAI5TKwYMECMjMziY+PJxAIMGTIEGbOnFmyfvfu3RQWFtK5c2cALr744hPW11TJycnceeedeL1ePB4PLVq0YM+ePSdss27dOl588UVGjRrFpEmTKCoqciht5bFt2zYArr/+ekaPHs2bb755wnpdb6d33333cdttt5GQkHDC57re/uPdd99l4sSJpKSkALBmzRqaNGlCo0aNcLvdjBo16qTrKhQKsXTpUoYMGQLUzGvvf9vN6/UyceJE4uLiMAyDjIyMk37PAaxdu5aPPvqIUaNG8Yc//IEjR45UdHRH/W+7FRQUsGfPHu6++25GjRrFM888g2VZJ+yj6+3kdvtvjz32GFdccQVNmzY9aV1Nv96kdNS/jY76t9FR//bsqX97eurfRkf92+iofxsd9W+rDhWUy8D+/ftJTk4uWU5JSSE7O/uU65OTk09YX1O1bNmypFO4fft2PvvsM/r371+yPi8vjzZt2jBhwgQ++ugjjh49ygsvvOBQ2srj6NGjnHPOOTz//PO8+uqrvPPOO8yfP79kva63n7ZgwQIKCwsZNmzYCZ/rejvRn//8Z7p3716yfLrfcwCHDh0iLi4Ot9sN1Mxr73/brUGDBvTp0weA3NxcJk+ezPnnn3/SfsnJyfzyl7/kk08+oV69eic9rlrd/W+7HThwgMzMTB566CHeffddli1bxvvvv3/CPrreTm63f9u+fTtLlixh/PjxP7pfTb/epHTUv42O+rfRUf/27Kh/Wzrq30ZH/dvoqH8bHfVvqw4VlMuAZVkYhlGybNv2CcunW1/Tbdmyheuvv57bb7/9hDtNsbGxvPzyy7Ro0QK3283111/PN99841zQSqJLly489thj1KpVi4SEBC655JIT2kXX20975513uO666076XNfbTyvNdfVjn+naK5adnc0111zD2LFj6dWr10nrn3/+ebp164ZhGPz85z9n7ty5DqSsPBo1asTzzz9PSkoKMTExXH311Sf9POp6O7UpU6Zw1VVX4fV6f3S9rjcpDfVvz476t2dG/duzo/5tdNS/PTvq354Z9W/Pjvq3lY8KymUgLS2NnJyckuWcnJwThuf/7/oDBw78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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/lstm_base.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Network \n",
+ "\n",
+ "The instantiation of the heart of a Hopfield-based network, the module Hopfield
, is even simpler. Only one argument, the size of the input, needs to be set.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_characters (20) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
\n",
+ "\n",
+ "An additional output projection is defined, to downproject the result of Hopfield
to the correct output size. Afterwards, everything is wrapped into a container of type torch.nn.Sequential
and a corresponding optimiser is defined. Now the Hopfield-based network and all auxiliaries are set up and ready to associate !"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield = Hopfield(\n",
+ " input_size=latch_sequence_set.num_characters)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield.output_size * latch_sequence_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield, Flatten(), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABZQAAAHsCAYAAABFbSiOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAB2qUlEQVR4nO3deZxT9fX/8XeSSWaSSXAAZ0Hki1as1MJoLV9FVHAFWSIKuFugCKLWovO1WKwLiixCseCKilarBQUXQKwiisWl0Lr8WgEVlVorogwDg5JMMpPt/v4YEh0HnJnMZG6W1/Px+D4e3Nx7k3PPN+Xx4XhyPhbDMAwBAAAAAAAAANAEq9kBAAAAAAAAAAAyAwVlAAAAAAAAAECzUFAGAAAAAAAAADQLBWUAAAAAAAAAQLNQUAYAAAAAAAAANAsFZQAAAAAAAABAs1BQBgAAAAAAAAA0S57ZAbTG7t01isWMdv3Mzp3d2rXL366fmQ3IW/LIXXLIW/LIXXLIW3LIW/LIXctYrRZ17FhodhhthnVw5iBvySFvySN3ySFvySN3ySFvySFvLZOqNXBGF5RjMaPdF9Lxz0XLkbfkkbvkkLfkkbvkkLfkkLfkkbvcxTo4s5C35JC35JG75JC35JG75JC35JA38zHyAgAAAAAAAADQLBSUAQAAAAAAAADNktEjLwAAAPDDotGIdu+uUiQSMjuUdpGX51DHjsWy2VjmAgAAAKnAShsAACCL7d5dpYIClwoLy2SxWMwOJ6UMw1BNzR7t3l2lAw/sYnY4AAAAQFZi5AUAAEAWi0RCKizskPXFZEmyWCwqLOyQM93YAAAAgBkoKAMAAGS5XCgmx+XSswIAAABmoKAMAAAAAAAAAGgWCsoAAABoF36/X9df/5tmX7958we6/fbbUhgRAAAAgJZiUz4AAAC0C59vjz755KNmX9+z55GaMuXIFEYEAAAAoKUoKAMAAKBdzJ//e+3cWaXrr/+N/vvf/+iAA4qUn5+vGTPmaNas21RVtUM7d1apT59jNWXKTfrnP9/VH//4oO6550FdddVlOvLIn+q99/6lr7/erWuumazjjz/B7EcCAAAAcg4FZQAAgBzxt41f6c0NX6XkvU8s76ITenf5wWuuuWayfv3riZo06f907rln6amn7laXLgfp5ZdX6fDDf6zp02crHA7rkkvO1UcfbW50fzgc0QMPPKI333xdCxcuoKAMAAAAmICCMgAAANpdx46d1KXLQZKkM844Ux98sElLly7WZ5/9R998842CwUCje4477nhJ0o9+dJh8vj3tGi8AAACAehSUAQAAcsQJvZvuIm4v+fn5iT8//fSTWrv2VZ111jkaNepY/ec//5ZhGI3ucTgckiSLxbLP8wAAAABSz2p2AAAAAMgNNptN0Wi00etvv/0PnXXWCA0cOFihUEiffPKxYrGYCRHun9/v17Bhw/TFF180Ovfhhx9qxIgRGjRokG644QZFIhFJ0pdffqmLL75YZ555pq644grV1NRIkvbs2aPLLrtMgwcP1sUXX6yqqqp2fRYAAACgNSgoAwAAoF106tRZpaVlmjnz1gavn3feRXrkkQc1evT5uvPOO9SrV7m++upLk6Js7L333tOFF16ozz77bJ/nJ0+erJtvvlkvvfSSDMPQ0qVLJUm33nqrLrroIq1atUq9evXSfffdJ0maP3+++vTpoxdffFHnnnuuZsyY0V6PAgAAALQaIy8AAADQLvLy8nT//X9s9PrPf/6/euKJZ/d5zzHH9JEk3XPPg4nXunQ5SE8/vTI1Qe7D0qVLNXXqVF133XWNzm3btk21tbU6+uijJUkjRozQXXfdpXPPPVdvv/227r333sTrl1xyiSZPnqy1a9dq0aJFkqRhw4Zp2rRpCofDstvt7fZMAAAAQLIoKLfA8+s+0/8cdIDKD+lodigAAABoJz/UQbxjxw4VFxcnjouLi1VZWandu3fL7XYrLy+vwevfvycvL09ut1vV1dUqLS1N4VO03peP36xwONLodZf3eklS7bpFiu36vNH5/OMvku3A7gp/9IbCH7/Z6Lz9xyfKfsRJiu78r+rWL250/t/BA/SU7+eSpPOjK/YZ2xLbcEnSKbE3VWLsanT+r9YTtMNyoH4a26xexkeNzm+yHKH3rT1VYuzUKbG/NTq/w9JZf7WemFQMFotkGObGEJdJMXSxVqt/+A1TY0iHPCQTQ/w7l+t5aGkM5ZaP9ZPIh6bGkA55SCYGi0WqFHloaQynaZ0OjDYee5VreWhpDPG/4zIxD39xj9KvRvRWYUHmNxFQUG6Bf35Spc92+CkoAwAAQJIUi8VksVgSx4ZhJDYN/O7rkhodf/ceq7Vlk+g6d3a3PNhW+lKS3d74nw/FxR5J0k6nQ6F9nO/YsVD5xR75viyQbx/nPZ4CeYo9qosWatc+zm/fFlDIauiwrgeooMq2z9i6FXeof6+vHSoIN76m9IBC5Ts6qHONUwWBxuc7u5zqVthBRaGgCr5pfN5jd6hbUf1nEAMxEEN2xlBUk296DOmQB2JovxgKv84zPYZ0yEMuxfA/XQ5QaUkHOfMzvxxrMTJ4i+xdu/yKxdov/HlL31MwHNXvLj6m3T4zWxQXe1RV5TM7jIxE7pJD3pJH7pJD3pJD3pLX3Nxt3/5flZV1b4eI0se+ntlqtbS6CHvqqafqscce08EHH5x4bdu2bRo7dqxefvllSdI777yju+66Sw8//LCOO+44vf3227LZbPrqq690ySWXaM2aNTr11FO1ePFilZWVKRKJ6Nhjj9U//vGPFo28aO91sGTO/14Nw9DEuWt1Rp9uOveUHu362W2Fv+eSQ96SR+6SQ96SR+6SQ96SQ95api3WwPt83zZ/xyzmduZpT03I7DAAAACQJrp27ar8/Hy9++67kqQVK1aof//+stvt6tOnj1544QVJ0vLly9W/f39J0oABA7R8+XJJ0gsvvKA+ffowP3k/akNRRaKG3C7yAwAAkC4oKLeA2+mQr6bO7DAAAABgsgkTJmjjxo2SpLlz52rWrFk688wzFQgENHr0aEnS1KlTtXTpUg0ZMkTvvPOOrrnmGknS1VdfrX/9618aOnSoFi9erJtvvtmsx0h7/mBYkuTOglmDAAAA2SLzh3a0I7fLrmBdVOFITPY8avEAAAC55NVXX038eeHChYk/9+zZU08//XSj67t27arHH3+80etFRUW6//77UxNklkkUlOlQBgAASBtURVvA46xfyMYXtgAAAABSJ77u9jgdJkcCAACAOArKLeCmoAwAAGC6hx9+QA8//IDZYaAd+AN0KAMAAKQbCsot4Nm7kPUH2JgPAAAASDVffOSFk4IyAABAumCGcgvEF7I+OpQBAECGCqyctc/XXd7rJUm16xYptuvzRufzj79ItgO7K/zRGwp//OZ+72+Oxx9/VH/968uKRmM67ri+ikQiKi4u1YUXXiJJuuGGyRo4cIi6deumefN+r2AwqN27q/WLX4zV2WePavbnIPP5gyFZLJKrgH+2AAAApAs6lFuAkRcAAACt8/e/r9NHH32ohQsf0yOPLFJVVZU6dDhAr7zykiQpEKjRpk0b1a/fiVq5coXGjLlUDz30mO66637de+9dJkeP9uYPhOV22mW1WMwOBQAAAHvxn/pboDBeUA5QUAYAAJmpqU7ign4X/+B5+xEnyX7ESUl//jvvvKUPPtikSy/9hSSprq5WpaVlCoXq9MUXW7Vx43s64YSTZLfbddVV1+gf/1ivxx9/RP/+9xYFg4GkPxeZyRcMM+4CAAAgzVBQboE8m1WFBXmMvAAAAEhSLBbVeeddqAsuqB9v4fP5ZLPZVFjo1po1q7Vp0wZdcslYSdLNN0+Rx9NBJ5xwkk47bWCiixm5I96hDAAAgPTByIsW6lCYrxoKygAAAEk55pj/1UsvvaBAIKBIJKLrr79Wa9eu0cCBZ+rVV1/WF19sVXn50ZKkt99+S+PHX66TTjpZf//7OklSNBo1MXq0N38tBWUAAIB0Q4dyC3UodNChDAAAkKQTT+yvLVs+1mWXjVUsFtVxx/XT4MHDZLFYdMABRfrpT3vLsnde7rhxE3TFFeOVn+/QYYcdri5dDtJXX31p8hOgPfkDYR12UAezwwAAAMB3UFBuIU+hQ1XVzO8DAABI1tix4zV27PhGr9911/0Nji+44JLEaIzvuvTSiSmLDenDMAz5g2G5nQ6zQwEAAMB3MPKihToUOuQPhswOAwAAAMhqwbqoojGDkRcAAABphoJyCzHyAgAAAEi9eBOHx0VBGQAAIJ1QUG6hDoUOhcIx1YXZEAYAAGQGwzDMDqHd5NKzZrt4EwcdygAAAOmFgnILdSisn+FWQ5cyAADIAFarTdFoxOww2k00GpHVajM7DLQBf4CCMgAAQDqioNxC8YKyL0BBGQAApD+n0y2f72sZRszsUFLOMGLy+XbL6XSbHQragD/eoczICwAAgLSSZ3YAmaZDYb4kyV9LQRkAAKQ/t/sA7d5dpcrKLyRl+zgIixyOArndB5gdCNpAvKDsoUMZAAAgrVBQbqF4h7KfDmUAAJABLBaLOnUqMTsMoMX8wbCsFouc+fyTBQAAIJ0w8qKFEgVlZigDAAAAKeMLhOV22WWxWMwOBQAAAN9BQbmF3E67LJJ8gZDZoQAAAABZyx8MM+4CAAAgDVFQbiGbzSpXQR4dygAAAEAK+QMhuSkoAwAApJ2UFpRXrlypIUOGaODAgVq0aNF+r1u7dq1OPfXUVIbSptxOOwVlAAAAIIV8wfqRFwAAAEgvKdvhorKyUvPmzdOzzz4rh8OhCy64QMcdd5x69OjR4LqdO3dq9uzZqQojJdwuu3xsygcAAACkjD8YpkMZAAAgDaWsQ3ndunXq27evioqK5HK5NGjQIK1atarRdTfeeKOuuuqqVIWREh6nQzV0KAMAAAApETMM1QQjFJQBAADSUMo6lHfs2KHi4uLEcUlJiTZs2NDgmscee0xHHnmkjjrqqKQ+o3Nnd6tiTNaBHV36osqv4mKPKZ+fqchX8shdcshb8shdcshbcshb8sgdslWwLqKYYbApHwAAQBpKWUE5FovJYrEkjg3DaHD88ccfa/Xq1Xr00Ue1ffv2pD5j1y6/YjGj1bG2RHGxR3lW6ZuakHbs2NPgmbB/xcUeVVX5zA4jI5G75JC35JG75JC35JC35JG7lrFaLaY1I6Dl/HvHyzFDGQAAIP2kbORFWVmZqqqqEsdVVVUqKSlJHK9atUpVVVUaOXKkLrvsMu3YsUMXXXRRqsJpUx6nXeFITKFwzOxQAAAAgKzj2ztezu10mBwJAAAAvi9lBeV+/fpp/fr1qq6uVjAY1OrVq9W/f//E+UmTJumll17SihUr9OCDD6qkpESLFy9OVThtKj7LzRcMmRwJAAAAkH3iHcoeOpQBAADSTsoKyqWlpaqoqNDo0aN19tlna9iwYSovL9eECRO0cePGVH1su4gXlP1szAcAAAC0uXjjBpvyAQAApJ+UzVCWJK/XK6/X2+C1hQsXNrru4IMP1quvvprKUNpUfJZbvHMCAAAAQNvxJ0ZeUFAGAABINynrUM5mdCgDAAAAqeMPhmWzWlTgsJkdCgAAAL6HgnISPK76zUF8FJQBAACANucPhOV22WWxWMwOBQAAAN9DQTkJrvw8WSyMvAAAAABSwR8My8O4CwAAgLREQTkJVqtFhQV2Rl4AAAAAKeALhpmfDAAAkKYoKCfJ47Iz8gIAAABIgfqRFw6zwwAAAMA+UFBOUqHTLn8gZHYYAAAAQNZh5AUAAED6oqCcJI+TkRcAAABAW4vFDNUw8gIAACBtUVBOktvJyAsAAACgrdXUhmVIFJQBAADSFAXlJLlddtUEwzIMw+xQAAAAgKwR/xWg20VBGQAAIB1RUE6Sx+lQJGqoNhQ1OxQAAAAga8QLysxQBgAASE8UlJMU/wkec5QBAACAtuMP0KEMAACQzigoJym+wKWgDAAAALSd+D4lzFAGAABIT3lmB5Cp4gtcX4CCMgAAQDZbuXKlFixYoEgkojFjxujiiy9ucP61117T3LlzJUk//vGPNW3aNNXW1mrcuHGJa3w+n3bv3q1//vOfeuutt/TrX/9aZWVlkqQjjzxSs2bNar8HSnPfjrxwmBwJAAAA9oWCcpI8iZEXIZMjAQAAQKpUVlZq3rx5evbZZ+VwOHTBBRfouOOOU48ePSRJe/bs0ZQpU/T444+rR48eWrhwoebNm6cbb7xRK1askCTFYjGNGTNGFRUVkqRNmzZp3LhxmjhxomnPlc78gbDseVY57PyYEgAAIB2xSktSYuQFHcoAAABZa926derbt6+Kiorkcrk0aNAgrVq1KnH+s88+00EHHZQoMJ9yyil65ZVXGrzHM888I6fTKa/XK0nauHGj3nzzTXm9Xl1++eX66quv2u+BMoAvGJLbaZfFYjE7FAAAAOwDHcpJcubnyWqxyF9LQRkAACBb7dixQ8XFxYnjkpISbdiwIXF8yCGHaPv27dq8ebN69uypF198UTt37kycj0ajuv/++3XfffclXvN4PBo8eLAGDhyoJ554QhUVFXryySdbFFfnzu5WPFXyios9Kf+McFQq8uS3y2e1l2x6lvZE3pJH7pJD3pJH7pJD3pJD3sxHQTlJVotFbmceHcoAAABZLBaLNeiUNQyjwXGHDh00e/Zs3XTTTYrFYjrvvPNkt3+7mdwbb7yhQw45REcccUTitWnTpiX+fOGFF+qOO+6Qz+eTx9P8fxzt2uVXLGYk+1hJKS72qKrKl/LP2fVNQAV2W7t8Vntor7xlG/KWPHKXHPKWPHKXHPKWHPLWMlarJSWNCIy8aAW3y5HYhRoAAADZp6ysTFVVVYnjqqoqlZSUJI6j0ajKysr01FNP6ZlnntFPfvITdevWLXH+lVde0ZAhQxLHsVhMCxYsUDQabfA5NpsthU+RWfyBsDwue9MXAgAAwBQUlFvB7bTToQwAAJDF+vXrp/Xr16u6ulrBYFCrV69W//79E+ctFovGjRunyspKGYahRx99tEEB+V//+pf69OmTOLZarXr55Zf10ksvSZKWL1+uo446Si6Xq/0eKs35g2G5nRSUAQAA0hUF5VbwOO3y06EMAACQtUpLS1VRUaHRo0fr7LPP1rBhw1ReXq4JEyZo48aNslqtmjZtmsaPH68zzzxTHTp00KWXXpq4f+vWrSorK2vwnrNnz9Zjjz2moUOH6plnntH06dPb+7HSVjQWU01thIIyAABAGmOGcisUOu2MvAAAAMhyXq9XXq+3wWsLFy5M/Pnkk0/WySefvM9733vvvUavHX744S3ehC9X1AQjkiSPy2FyJAAAANgfOpRbweOqH3lhGO27IQoAAACQjeLNGnQoAwAApC8Kyq3gdtoVMwwF6yJmhwIAAABkPH8gJImCMgAAQDqjoNwK8YUuc5QBAACA1vPvHXlBQRkAACB9UVBuBY+rfqHLHGUAAACg9fzB+g7l+DobAAAA6YeCciu4nfWbhfgDFJQBAACA1or/8q+QDmUAAIC0RUG5FdwuRl4AAAAAbcUXCMthtyrfbjM7FAAAAOwHBeVWcBfsHXlBhzIAAADQav5gWB66kwEAANIaBeVWcObbZLNa6FAGAAAA2oA/GE6MlQMAAEB6oqDcChaLRW6nPbF5CAAAAIDk+QLhxFg5AAAApCcKyq3kdtnlD0bMDgMAAADIeDXBsNyMvAAAAEhrFJRbyeO0yx+gQxkAAABoLR8FZQAAgLRHQbmV3E67fMxQBgAAAFolEo0pWBdhUz4AAIA0R0G5ldwuB5vyAQAAAK1Us3dNzQxlAACA9EZBuZXqN+ULK2YYZocCAAAAZKz4r/4YeQEAAJDeKCi3kttpl2FIgVo25gMAAACS5Q/UF5QZeQEAAJDeKCi3UnzBy9gLAAAAIHn+xMgLh8mRAAAA4IdQUG6l+Iw3CsoAAABA8hh5AQAAkBkoKLdSfMEb/4keAAAAgJZLdCg780yOBAAAAD+EgnIrxUde+IIhkyMBAAAAMpc/EFa+wyZ7ns3sUAAAAPADKCi3EiMvAAAAgNbzB0NsyAcAAJABKCi3Ur7dpjyblZEXAAAAQCv4gmHmJwMAAGQACsqtZLFY5HbmJTYRAQAAANBy/kA48es/AAAApC8Kym3A7XTQoQwAAAC0gj8YZuQFAABABqCg3AY8LjszlAEAAIBWqB954TA7DAAAADSBgnIbcDspKAMAAADJCkdiqgtF5XbmmR0KAAAAmkBBuQ246VAGAAAAkhZfS7tddCgDAACkOwrKbcDjtKsmGFYsZpgdCgAAAJBx4gVlZigDAACkPwrKbcDttMuQVFNLlzIAAADQUv5ASFL9uhoAAADpjYJyG3C76he+jL0AAAAAWs6XGHlBQRkAACDdUVBuA/FOCl+AgjIAAADQUoy8AAAAyBwUlNuAx1m/eQgdygAAAEDL+fc2ZhRSUAYAAEh7FJTbQLxDmYIyAAAA0HK+YFjOfJvybPzzBAAAIN2xYmsDzFAGAAAAklcTDLMhHwAAQIagoNwG8u02OfKsiZ/qAQAAAGg+XzAs994xcgAAAEhvFJTbiNtlly8YMjsMAAAAIOP4A2F5XHQoAwAAZAIKym3E7bTToQwAAAAkwR8MMfICAAAgQ1BQbiNup50ZygAAAEASfMxQBgAAyBgUlNuI22mXj4IyAAAA0CJ14ahC4RgjLwAAADIEBeU24nE6GHkBAAAAtFDN3qYMOpQBAAAyAwXlNuJ22RWoiygai5kdCgAAAJAx/BSUAQAAMgoF5TYSXwDXBCMmRwIAAIC2tHLlSg0ZMkQDBw7UokWLGp1/7bXX5PV65fV6de2116qmpkaStGzZMp144okaPny4hg8frnnz5kmS9uzZo8suu0yDBw/WxRdfrKqqqnZ9nnTjo6AMAACQUSgot5H4zDfmKAMAAGSPyspKzZs3T4sXL9by5cu1ZMkSbdmyJXF+z549mjJliubNm6eVK1eqZ8+eicLxpk2bNGXKFK1YsUIrVqxQRUWFJGn+/Pnq06ePXnzxRZ177rmaMWOGKc+WLuJj49wuh8mRAAAAoDkoKLeReEeFPxAyORIAAAC0lXXr1qlv374qKiqSy+XSoEGDtGrVqsT5zz77TAcddJB69OghSTrllFP0yiuvSJI2btyoZcuWyev16je/+Y2++eYbSdLatWvl9XolScOGDdPrr7+ucDh3mxLiIy88dCgDAABkBArKbSRRUKZDGQAAIGvs2LFDxcXFieOSkhJVVlYmjg855BBt375dmzdvliS9+OKL2rlzpySpuLhYV155pZ577jl16dJF06ZNa/SeeXl5crvdqq6ubq9HSju+vQ0Zhc48kyMBAABAc7BqayPxgjIjLwAAALJHLBaTxWJJHBuG0eC4Q4cOmj17tm666SbFYjGdd955stvr14X33ntv4rrx48frjDPO2OdnGIYhq7VlfR6dO7tbdH1bKS72tPl7RmWR22lXWekBbf7e6SIVecsF5C155C455C155C455C055M18FJTbyLcjLygoAwAAZIuysjK98847ieOqqiqVlJQkjqPRqMrKyvTUU09JkjZs2KBu3brJ5/PpmWee0dixYyXVF41tNpuk+i7nnTt3qqysTJFIRDU1NSoqKmpRXLt2+RWLGa17uBYqLvaoqsrX5u9bVV2jwoK8lLx3OkhV3rIdeUseuUsOeUseuUsOeUsOeWsZq9WSkkYERl60EYfdpny7jZEXAAAAWaRfv35av369qqurFQwGtXr1avXv3z9x3mKxaNy4caqsrJRhGHr00Uc1ZMgQuVwuPfTQQ3rvvfckSX/+858THcoDBgzQ8uXLJUkvvPCC+vTpk+hqzkX+YFhuV+4+PwAAQKahQ7kNuZ12CsoAAABZpLS0VBUVFRo9erTC4bBGjRql8vJyTZgwQZMmTVLv3r01bdo0jR8/XqFQSMcff7wuvfRS2Ww2zZ8/X7fccotqa2t1yCGHaM6cOZKkq6++WlOmTNHQoUPl8Xg0d+5ck5/SXP5AWB09+WaHAQAAgGaioNyG3C4KygAAANnG6/XK6/U2eG3hwoWJP5988sk6+eSTG93Xp08fLVu2rNHrRUVFuv/++9s8zkzlC4bVrdScmdAAAABoOUZetCGP0y4fM5QBAACAZjEMQ/5gWB6nw+xQAAAA0EwUlNtQfYdyyOwwAAAAgIwQCscUjsSYoQwAAJBBKCi3IXcBIy8AAACA5vLtbcZwOykoAwAAZAoKym3I7bIrWBdVJBozOxQAAAAg7cWbMTwUlAEAADIGBeU2FF8I06UMAAAANM2/d/8RRl4AAABkDgrKbcjtqt9MhIIyAAAA0LT4upmRFwAAAJmDgnIbii+E450WAAAAAPbPR0EZAAAg41BQbkOMvAAAAACazx8IyyKpsICCMgAAQKagoNyG4rPffBSUAQAAgCb5g2EVOu2yWi1mhwIAAIBmoqDchr4deREyORIAAAAg/fmCYcZdAAAAZBgKym0oz2ZVgcNGhzIAAADQDP5AKPErPwAAAGQGCsptzO20M0MZAAAAaAZ/MJzYhwQAAACZgYJyG/O4KCgDAAAAzeFn5AUAAEDGoaDcxtxOh/wBCsoAAADADzEMg4IyAABABqKg3MYYeQEAAAA0rTYUVSRqMEMZAAAgw6S0oLxy5UoNGTJEAwcO1KJFixqdf/nll+X1ejV06FBNmTJFoVAoleG0C4/LzqZ8AAAAQBPiTRh0KAMAAGSWlBWUKysrNW/ePC1evFjLly/XkiVLtGXLlsT5QCCgadOm6ZFHHtFf/vIX1dXVadmyZakKp924nXbVhaIKR6JmhwIAAACkrXhB2eN0mBwJAAAAWiJlBeV169apb9++Kioqksvl0qBBg7Rq1arEeZfLpVdffVUHHniggsGgdu3apQ4dOqQqnHYT77DwByMmRwIAAACkL9/efUcYeQEAAJBZ8lL1xjt27FBxcXHiuKSkRBs2bGhwjd1u12uvvabrrrtOJSUlOvHEE1v0GZ07u9sk1pYqLvbs99xBZfVFcXuB/Qevy0XkI3nkLjnkLXnkLjnkLTnkLXnkDpnMH6wfd+dh5AUAAEBGSVlBORaLyWKxJI4Nw2hwHDdgwAD94x//0B/+8AfdcsstuuOOO5r9Gbt2+RWLGW0Sb3MVF3tUVeXb73kjXN+ZvHXb13Lb2fMwrqm8Yf/IXXLIW/LIXXLIW3LIW/LIXctYrRbTmhGwb346lAEAADJSyiqeZWVlqqqqShxXVVWppKQkcfz111/rzTffTBx7vV599NFHqQqn3cRHXrAxHwAAALB//tqwLBbJmZ+yHhcAAACkQMoKyv369dP69etVXV2tYDCo1atXq3///onzhmFo8uTJ+vLLLyVJq1at0jHHHJOqcNqN21W/qYifgjIAAACwX/5AWG6nXdZ9/IoRAAAA6Stl7QClpaWqqKjQ6NGjFQ6HNWrUKJWXl2vChAmaNGmSevfurdtuu00TJ06UxWJRjx49dOutt6YqnHZTWFCf0vhP+AAAAAA05guGE7/uAwAAQOZI6e/LvF6vvF5vg9cWLlyY+PPpp5+u008/PZUhtLs8m1Wu/DxGXgAAAAA/wB8IsyEfAABABmLXuBRwO+2MvAAAAAB+gD8YToyLAwAAQOagoJwCbpdd/kDI7DAAAACAtMXICwAAgMxEQTkF3E47Iy8AAACA/TAMQzXBsDwuCsoAAACZhoJyCnicdtVQUAYAAAD2KVgXVTRm0KEMAACQgSgop4DbRYcyAAAAsD/+YP14OArKAAAAmYeCcgq4nXaFwjHVhaNmhwIAAACknXjzBQVlAACAzENBOQU8e3erZuwFAAAA0Jg/sLegzAxlAACAjENBOQXinRa+AAVlAAAA4Pv8exsvPHQoAwAAZBwKyikQLyj76VAGAAAAGok3XridDpMjAQAAQEtRUE6BRIfy3s1GAAAAAHzLHwzLZrXImW8zOxQAAAC0EAXlFIjPgqsJRkyOBAAAAEg//mBIbqddFovF7FAAAADQQhSUU6CwIE8WSb4AHcoAAADA9/mDkcSv+gAAAJBZKCingM1qlasgjxnKAAAAwD74AyEKygAAABmKgnKKuF0OCsoAAADAPviC4cSYOAAAAGQWCsop4nHaE7tXAwAAAPiWPxiWhw5lAACAjERBOUXcTjsdygAAAMD3xAxDfjqUAQAAMhYF5RShoAwAAAA0FqiNyDAkt9NhdigAAABIAgXlFHG76kdeGIZhdigAAABohZUrV2rIkCEaOHCgFi1a1Oj8a6+9Jq/XK6/Xq2uvvVY1NTWSpHfffVejRo3S8OHDNWbMGG3btk2S9NZbb+m4447T8OHDNXz4cF1//fXt+jxmizddMPICAAAgM+WZHUC28jjtikRjCoVjynfYzA4HAAAASaisrNS8efP07LPPyuFw6IILLtBxxx2nHj16SJL27NmjKVOm6PHHH1ePHj20cOFCzZs3TzfeeKMmT56s++67Tz179tTTTz+t6dOna8GCBdq0aZPGjRuniRMnmvx05ogXlBl5AQAAkJnoUE4R996OC18wZHIkAAAASNa6devUt29fFRUVyeVyadCgQVq1alXi/GeffaaDDjooUWA+5ZRT9MorrygUCunqq69Wz549JUlHHHGEvvrqK0nSxo0b9eabb8rr9eryyy9PvJ4r/Hs3rnbToQwAAJCR6FBOkXjHhT8Y1oEHOE2OBgAAAMnYsWOHiouLE8clJSXasGFD4viQQw7R9u3btXnzZvXs2VMvvviidu7cKYfDoeHDh0uSYrGY7rnnHp1++umSJI/Ho8GDB2vgwIF64oknVFFRoSeffLJFcXXu7G6Dp2u54mJPq9/D8p9qSdL/dC1ScefCVr9fJmiLvOUi8pY8cpcc8pY8cpcc8pYc8mY+Csop4tm7yUi8AwMAAACZJxaLyWKxJI4Nw2hw3KFDB82ePVs33XSTYrGYzjvvPNnt33behkIhTZkyRZFIJDHiYtq0aYnzF154oe644w75fD55PM3/x9GuXX7FYu27V0dxsUdVVb5Wv8+XO+rfIxQMqaoq1ur3S3dtlbdcQ96SR+6SQ96SR+6SQ96SQ95axmq1pKQRgZEXKRLvUPYFKSgDAABkqrKyMlVVVSWOq6qqVFJSkjiORqMqKyvTU089pWeeeUY/+clP1K1bN0lSTU2Nxo8fr0gkogULFshutysWi2nBggWKRqMNPsdmy509N/yBsPJsFhWwzwgAAEBGalZB2e/3S5I++OADLV++XOEwRdKmxGfC0aEMAACQufr166f169erurpawWBQq1evVv/+/RPnLRaLxo0bp8rKShmGoUcffVRDhgyRJE2ePFndu3fX/Pnz5XDU/3rNarXq5Zdf1ksvvSRJWr58uY466ii5XK72fziT+IJhuZ32Bp3eAAAAyBxNjry488479fnnn+vaa6/V+PHj1aNHD7399tuaMWNGe8SXsVz5ebJY6FAGAADIZKWlpaqoqNDo0aMVDoc1atQolZeXa8KECZo0aZJ69+6tadOmafz48QqFQjr++ON16aWX6oMPPtCaNWvUo0cPnXPOOZLq5y8vXLgwMSLj3nvvVadOnTRnzhyTn7J9+QNhufeOhwMAAEDmabKg/Nprr2nRokVasmSJhg4dqhtuuEEjR45sj9gymtVqUWGBXTUUlAEAADKa1+uV1+tt8NrChQsTfz755JN18sknNzh/5JFH6qOPPtrn+x1++OEt3oQvm/iDYXlc9qYvBAAAQFpq1sgLp9OpdevWqW/fvpLqNxdB0zwuOx3KAAAAwHf4g2EVOikoAwAAZKomC8odO3bULbfcok2bNqlfv36aO3dug41IsH9up13+AMV3AAAAIM4fDMtDQRkAACBjNVlQnj17tkpKSvTAAw/I6XTKYrFo9uzZ7RFbxnM77fLToQwAAABIkmIxQzV7N+UDAABAZmpyhvKBBx6o0aNHy+1264MPPtBhhx2mAw44oD1iy3gel12ffrXH7DAAAACAtFBTG5Yhyc0MZQAAgIzVZEH5zjvv1Oeff65rr71W48ePV48ePfT2229rxowZ7RFfRit02uUPhGUYhiwWi9nhAAAAAKaK/3qPkRcAAACZq8mRF6+99pqmT5+u1atXa+jQoXrssce0efPm9ogt43mcDkVjhmpDUbNDAQAAAEznC9QXlOlQBgAAyFxNFpQlyel0at26derbt68kKRRio7nmiM+GY44yAAAA8N0OZYfJkQAAACBZTRaUO3bsqFtuuUWbNm1Sv379NHfuXJWUlLRHbBkv3nlBQRkAAAD4dl3MpnwAAACZq8mC8uzZs1VSUqIHH3xQTqdTFotFs2fPbo/YMl58Nlz8p30AAABALqOgDAAAkPma3JTvwAMP1PDhw/XWW2/pww8/1KhRo3TggQe2R2wZ79sOZUaEAAAAAP5AWPY8qxz2Zk3eAwAAQBpqciX3xhtvaOTIkXrllVe0Zs0ajRo1Sq+88kp7xJbx4h3KfjqUAQAAAPmCIbmddlksFrNDAQAAQJKa7FC+88479ec//1k9evSQJH3yySeaPHmyTj/99JQHl+mc+XmyWizyMUMZAAAAkD8QTjRdAAAAIDM12aEcDocTxWRJOvzwwxWNRlMaVLawWCxyO/PYlA8AAABQ/Qzl+Fg4AAAAZKYmC8oFBQXauHFj4njjxo1yOp0pDSqbuF0ORl4AAAAAknzBMBvyAQAAZLgmR15MnjxZl19+ubp37y6LxaJPP/1Ud955Z3vElhXcTjsdygAAAICkmmBYHqfD7DAAAADQCk0WlPv06aO//OUveu+99xSLxXT00UerY8eO7RFbVvA47dpeHTA7DAAAAMBU0VhMNbURRl4AAABkuCZHXkhSUVGRBgwYoFNOOUUdO3bUhRdemOq4sobbZWdTPgAAAOS8mmBEkhh5AQAAkOGaVVD+vo8++qit48habqdd/kBYhmGYHQoAAABgmniTBQVlAACAzJZUQRnN53HaFTMMBesiZocCAAAAmMYfCEkSIy8AAAAyHAXlFCvc24HB2AsAAADksvhG1R46lAEAADLafjflmz59+j5fNwxD4TDF0eby7O3A8AfCKmUvQwAAAOQoRl4AAABkh/0WlIuKivZ708SJE1MRS1ZyOx2Svu3IAAAAAHKRP0BBGQAAIBvst6B81VVXtWccWSs+I46CMgAAAHKZPxhWvt0mh91mdigAAABoBWYop1h8RpwvQEEZAAAAucsfDMvt3G8/CwAAADIEBeUUK3DYZLNa6FAGAABATqsvKDvMDgMAACDn7d69u1X3N1lQjkQirfqAXGexWOR22eUPhswOBQAAADCNLxBOjIMDAACAeYYOHaprr71W77zzTlL3N1lQPuWUUzRv3jxt27YtqQ9A/dgLRl4AAAAgl/mDocQ4OAAAAJjn1VdfVb9+/TRnzhx5vV4tWrRIfr+/2fc3WVBeunSpbDabLrnkEk2cOFFr166VYRitCjrXuJ12Rl4AAAAgp9WPvKCgDAAAYLaCggKNHDlSS5cu1Y033qg//vGPOumkk3Trrbc2axxGkwXlLl26aNKkSVqzZo3OPfdc3XbbbTrttNP00EMPKRRijENzUFAGAABALotEYwrWRRl5AQAAkCZef/11/frXv1ZFRYVOP/10Pfnkk+rSpYuuvPLKJu9t1jbL//73v/XUU0/p+eef19FHH60RI0bojTfe0NVXX60FCxa0+gGyndvlkD/4tdlhAAAAAKao2dtcwcgLAAAA851yyikqKirSRRddpN///vcqKCiQJB1xxBFasmRJk/c3WVC+8MILtXXrVo0cOVJPP/20ysrKJEknn3yy+vbt28rwc0O8QzlmGLJaLGaHAwAAALQr396CstvlMDkSAAAA3HHHHTriiCNUWFioUCikXbt2qXPnzpKkNWvWNHl/kyMvLrroIv31r39VRUVFopgsSVarVX/9619bEXru8DjtMgwpUBsxOxQAAACg3fn3blDtLmjWDyQBAACQQtu3b9c555wjSdq2bZuGDh2qV199tdn3N7miGzx4sJYsWaI333xTNptNp5xyikaOHClJKiwsTDLs3BKfFcdGJAAAAMhFfjqUAQAA0sb999+vxx57TJJ06KGHatmyZbryyit16qmnNuv+JgvKM2bM0JYtWzR8+HAZhqFnnnlGn3/+uSoqKloXeQ6Jz4rzB8JSJ5ODAQAAANpZYuQFzRUAAACmi8ViDSZRdOnSRbFYrNn3N1lQ/tvf/qa//OUvstvrF39nnXWWzjrrLArKLVC4d+HsC4ZMjgQAAABof/5A/TqYgjIAAID5OnXqpCeffFKjRo2SxWLRsmXLdOCBBzb7/iZnKHfq1EnRaDRxbLFY1KFDh+SizVENOpQBAACAHOMLhlXgsMme1+Q/PwAAAJBi06ZN09KlS1VeXq7y8nItXbpUU6dObfb9TXYo9+zZUxdddJFGjBghm82mF154QR07dtQjjzwiSfrlL3+ZfPQ5IjFDuZaCMgAAAHIPe4kAAACkj0MOOUTPPvusvvnmG9lsNrnd7hbd32RBua6uTkcccYTef/99SdLBBx8sSfr444+TCDc35dttyrNZ6VAGAABATvIHw/K4KCgDAACkg+rqaj333HOqqamRYRiKxWL673//qzvuuKNZ9zdZUJ41a5Ykadu2bYpEIurevXvrIs5BFotFHpc9sRkJAAAAkEv8gXDiV3sAAAAw1zXXXKOCggJt2bJF/fr107p16/Tzn/+82fc3OcTsv//9r4YOHaqzzz5bI0aM0Omnn65///vfrQo6F7mddjqUAQAAkJP8wXBiXxEAAACY68svv9SDDz6o/v3765JLLtETTzyhTz/9tNn3N1lQnjZtmsaPH6+3335b7777rq644grdeuutrQo6F7mddvnpUAYAAMg4K1eu1JAhQzRw4EAtWrSo0fnXXntNXq9XXq9X1157rWpqaiTVL9QvvvhinXnmmbriiisSr+/Zs0eXXXaZBg8erIsvvlhVVVXt+jxm8AXDcjsdZocBAAAASQceeKCk+lnKH3/8sUpLSxWJRJp9f5MF5V27dumcc85JHI8cOVK7d+9OItTc5nYy8gIAACDTVFZWat68eVq8eLGWL1+uJUuWaMuWLYnze/bs0ZQpUzRv3jytXLlSPXv21Lx58yRJt956qy666CKtWrVKvXr10n333SdJmj9/vvr06aMXX3xR5557rmbMmGHKs7WXcCSqulCUkRcAAABponPnznrooYfUq1cvPfPMM3r11VdVW1vb7PubLChHo1F9/fXXiePq6uqkAs11bpdd/kDI7DAAAADQAuvWrVPfvn1VVFQkl8ulQYMGadWqVYnzn332mQ466CD16NFDknTKKafolVdeUTgc1ttvv61BgwZJkkaMGJG4b+3atfJ6vZKkYcOG6fXXX1c4nL2NB/5gfbcLIy8AAADSw7Rp0+RwONSnTx/16tVLd911l37zm980+/4mN+W75JJLdP7552vw4MGyWCx64YUXNGbMmFYFnYs8TrsCtRHFYoasVovZ4QAAAKAZduzYoeLi4sRxSUmJNmzYkDg+5JBDtH37dm3evFk9e/bUiy++qJ07d2r37t1yu93Ky6tfbhcXF6uysrLRe+bl5cntdqu6ulqlpaXt+GTtx7e3qcJNQRkAACAtzJ49W3PmzJEkTZ48WZMnT27R/U0WlEeMGKHu3bvrjTfeUCwW09SpU9WvX7/kos1hbqddhqSa2rA8LubHAQAAZIJYLCaL5dtmAMMwGhx36NBBs2fP1k033aRYLKbzzjtPdru90XWSGh1/9z2t1iZ/ONhA587uFl3fVoqLPS2+58uv638+efBBByR1fzbI1eduLfKWPHKXHPKWPHKXHPKWHPLWeh9++OE+16vN1WRBedSoUVqxYoX69u2b1AegXnxmnD9IQRkAACBTlJWV6Z133kkcV1VVqaSkJHEcjUZVVlamp556SpK0YcMGdevWTZ06dZLP51M0GpXNZmtwX0lJiXbu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e4w5c+a0d+im+n7ePv30U+OMM84wfD6fEYvFjOuuu8545JFHGt03bdo0Y+XKle0fcBr5fu4MwzCGDRtmVFZW/uB9fOca5y1ux44dxmmnnWb85z//aXQf3zm0Fmvg5LEOTg7r4LbBOrhprIOTwzo4OayBk8c6OHPQobwP69atU9++fVVUVCSXy6VBgwZp1apVifPbtm1TbW2tjj76aEnSiBEjGpzPVcXFxZoyZYocDofsdrsOO+wwffnllw2u2bRpkx544AF5vV5NmzZNdXV1JkWbPj799FNJ0rhx43TWWWfpz3/+c4PzfN+a55ZbblFFRYU6derU4HW+c99aunSppk6dqpKSEknShg0b1L17d3Xr1k15eXnyer2NvlvhcFhvv/22Bg0aJCk3v3/fz5vD4dDUqVPldrtlsVj04x//uNHfdZK0ceNGLVu2TF6vV7/5zW/0zTfftHfopvt+7oLBoL788kv97ne/k9fr1V133aVYLNbgHr5zjfP2XXPmzNEFF1ygQw45pNE5vnNoLdbAyWMdnBzWwW2DdXDTWAcnh3VwclgDJ491cOagoLwPO3bsUHFxceK4pKRElZWV+z1fXFzc4HyuOvzwwxOLvc8++0wvvviiBgwYkDhfU1Ojn/zkJ5o8ebKWLVumPXv26L777jMp2vSxZ88eHX/88br33nv16KOP6sknn9Tf/va3xHm+b01bt26damtrNXjw4Aav851raMaMGerTp0/iuKm/6yRp9+7dcrvdysvLk5Sb37/v561r16464YQTJEnV1dVatGiRTjvttEb3FRcX68orr9Rzzz2nLl26NPoZai74fu527typvn37aubMmVq6dKneeecdPf300w3u4TvXOG9xn332md566y2NHj16n/fxnUNrsQZOHuvg5LAObj3Wwc3DOjg5rIOTwxo4eayDMwcF5X2IxWKyWCyJY8MwGhw3dT7XffLJJxo3bpyuu+66Bv/lqLCwUAsXLtRhhx2mvLw8jRs3Tq+99pp5gaaJn/3sZ5ozZ448Ho86deqkUaNGNcgL37emPfnkk/rlL3/Z6HW+cz+sOd+tfb3G969eZWWlxowZo5EjR+q4445rdP7ee+/Vz3/+c1ksFo0fP15vvPGGCVGml27duunee+9VSUmJnE6nfvGLXzT63yTfuf1bsmSJLrroIjkcjn2e5zuH1mIN3Hqsg1uGdXDrsQ5ODuvg1mEd3DKsgVuPdXD6oaC8D2VlZaqqqkocV1VVNWi3//75nTt37rMdPxe9++67Gjt2rK699lqdc845Dc59+eWXDf4rnGEYif/6lsveeecdrV+/PnH8/bzwffthoVBIb7/9tk499dRG5/jO/bCm/q6TpE6dOsnn8ykaje73mlz073//WxdccIHOOecc/epXv2p03ufz6dFHH00cG4Yhm83WjhGmp48++kgvvfRS4nhf/5vkO7d/a9as0ZAhQ/Z5ju8c2gJr4NZhHdxyrINbh3Vw8lgHJ491cMuxBm491sHph4LyPvTr10/r169XdXW1gsGgVq9erf79+yfOd+3aVfn5+Xr33XclSStWrGhwPld99dVX+tWvfqW5c+dq6NChjc4XFBTo97//vbZu3SrDMLRo0SKdccYZJkSaXnw+n+bMmaO6ujr5/X4tW7asQV74vv2wjz76SIcccohcLlejc3znfthRRx2l//znP/rvf/+raDSq559/vtF3y263q0+fPnrhhRckScuXL8/575/f79ell16qq6++WuPGjdvnNS6XSw899FBip/o///nPfPdUv7ibOXOmvvnmG4XDYS1ZsqRRXvjO7Vt1dbVqa2vVrVu3fZ7nO4e2wBo4eayDk8M6uHVYByePdXByWAcnhzVw67AOTk8UlPehtLRUFRUVGj16tM4++2wNGzZM5eXlmjBhgjZu3ChJmjt3rmbNmqUzzzxTgUBgv3NccsnDDz+suro63X777Ro+fLiGDx+uJ554IpG3Tp06adq0abriiit05plnyjCMff48K9eccsopGjBggM4++2yNHDlSI0eO1M9+9jO+b820detWlZWVNXiN71zz5Ofn6/bbb9evf/1rDRkyRD/60Y905plnSpJuuOEGrVmzRpI0depULV26VEOGDNE777yja665xsSozff0009r586deuSRRxJ/1915552Svs2bzWbT/Pnzdcstt2jw4MF6//33NXnyZJMjN1/Pnj112WWX6cILL9TQoUP1k5/8RMOGDZPEd64pX3zxRaO/6yS+c2hbrIGTxzo4OayDW4d1cPJYByeHdXByWAO3Duvg9GQxDMMwOwgAAAAAAAAAQPqjQxkAAAAAAAAA0CwUlAEAAAAAAAAAzUJBGQAAAAAAAADQLBSUAQAAAAAAAADNQkEZAAAAAAAAANAseWYHAABo6IgjjtCPf/xjWa0N/5vfvffeq4MPPrjNP2v9+vXq1KlTm74vAAAA0FKsgwEgM1BQBoA09Kc//YnFLQAAAHIO62AASH8UlAEgg/zjH//Q3LlzddBBB+nTTz9VQUGBbr/9dh122GHy+Xy69dZbtXnzZlksFp100kn6v//7P+Xl5em9997T9OnTFQwGZbfbdd111+n444+XJN19991677339PXXX+vSSy/VxRdfbPJTAgAAAA2xDgaA9EFBGQDS0JgxYxr81O/ggw/WvffeK0natGmTfvvb36pPnz564oknNHnyZD377LOaPn26ioqKtHLlSoXDYV1xxRX64x//qF/+8pf61a9+penTp+vkk0/Wpk2bdP3112vFihWSpG7dumnq1Kn64IMPdP755+u8886T3W435bkBAACQ21gHA0D6o6AMAGnoh37q17NnT/Xp00eSNHLkSE2bNk27d+/W66+/rieeeEIWi0UOh0MXXHCB/vSnP+mEE06Q1WrVySefLEnq1auXVq5cmXi/YcOGSZJ+8pOfKBQKye/3q2PHjql9QAAAAGAfWAcDQPqzNn0JACCd2Gy2fb4Wi8VksVgSr8ViMUUiEdlstgavS9LHH3+sSCQiScrLq/9vi/FrDMNIVegAAABA0lgHA0B6oKAMABlm8+bN2rx5syRpyZIl+tnPfqYOHTroxBNP1J///GcZhqFQKKSlS5eqX79++tGPfiSLxaK//e1vkqT3339fY8aMUSwWM/MxAAAAgBZhHQwA6YGRFwCQhr4/O06S/u///k8FBQU68MADNX/+fG3btk2dOnXSnDlzJEk33nijpk+fLq/Xq3A4rJNOOkmXX365HA6H7r77bs2cOVNz5syR3W7X3XffLYfDYcajAQAAAPvFOhgA0p/F4DcdAJAx/vGPf+i2227T888/b3YoAAAAQLthHQwA6YORFwAAAAAAAACAZqFDGQAAAAAAAADQLHQoAwAAAAAAAACahYIyAAAAAAAAAKBZKCgDAAAAAAAAAJqFgjIAAAAAAAAAoFkoKAMAAAAAAAAAmoWCMgAAAAAAAACgWf4/0UqD8WSdWA0AAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_base.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Network \n",
+ "We can now explore the functionality of our Hopfield layer Hopfield
. \n",
+ "\n",
+ "As described in the paper the Hopfield layer allows:\n",
+ "- association of two sets\n",
+ "- multiple updates\n",
+ "- variable beta\n",
+ "- changing the dimension of the associative space\n",
+ "- pattern normalization\n",
+ "- static patterns for fixed pattern search\n",
+ "\n",
+ "This time, additional arguments are set to influence the training as well as the validation performance of the Hopfield-based network.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_characters (20) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " hidden_size
\n",
+ " 8 \n",
+ " Size (depth) of the association space. \n",
+ " \n",
+ " \n",
+ " num_heads
\n",
+ " 8 \n",
+ " Amount of parallel association heads. \n",
+ " \n",
+ " \n",
+ " update_steps_max
\n",
+ " 3 \n",
+ " Number of updates in one Hopfield head. \n",
+ " \n",
+ " \n",
+ " scaling
\n",
+ " 0.25 \n",
+ " Beta parameter that determines the kind of fixed point. \n",
+ " \n",
+ " \n",
+ " dropout
\n",
+ " 0.5 \n",
+ " Dropout probability applied on the association matrix. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield = Hopfield(\n",
+ " input_size=latch_sequence_set.num_characters,\n",
+ " hidden_size=8,\n",
+ " num_heads=8,\n",
+ " update_steps_max=3,\n",
+ " scaling=0.25,\n",
+ " dropout=0.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield.output_size * latch_sequence_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield, Flatten(), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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5eUqLy9vsW/ZsmWSpAEDBuiDDz446HVlZWVas2ZNPEtLmsh8uIaAQaAMAACArOb1G8q1W5Vnz5wRdwAAAJkubiMvcHBuR3OI7PUbSa4EAAAASK6GgCEXq5MBAADSCoFygkUemCM/7wMAAACylZdAGQAAIO20K1D2+XySpPfee09r166VYRCGxopAGQAAIH1VV1drxIgRGjZsmFauXNnq+GuvvRYd+3bDDTeooaFBkvT2229r7NixGj16tCZNmqTPP/9ckvTWW29p4MCBGj16tEaPHq2bb745ofeTbL6AITeBMgAAQFppc4byvffeq3/961+64YYbNHXqVPXp00dbtmzRvHnzElFfxonMUPb6m5JcCQAAADqipqZGVVVVWr16tXJzczVu3DgNHDhQffr0kSTt27dPlZWVWrFihfr06aNly5apqqpKs2bN0syZM3X//ferX79+euaZZ3TnnXdq6dKl2rFjh6ZMmaKrrroqyXeXHD6/IU+hI9llAAAAoAPaXKH82muv6c4779TGjRs1cuRIPfbYY4d8mR7alme3KTfHygplAACANLNp0yYNGjRIhYWFcjqdGj58uDZs2BA9/umnn+rII4+MBsxnnHGGXnrpJTU1Nen6669Xv379JEl9+/bVF198IUnavn273nzzTZWXl+vqq6+O7s8WPkZeAAAApJ12jbxwOBzRB2hJampide3hcDntBMoAAABppra2Vh6PJ7pdVFSkmpqa6Hbv3r21a9eu6OKL559/Xrt371Zubq5Gjx4tSQqHw/rNb36js846S5Lkdrt1+eWXq7q6WkOHDlVFRUUC7yi5gqGw/PuDBMoAAABpps2RF127dtXtt9+uHTt26N5779XChQtVVFSUiNoylsthl89PoAwAAJBOwuGwLBZLdNs0zRbbXbp00d13361bb71V4XBYF198sez2r8PSpqYmVVZWKhgMRkdczJ07N3r80ksv1aJFi+T1euV2u9tdV/fursO5rZh4PO2v71D2ehslST09rk75vHSRTffamehbbOhbbOhbbOhbbOhbbOhbcrUZKN99991atWqVHnzwQTkcDlksFt19992JqC1juRysUAYAAEg3JSUl2rp1a3S7rq6uxUKLUCikkpISPf3005Kkbdu26aijjpIkNTQ06JprrlFhYaGWLl0qu92ucDisBx98UFdeeaVsNlv0c775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YWFC7ytRvAcWULgcjLwAAABIpu9+97t64IEHdPvtt+uTTz7RwoULNXfuXPXo0aNd17e5/CEnJ0c//elPNXDgQJ100knR/6DzuB12XsoHAACQ4gYPHqzNmzervr5egUBAGzdu1JAhQ6LHLRaLpkyZopqaGpmmqeXLl2vEiBGy2+0qKyvT+vXrJUlr166NXjd06FCtXbtWkrR+/XqVlZXJbs/MwDUy4o0ZygAAAMlVWVmp733ve5KkXr166aSTTtLNN9/c7uvbDJSPO+44ffjhh7FXiDa5nHZeygcAAJDiiouLVVFRoYkTJ+r888/XqFGjVFpaqmnTpmn79u2yWq2aO3eupk6dqnPOOUddunTRFVdcIUmaPXu2Vq1apREjRmjr1q2aMWOGJOn666/XX//6V40cOVJPPPGEbrvttiTeYXxFAmVWKAMAACTX3r17NXHiRElSXl6eJk+erLq6unZf3+bIi88++0wXXnihjjzySOXl5UX3M0O587gcdjUZYe03Qsqz25JdDgAAAA6hvLy81UtMli1bFv379NNP1+mnn97qul69emnFihWt9hcWFuqBBx7o9DpTUTRQduYmuRIAAIDsFgqFVFNTE30R9O7du1u8O68tbQbKFRUVsVeHdoms0mgIGATKAAAAyEg+f3OgXJDf5r+CAAAAII4mT56s888/X6eddposFos2bdqkm266qd3Xtzny4qSTTlJ+fr4++eQTnXDCCbLb7cxQ7mQuR/MqDa+fsRcAAADITN6AIUdejnJsbf4rCAAAAOJo7NixevTRR3X88cerf//++u1vf9vqV3jfps2nudWrV+vmm2/Www8/LK/Xq2uvvVarVq06rKLRUuTFJD7mKAMAACBD+QKG3MxPBgAASLqamho9+eSTmjx5sk455RRVVVV1aIZym4HyihUr9NRTT8nlcql79+5avXq1fve73x1W0WgpMvKCQBkAAACZyhcw5HISKAMAACTbz3/+c33ve9+T1Pyuj5NOOkm/+MUv2n19m4Gy1WqVy+WKbvfs2VM2G3N+O5OLFcoAAADIcD6/EV1IAQAAgOTZu3evJk6cKEnKy8vT5MmTO3eFcmFhod5//31ZLBZJ0nPPPacjjjgixnJxMJEXk3j9TUmuBAAAAIgPX6CJQBkAACAFhEIh1dTURLd3794t0zTbfX2br1j+xS9+oeuvv17/+te/dOqppyovL0/3339/bNXioGxWqwryc1ihDAAAgIzlDbBCGQAAIBVMnjxZ559/vk477TRJ0ubNm3XTTTe1+/o2A+Vjjz1W69at06effqpQKKRjjjlGdjsPgp3N5bATKAMAACAjNRkhNRnh6MuoAQAAkDxjx45V//799ac//Uk2m03f/e539dhjj6m8vLxd17c58kKSbDabjj32WC1atIgwOU5cTgJlAAAAZKbIcy4rlAEAAFJDz5491dTUpIcffli/+93voquV26PNFcrfVFtb2+Hi0D5uR67q9zUmuwwAAACg0xEoAwAApIZPPvlEv/vd7/Tcc8+pV69eamxs1CuvvCK3293uz2jXCuWIjgxnRscUOHLkZYUyAAAAMpCXQBkAACDprrzySl122WWy2+167LHH9L//+78qKCjoUJgsdTBQnj59eoc+HO3nduTKFzAI7QEAAJBxfP4DgbIzN8mVAAAAZK/33ntPP/jBD3Tcccfp6KOPliRZLJYOf06bgfLu3bv18ssvS5LefvttTZo0SR988EGHvwjfzuW0ywiG1WSEk10KAAAA0KkiIy/crFAGAABImldffVUXXHCB/vd//1ennnqqpk+frv3793f4c9oMlCsrK/XZZ59p8+bNeuONNzR69GjdeeedMRWNQ4v8/M8baEpyJQAAAEDnigTKBY4OvcIFAAAAnSgnJ0cjRozQihUrtHr1ahUVFWn//v0aNmyYfv/737f7c9oMlL/88ktNnjxZr7/+ukaNGqUxY8YoEAgcVvFoLbJaoyEQTHIlAAAAQOfy+Q0583Jks3Zo4h4AAADipE+fPpo1a5Zef/11XXHFFVq1alW7r23zic4wDBmGoTfeeEODBw9WIBCQ3+8/rILRmsvJCmUAAABkJm+gKfq8CwAAgNThcDh0ySWXaM2aNe2+ps1A+cwzz9TJJ5+srl27qn///rrooos0atSowyoUrUVGXkReWAIAAABkCl/AYH4yAABAhmhziNn06dN18cUXq7i4WJK0cOFC9evXL+6FZZuvZygTKAMAACCz+AKGurrykl0GAAAAOkGbK5R3796td999VxaLRb/61a80f/58ffDBB4moLasU5NtlESuUAQAAkHl8ASO6gAIAAADprc1AubKyUp999pk2b96sN954Q6NHj9add96ZiNqyitVqUYHDHn0DNgAAAJApfH6DGcoA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+vTpEz1n5syZuvPOO3XCCSfoF7/4hVatWqXx48drx44dqqys1KhRo+JVXtpyOXJZoQwAAICU4N8flGl+/a4PAAAAZL64rVDetGmTBg0apMLCQjmdTg0fPlwbNmyIHv/888/V2NioE044QZI0ZsyY6PHt27drzZo1Ki8v14033qivvvoqXmWmHZfDzgxlAAAApATvgZdFs0IZAAAge8QtUK6trZXH44luFxUVqaam5pDHPR5P9LjH49G1116r5557Tj179tTcuXPjVWbacTnsrFAGAABASvAdWOjADGUAAIDsEbeRF+FwWBaLJbptmmaL7W87vmTJkuj+qVOn6uyzz+7Qd3fv7oq17MPi8bjj/h1F3Qv0l7/VJeS7EiWT7iWR6Fts6Fts6Fts6Fts6Fts6BuSIbLQgZEXAAAA2SNugXJJSYm2bt0a3a6rq1NRUVGL43V1ddHt3bt3q6ioSF6vV88++6wmT54sqTlottlsHfruPXt8CofNw7uBDvJ43Kqr88b9e2wy1dgU0s4vvpQ9p2N9SUWJ6lumoW+xoW+xoW+xoW+xoW+xoW8dY7VakrYAIdNEVigz8gIAACB7xG3kxeDBg7V582bV19crEAho48aNGjJkSPR4r169lJeXp7fffluStG7dOg0ZMkROp1MPP/yw3nnnHUnS448/3uEVypkssvrDFwgmuRIAAABku69HXuQmuRIAAAAkStxWKBcXF6uiokITJ06UYRgaO3asSktLNW3aNE2fPl0DBgzQwoULNWvWLPl8Pv3gBz/QxIkTZbPZtHjxYt1+++1qbGxU7969tWDBgniVmXZc+c2BstffpK7uvCRXAwAAgGzmDRjKsVmVa4/bOhUAAACkmLgFypJUXl6u8vLyFvuWLVsW/btfv3565plnWl1XVlamNWvWxLO0tOWOrlDmxXwAAABILp/fkNtpb/FuFAAAAGQ2lhKkmch8OgJlAACAxKuurtaIESM0bNgwrVy5stXxd999VxdeeKHOO+88XXXVVdq3b58k6e2339bYsWM1evRoTZo0SZ9//rkk6a233tLAgQM1evRojR49WjfffHNC7+dw+QIG85MBAACyDIFymnE5m+fTef0EygAAAIlUU1OjqqoqPfHEE1q7dq2eeuopffzxxy3OmTdvnqZPn67nnntOxxxzjB555BFJ0syZM3XnnXdq3bp1Ki8v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i4mJ0fr1613G0G+YKHKvNeRea8i940fuHT9yrzXkXmvIvdaQeycJA7f9+uuvZsmSJaarq8ucP3/epKSkmOPHjztdk5SUZL755htjjDG5ubmmoqLCAzP1LvX19Wb16tWmv7/fDAwMmPT0dLN7926na9avX2++/vprD83QO9ntdhMbG2sGBwdHvIZ+G92xY8dMfHy8+e2335zO029/+fbbb01ycrK54YYbTGtrq+nt7TVxcXHmp59+MoODgyYzM9N8/vnnLuPWrVtn6urqjDHGvPHGG6a4uPjfnrpHDV23lpYWEx8fb7q7u43dbjc5OTlm69atLuPy8/NNbW3tvz9hLzF03YwxJjk52bS3t486jn5zXbc/nT592ixdutScOHHCZZyv9xsmhtxrDbnXGnLvxJF7x0butYbcaw251xpy7+TBE8rjsG/fPsXExGj69OkKDg7WsmXL9Mknnzjqp06dUl9fn2655RZJ0t133+1U91WhoaF69tlnFRgYqICAAEVERKitrc3pmqamJr311ltKSUlRfn6++vv7PTRb79HS0iJJyszM1F133aXy8nKnOv02ts2bN2vjxo0KCQlxOk+//aW6ulp5eXkKCwuTJH333Xe69tprFR4eLn9/f6WkpLj01eDgoA4cOKBly5ZJ8s3eG7pugYGBysvL07Rp02Sz2TR37lyX+5wkHT58WDU1NUpJSdHTTz+ts2fP/ttT96ih69bb26u2tjY999xzSklJ0euvvy673e40hn5zXbf/r7i4WGlpaZo9e7ZLzdf7DRND7rWG3GsNuXfiyL1jI/daQ+61htxrDbl38mBDeRxOnz6t0NBQx3FYWJja29tHrIeGhjrVfdV1113nCH8nT57Uxx9/rLi4OEf9/PnzioyMVHZ2tmpqanTu3Dm9+eabHpqt9zh37pzmz5+vsrIybdu2TTt27FB9fb2jTr+Nbt++ferr69Py5cudztNvzl5++WVFR0c7jse6z0lSV1eXpk2bJn9/f0m+2XtD123mzJlauHChJKmzs1MVFRVaunSpy7jQ0FA99thj+vDDD3X11Ve7fCz1v27ounV0dCgmJkaFhYWqrq5WY2Ojdu7c6TSGfnNdtz+dPHlSX331ldLT04cd5+v9hokh91pD7rWG3Dsx5F73kHutIfdaQ+61htw7ebChPA52u102m81xbIxxOh6r7uuOHz+u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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_adapted.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Pooling \n",
+ "\n",
+ "The previous examples manually downprojected the result of Hopfield
by applying a linear layer afterwards. It would've also been possible to apply some kind of pooling . Exactly for such use cases, the module HopfieldPooling
might be the right choice. Internally, a state pattern is trained, which in turn is used to compute pooling weights with respect to the input."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_pooling = HopfieldPooling(\n",
+ " input_size=latch_sequence_set.num_characters)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_pooling.output_size, out_features=1)\n",
+ "network = Sequential(hopfield_pooling, output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Pooling "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABZQAAAHsCAYAAABFbSiOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACG9klEQVR4nOzdeXxU9dn///eZLZnJDIYlC1IrVqzUQrQ2tyAiuIIsI0pxQ4sUwe22aH5Ki3UBcStWjEtdKrZaFReqLNIq4lK3G1rBbyvgWrXWBQmBIMxkJpkzM+f3RzKDacAkQ2ZLXs/H3cedM+ecmet8kvt+HN695jqGZVmWAAAAAAAAAABogy3bBQAAAAAAAAAA8gOBMgAAAAAAAACgXQiUAQAAAAAAAADtQqAMAAAAAAAAAGgXAmUAAAAAAAAAQLsQKAMAAAAAAAAA2oVAGQAAAAAAAADQLo5sF5AO27fXKx63MvqZvXt7tW1bMKOf2RWwbqlh3VLDuqWGdUsN65Ya1i01rFvH2GyGevYsynYZnSbT9778vaWOtUsN65Ya1i01rFtqWLfUsG6pYd3aL133vV0yUI7HrYwHyonPRcexbqlh3VLDuqWGdUsN65Ya1i01rFv3lY17X/7eUsfapYZ1Sw3rlhrWLTWsW2pYt9SwbtnFyAsAAAAAAAAAQLsQKAMAAAAAAAAA2qVLjrwAAABAa7FYVNu31yoajWS7lIxwOFzq2bNEdju3vAAAAEBn4e4aAACgm9i+vVaFhR4VFZXLMIxsl5NWlmWpvn6ntm+vVZ8+fbNdDgAAANBlMPICAACgm4hGIyoq6tHlw2RJMgxDRUU9uk03NgAAAJApBMoAAADdSHcIkxO607UCAAAAmUKgDAAAAAAAAABoFwJlAAAAZFwwGNSVV17R7uPff/9d/frX16exIgAAAADtwUP5AAAAkHGBwE79618ftPv4gQMP0ezZh6SxIgAAAADtQaAMAACAjLv99t9o69ZaXXnlFfrPf/6tffYpVkFBgW688RbdfPP1qq3doq1ba1VZeYRmz75G//jHW/rDH+7Xb397vy655HwdcsgP9fbb/9TXX2/XZZfN0pFHHpXtSwIAAAC6BQJlAACAbuj/NnylN9Z/lZb3Hl7RV0cN7vutx1x22Sz9/OcXaObM/0+nnXay/vSnu9S377564YWVOuig7+uGG+bLNE2dc85p+uCD91udb5pR/e53D+qNN17TwoX3EigDAAAAGUKgDAAAgKzq2bOX+vbdV5J04okn6d13N2rx4sf06af/1o4dOxQOh1qdM2TIkZKk733vQAUCOzNaLwAAANCdESgDAAB0Q0cNbruLOFMKCgqSPz/11BN65ZWXdfLJp2rSpCP0739/LMuyWp3jcrkkSYZh7HY/AAAAgPSwpfPNV6xYobFjx2rUqFFatGjRHo975ZVXdNxxxyW3N23apLPPPlsnnXSSLrroItXX16ezTAAAAGSY3W5XLBZr9fratX/XySdP1KhRYxSJRPSvf32oeDyehQr3LBgMavz48friiy9a7Xvvvfc0ceJEjR49WldddZWi0aikPd/f7ty5U+eff77GjBmjs88+W7W1tRm9FgAAAKCj0hYo19TUqLq6Wo899piWLVumJ598Uh999FGr47Zu3ar58+e3eO26667T5MmTtXLlSg0aNEj33HNPusoEAABAFvTq1VtlZeW66abrWrx++umT9eCD92vKlDN0xx0LNGhQhb76alOWqmzt7bff1llnnaVPP/10t/tnzZqla6+9Vs8//7wsy9LixYsl7fn+9vbbb1dlZaWee+45nXbaabrxxhszdSkAAABAStIWKK9evVpDhw5VcXGxPB6PRo8erZUrV7Y67uqrr9Yll1yS3DZNU2vXrtXo0aMlSRMnTtzteQAAAMhfDodD9933B9111+/01FMrkq//+Mf/o8cfX6KHH35S9977e91++z3y+0/R4YdX6re/vV+S9Nvf3q/DD6+UJPXtu2+L89Nt8eLFmjNnjkpLS1vt+/LLL9XQ0KDDDjtM0q772G+7v33llVfk9/slSePHj9drr70m0zQzczEAAABACtI2Q3nLli0qKSlJbpeWlmr9+vUtjnn44Yd1yCGH6NBDD02+tn37dnm9XjkcTaWVlJSopqYmXWV2imf+79/63n49Nei7xdkuBQAAAGn0bR3E/33/m7iP/bb722+e43A45PV6VVdXp7KysjRexd7Z9Mi1Ms1oq9c9/islSQ2rFym+7bNW+wuOnCx7n/1lfvC6zA/faLXf+f3hch58tGJb/6PGNY+12m/02k+/2zRYdTsbdEZs+W5re9I+QZJ0bPwNlVrbWu3/q+0obTH66Ifx9zXI+qDV/o3GwXrHNlCl1lYdG/+/Vvu3GL31V9twSUqpBsOQXjayW4OU/XXoaA3HWf+n/x6V3h3XoaM1GIZkWaxDR2uoMD7UD6LvZbWGXFiHjtaQ+Hvr7uvQ0RocDruOjrza7dehozUk/t6yWcM3tbcGl9OuGeMPUVkvz27ryCdpC5Tj8bgMw0huW5bVYvvDDz/UqlWr9NBDD2nz5s17PE5Sq+229O7tTbHq1Kz/pE5fbgvp2B/vl9HP7SpKSnzZLiEvsW6pYd1Sw7qlhnVLDeuWmvas25YtNjkcaX2ERs6x2WwZ+5va0/1vR+5vLcuSzdax31Gm7303SXI6W/8zIrHOW90uRXazv2fPIhWU+BTYVKjAbvb7fIXylfjUGCvStt3sj9ntWv/xNg34zj4qjNp3W9t+JT2a3utrlwrN1seU7VOkAlcP9a53qzDUen9vj1v7FfVQcSSswh2t9/ucLu1X3PQZhbXUkKkaCnKghlxYB2rITA3F9QVZryEX1oEaqIEaOr+GAqddfct7qPc+7t3WkU8MK02PxV66dKnWrVuX7OK4++67ZVlWcrzFnXfeqb/85S8qLCyUaZr67LPPVFFRoT/+8Y8aMmSI1q5dK7vdrq+++krnnHOOXnrppXZ/9rZtQcXjmXva94In/qGoJf3yrB9l7DO7ipISn2prA9kuI++wbqlh3VLDuqWGdUsN65aa9q7b5s3/UXn5/hmoKHfs7pptNmOvQ9jjjjtODz/8sL7zne8kX/vyyy81depUvfDCC5KkdevW6c4779Tvf//7Pd7fHnfccXrsscdUXl6uaDSqI444Qn//+9/ldDrbXUum732z9X+n/9kc0HUPrdUlEwfr8O+XtH1CDuL/x6WGdUsN65Ya1i01rFtqWLfUsG7t1xn3vbt9305/x2bDhg3TmjVrVFdXp3A4rFWrVmnEiBHJ/TNnztTzzz+v5cuX6/7771dpaakee+wxOZ1OVVZW6tlnn5UkLVu2rMV5uajI7dTO+ki2ywAAAEAW9evXTwUFBXrrrbckScuXL9eIESO+9f525MiRWrZsmSTp2WefVWVlZYfC5O4kEG663/a6WR8AAIBsSlugXFZWpqqqKk2ZMkWnnHKKxo8fr4qKCs2YMUMbNmz41nPnzJmjxYsXa+zYsVq3bp0uu+yydJXZKXxuF4EyAABAN/XN+9tbb71VN998s0466SSFQiFNmTJF0p7vby+99FL985//1Lhx4/TYY4/p2muvzdZl5LxguOlhhQTKAAAA2ZW2GcqS5Pf7k0+tTli4cGGr477zne/o5ZdfTm7369dPjzzySDpL61Rej1P1YVOxeFz2Ds68AwAAQP755r3rN+9vBw4cqKeeeqrV8Xu6vy0uLtZ9992XniK7mGCoOVD2ECgDAABkE+lnJ0h0SdSHWz/tGgAAAMDeC4ZNGZKKCtPaEwMAAIA2ECh3Al9zl0Sg+Wt4AAAAyIzf//53+v3vf5ftMpABgbApT6GDbwQCAABkGXdjnSDRoRwMMUcZAAAASIf6sMn8ZAAAgBzA98U6QTJQpkMZAADkkdCKm3f7usd/pSSpYfUixbd91mp/wZGTZe+zv8wPXpf54Rt7PL89HnnkIf31ry8oFotryJChikajKikp01lnnSNJuuqqWRo1aqz2228/VVf/RuFwWNu31+mnP52qU06Z1O7PQf4LhEzmJwMAAOQAOpQ7gc/jksTICwAAgI74299W64MP3tPChQ/rwQcXqba2Vj167KMXX3xekhQK1Wvjxg0aNmy4VqxYrnPPPU8PPPCw7rzzPt19951Zrh6ZFgyb8rld2S4DAACg26NDuRN43U3LmHjyNAAAQD5oq5O4cNjZ37rfefDRch58dMqfv27dm3r33Y0677yfSpIaGxtUVlauSKRRX3zxuTZseFtHHXW0nE6nLrnkMv3972v0yCMP6uOPP1I4HEr5c5GfgmFT+5f5sl0GAABAt0eg3AmcDrsKXXZGXgAAAHRAPB7T6aefpTPPbBpvEQgEZLfbVVTk1UsvrdLGjet1zjlTJUnXXjtbPl8PHXXU0Tr++FHJLmZ0D5ZlNY28YIYyAABA1jHyopP0KHIpQIcyAABAux1++P/o+eefVSgUUjQa1ZVXXq5XXnlJo0adpJdffkFffPG5KioOkyStXfumpk+/UEcffYz+9rfVkqRYLJbF6pFJETOuaCzODGUAAIAcQIdyJ+lR5FJ9A4EyAABAew0fPkIfffShzj9/quLxmIYMGaYxY8bLMAzts0+xfvjDwTIMQ5I0bdoMXXTRdBUUuHTggQepb9999dVXm7J8BciUQDgiSXQoAwAA5AAC5U7So6hA23c2ZLsMAACAvDJ16nRNnTq91et33nlfi+0zzzwnORrjm84774K01YbckRgt5yNQBgAAyDpGXnSSHkUuBZs7JwAAAAB0nsTDr4sIlAEAALKOQLmTNAXKjLwAAAAAOluyQ5kZygAAAFlHoNxJehS5FG6MKRqLZ7sUAACAPbIsK9slZEx3utauLtAcKDNDGQAAIPsIlDuJr8glSXQpAwCAnGWz2RWLRbNdRsbEYlHZbPZsl4FOEAyZMiQVFRIoAwAAZBuBcifpkQiUQwTKAAAgN7ndXgUCX8uyuv43qiwrrkBgu9xub7ZLQScIhk0VuZ2y2YxslwIAANDtObJdQFeRCJQDdCgDAIAc5fXuo+3ba1VT84Wkrj4OwpDLVSivd59sF4JOEGgOlAEAAJB9BMqdpEdRgSSpnkAZAADkKMMw1KtXabbLADqsPmzKR6AMAACQExh50UnoUAYAAADSIxAyeSAfAABAjiBQ7iQ+T2KGciTLlQAAAABdSzAckddDoAwAAJALCJQ7idNhk7vATocyAAAA0Iksy1IwTIcyAABAriBQ7kRFhU4FCZQBAACATtNoxhSNWcxQBgAAyBEEyp3I53EqGCJQBgAAADpL4v6aDmUAAIDcQKDcibxuFyMvAAAAgE6UuL9mhjIAAEBuIFDuRF63U/UEygAAAECnSYyU87ldWa4EAAAAEoFyp/J5nHQoAwAAAJ0oESgXuR1ZrgQAAAASgXKn8rqdaozEZEZj2S4FAAAA6BISM5R9HjqUAQAAcgGBcidKzHULhqNZrgQAAADoGgJhU4YheQroUAYAAMgFBMqdyNf85OlAKJLlSgAAAICuIRg2VVTolM1mZLsUAAAAiEC5U3ndiQ5l5igDAAAAnSEYiiTvswEAAJB9BMqdiEAZAAAA6FzBsJkcLQcAAIDsI1DuRN7mB4UEQgTKAAAAQGcIhs3kaDkAAABkH4FyJyoqbHpQSD0dygAAAECnCIRNRl4AAADkEALlTuSw2+QpcChAoAwAAADsNcuyFAwx8gIAACCXECh3Mq/HyQxlAAAAoBM0RGKKxS06lAEAAHIIgXIn87mdCoYi2S4DAAAAyHuJRg0CZQAAgNxBoNzJvG4nIy8AAACATpAIlH1uV5YrAQAAQAKBcifzuhl5AQAAAHSGQKi5Q5kZygAAADmDQLmTeT1OBUMEygAAAMDeCoabRskx8gIAACB3ECh3Mq/bqUg0rkYzlu1SAAAAgLwWDEclESgDAADkEgLlTubzNM13q2fsBQAAALBXguGIDEPyFDqyXQoAAACaESh3skT3RICxFwAAAMBeCYZMed1O2Qwj26UAAACgGYFyJ0sEyjyYDwAAANg7gbDJuAsAAIAck9ZAecWKFRo7dqxGjRqlRYsWtdr/wgsvyO/3a9y4cZo9e7YikaaHbixdulTDhw/XhAkTNGHCBFVXV6ezzE7la34CdaD5ASIAAAAAUlNPoAwAAJBz0jaMrKamRtXV1VqyZIlcLpfOPPNMDRkyRAMGDJAkhUIhzZs3T0uXLlWfPn1UVVWlpUuX6owzztDGjRs1e/ZsjR8/Pl3lpU2yQ5mRFwAAAMBeCYRNlRa7s10GAAAAviFtHcqrV6/W0KFDVVxcLI/Ho9GjR2vlypXJ/R6PRy+//LL69OmjcDisbdu2qUePHpKkDRs2aOnSpfL7/briiiu0Y8eOdJXZ6YoKnTLEyAsAAABgbwVDZvIbgAAAAMgNaetQ3rJli0pKSpLbpaWlWr9+fYtjnE6nXn31Vf3iF79QaWmphg8fLkkqKSnRtGnTdPjhh+u2227TvHnztGDBgnZ/du/e3s65iA4qKfFJkrwep6LWrm18O9YpNaxbali31LBuqWHdUsO6pYZ1Q1djWZaCYVNetyvbpQAAAOAb0hYox+NxGd94GrNlWS22E0aOHKm///3vuu222zR37lwtWLBAd999d3L/9OnTdeKJJ3bos7dtCyoet1IvPgUlJT7V1gYkSZ5Cp2rrQslt7Nk31w3tx7qlhnVLDeuWGtYtNaxbali3jrHZjKw1IKD9wo0xxeIWM5QBAAByTNpGXpSXl6u2tja5XVtbq9LS0uT2119/rTfeeCO57ff79cEHHygQCOihhx5Kvm5Zlux2e7rKTAuf28nICwAAAGAvBBua7qcJlAEAAHJL2gLlYcOGac2aNaqrq1M4HNaqVas0YsSI5H7LsjRr1ixt2rRJkrRy5Uodfvjh8ng8euCBB/T2229Lkh599NEOdyhnm5dAGQAAoEtasWKFxo4dq1GjRmnRokWt9r/66qvy+/3y+/26/PLLVV9fr23btmnChAnJ/xx33HH60Y9+JEl68803NWTIkOS+K6+8MtOXlLMSD7n2MkMZAAAgp6Rt5EVZWZmqqqo0ZcoUmaapSZMmqaKiQjNmzNDMmTM1ePBgXX/99brgggtkGIYGDBig6667Tna7Xbfffrvmzp2rhoYG9e/fX7fccku6ykwLr8ep/9TwtVMAAICupKamRtXV1VqyZIlcLpfOPPNMDRkyRAMGDJAk7dy5U7Nnz9YjjzyiAQMGaOHChaqurtbVV1+t5cuXS2oaC3fuueeqqqpKkrRx40ZNmzZNF1xwQdauK1cFwxFJTd/+AwAAQO5IW6AsKdmd8U0LFy5M/nzCCSfohBNOaHVeZWWlli5dms7S0srndioQMvc4NxoAAAD5Z/Xq1Ro6dKiKi4slSaNHj9bKlSt1ySWXSJI+/fRT7bvvvsmA+dhjj9X06dN19dVXJ9/j6aefltvtTt4jb9iwQVu3btWf//xn9evXT3PmzFHfvn0ze2E5KkCHMgAAQE5K28iL7szrcSoai6vRjGW7FAAAAHSSLVu2qKSkJLldWlqqmpqa5Hb//v21efNmvf/++5Kk5557Tlu3bk3uj8Viuu+++3T55ZcnX/P5fPrpT3+qFStWaOTIkcnOZUj1YWYoAwAA5KK0dih3V97CppveYMhUoYslBgAA6Ari8XiLb5/997fRevToofnz5+uaa65RPB7X6aefLqdzVxj6+uuvq3///jr44IOTr82bNy/581lnnaUFCxYoEAjI5/O1u67evb2pXlLKSkraX1+qYoYhm83Qd/v1lM3Wdb71l4m164pYt9Swbqlh3VLDuqWGdUsN65ZdpJ1pkPhaXiBsqk+xO8vVAAAAoDOUl5dr3bp1ye3a2lqVlpYmt2OxmMrLy/WnP/1JkrR+/Xrtt99+yf0vvviixo4dm9yOx+P63e9+p/PPP192uz35+jd/bo9t24KKx60OX0+qSkp8qq1N//NCtmyrl7fQoW3bgmn/rEzJ1Np1Naxbali31LBuqWHdUsO6pYZ1az+bzUhL8wEjL9LA53ZJkoLNX9MDAABA/hs2bJjWrFmjuro6hcNhrVq1SiNGjEjuNwxD06ZNU01NjSzL0kMPPdQiQP7nP/+pysrK5LbNZtMLL7yg559/XpK0bNkyHXroofJ4PJm7qBwWDJnyelzZLgMAAAD/hUA5DRIdygTKAAAAXUdZWZmqqqo0ZcoUnXLKKRo/frwqKio0Y8YMbdiwQTabTfPmzdP06dN10kknqUePHjrvvPOS53/++ecqLy9v8Z7z58/Xww8/rHHjxunpp5/WDTfckOnLylnBsClvIV+oBAAAyDXcoaVB4sEhwRCBMgAAQFfi9/vl9/tbvLZw4cLkz8ccc4yOOeaY3Z779ttvt3rtoIMO0hNPPNGpNXYVwbCpsl50awMAAOQaOpTTwFPokGE0zVAGAAAA0HGBsJls1AAAAEDuIFBOA5thyOt2MvICAAAASIFlWQqGTPk8BMoAAAC5hkA5Tbxup4KhSLbLAAAAAPJOuDGquGWpqJBAGQAAINcQKKcJHcoAAABAahL30XQoAwAA5B4C5TTxup3MUAYAAABSkLiPZoYyAABA7iFQThOfx6lgiEAZAAAA6KjEfbSXDmUAAICcQ6CcJl63S8GwKcuysl0KAAAAkFeSIy/oUAYAAMg5BMpp4nU7FYtbaojEsl0KAAAAkFeCjLwAAADIWQTKaZJ4gAhzlAEAAICOCYZN2QxD7gJHtksBAADAfyFQTpNENwVzlAEAAICOCYRMeT1OGYaR7VIAAADwXwiU0yQZKIcjWa4EAAAAyC/BsMn8ZAAAgBxFoJwmiSdSB+hQBgAAADokGIqoiEAZAAAgJxEop4kv2aFMoAwAAAB0RLAhSocyAABAjiJQThN3gUM2wyBQBgAAADooGIokv/EHAACA3EKgnCaGYcjrcRIoAwAAAB0QtywFw9HkM0kAAACQWwiU08jndirIDGUAAACg3cKNUcUti5EXAAAAOYpAOY28bqcCdCgDAAAA7Zb4hh8P5QMAAMhNBMppxMgLAAAAoGMS3/DzMUMZAAAgJxEop5HX7VQwFMl2GQAAAEDeSHzDz+t2ZbkSAAAA7A6Bchp53U4Fw00z4AAAAAC0LdGh7KVDGQAAICcRKKeRz+1U3LIUboxmuxQAAAAgLyRGxnkLCZQBAAByEYFyGiW6KpijDAAAALRPMGzKbjPkLrBnuxQAAADsBoFyGiXmviW+tgcAAADg2wXDEXndThmGke1SAAAAsBsEymmUeDJ1gA5lAAAAoF0CIZP5yQAAADmMQDmNvO7mkRd0KAMAAADtEgyb8rkJlAEAAHIVgXIaJQNlOpQBAACAdgmGTRURKAMAAOQsAuU0KnTZZbcZCoQj2S4FAAAAyAt0KAMAAOQ2AuU0MgxDXo+TkRcAAABAO8QtS8EwM5QBAAByGYFymvncTkZeAAAAAO0QaojKsiSv25XtUgAAALAHBMpp5iVQBgAAANqlvvm+2et2ZLkSAAAA7AmBcpp5PS4CZQAAAKAdAslAmQ5lAACAXEWgnGY+t1MBZigDAAAAbUo8e8THDGUAAICcRaCcZl63U/UNpuJxK9ulAAAAADktEI5IarqHBgAAQG4iUE4zr8cpy5JCjdFslwIAAADktGBy5AWBMgAAQK4iUE6zxM1wIBTJciUAAABAbguGTdlthgpd9myXAgAAgD1Ia6C8YsUKjR07VqNGjdKiRYta7X/hhRfk9/s1btw4zZ49W5FIU+i6adMmnX322TrppJN00UUXqb6+Pp1lppWvOVDmwXwAAADAtwuGTHk9ThmGke1SAAAAsAdpC5RrampUXV2txx57TMuWLdOTTz6pjz76KLk/FApp3rx5evDBB/WXv/xFjY2NWrp0qSTpuuuu0+TJk7Vy5UoNGjRI99xzT7rKTDtv8wNFgjyYDwAAAPhWwbCZbMgAAABAbkpboLx69WoNHTpUxcXF8ng8Gj16tFauXJnc7/F49PLLL6tPnz4Kh8Patm2bevToIdM0tXbtWo0ePVqSNHHixBbn5RsvHcoAAABAuwTCJvOTAQAAclzaAuUtW7aopKQkuV1aWqqampoWxzidTr366qs65phjtH37dg0fPlzbt2+X1+uVw+GQJJWUlLQ6L5/43C5JBMoAAABAW+oJlAEAAHKeI11vHI/HW8w+syxrt7PQRo4cqb///e+67bbbNHfuXP3iF79odVxHZ6j17u1Nrei9VFLia/WaZVlyOWyKydjtfux+3dA21i01rFtqWLfUsG6pYd1Sw7qhKwiETHk9rmyXAQAAgG+RtkC5vLxc69atS27X1taqtLQ0uf31119r48aNGj58uCTJ7/erqqpKvXr1UiAQUCwWk91ub3Vee2zbFlQ8bnXOhbRTSYlPtbWB3e4rcju1ZVv9Hvd3Z9+2btgz1i01rFtqWLfUsG6pYd1Sw7p1jM1mZK0BAXsWj1uqb6BDGQAAINelbeTFsGHDtGbNGtXV1SkcDmvVqlUaMWJEcr9lWZo1a5Y2bdokSVq5cqUOP/xwOZ1OVVZW6tlnn5UkLVu2rMV5+cjndjLyAgAAAPgWocaoLEs8lA8AACDHpS1QLisrU1VVlaZMmaJTTjlF48ePV0VFhWbMmKENGzaoZ8+euv7663XBBRfo5JNP1r///W/NmjVLkjRnzhwtXrxYY8eO1bp163TZZZelq8yMKHI7FQhHsl0GAAAAkLMCoab7Za+HQBkAACCXpW3khdQ0xsLv97d4beHChcmfTzjhBJ1wwgmtzuvXr58eeeSRdJaWUT6PU//Z3JDtMgAAAICcVR+OShIjLwAAAHJc2jqUsYuXkRcAAADAt0p8o49AGQAAILcRKGeA1+1UqCGqWDye7VIAAACAnBQMNTVgMEMZAAAgtxEoZ4DP45Ilqb4hmu1SAAAAgJyU+EYfM5QBAAByG4FyBiS+tpfougAAAADQUjBsymE3VOC0Z7sUAAAAfAsC5QxIdFkwRxkAACC/rVixQmPHjtWoUaO0aNGiVvtfffXV5IOpL7/8ctXX10uSli5dquHDh2vChAmaMGGCqqurJUk7d+7U+eefrzFjxujss89WbW1tRq8nlwTCprxupwzDyHYpAAAA+BYEyhngLWwKlAN0KAMAAOStmpoaVVdX67HHHtOyZcv05JNP6qOPPkru37lzp2bPnq3q6mqtWLFCAwcOTAbHGzdu1OzZs7V8+XItX75cVVVVkqTbb79dlZWVeu6553TaaafpxhtvzMq15YJgyJTX7cp2GQAAAGgDgXIG+JIdypEsVwIAAIBUrV69WkOHDlVxcbE8Ho9Gjx6tlStXJvd/+umn2nfffTVgwABJ0rHHHqsXX3xRkrRhwwYtXbpUfr9fV1xxhXbs2CFJeuWVV+T3+yVJ48eP12uvvSbT7J5NCMGwmbxvBgAAQO4iUM6AIjcjLwAAAPLdli1bVFJSktwuLS1VTU1Ncrt///7avHmz3n//fUnSc889p61bt0qSSkpKdPHFF+uZZ55R3759NW/evFbv6XA45PV6VVdXl6lLyimJkRcAAADIbY5sF9AdFDjtcjltjLwAAADIY/F4vMV8X8uyWmz36NFD8+fP1zXXXKN4PK7TTz9dTmdTQHr33Xcnj5s+fbpOPPHE3X6GZVmy2TrW89G7t7dDx3eGkhJfp79nqCGqPr08aXnvXNLVry9dWLfUsG6pYd1Sw7qlhnVLDeuWXQTKGeJzO1VPhzIAAEDeKi8v17p165LbtbW1Ki0tTW7HYjGVl5frT3/6kyRp/fr12m+//RQIBPT0009r6tSpkppCY7vdLqmpy3nr1q0qLy9XNBpVfX29iouLO1TXtm1BxePW3l1cB5SU+FRbG+jU94zHLQVDETmkTn/vXJKOtesOWLfUsG6pYd1Sw7qlhnVLDevWfjabkZbmA0ZeZIjX7VKAQBkAACBvDRs2TGvWrFFdXZ3C4bBWrVqlESNGJPcbhqFp06appqZGlmXpoYce0tixY+XxePTAAw/o7bffliQ9+uijyQ7lkSNHatmyZZKkZ599VpWVlcmu5u6kvsGUJcnLDGUAAICcR4dyhng9TmYoAwAA5LGysjJVVVVpypQpMk1TkyZNUkVFhWbMmKGZM2dq8ODBmjdvnqZPn65IJKIjjzxS5513nux2u26//XbNnTtXDQ0N6t+/v2655RZJ0qWXXqrZs2dr3Lhx8vl8uvXWW7N8ldmRuE/2MUMZAAAg5xEoZ4jP7VTt9nC2ywAAAMBe8Pv98vv9LV5buHBh8udjjjlGxxxzTKvzKisrtXTp0lavFxcX67777uv0OvNNIlDmoXwAAAC5j5EXGVLkdjLyAgAAANiNYPPDqxl5AQAAkPsIlDPE53Yq3BhVNBbPdikAAABATgnQoQwAAJA3CJQzJNFtUU+XMgAAANDCrhnKrixXAgAAgLYQKGdIotuCsRcAAABAS8GwKafDJpeTf54AAADkOu7YMiTxxGo6lAEAAICWgiFTXrdThmFkuxQAAAC0gUA5Q7yepq/vBUIEygAAAMA3BcMm85MBAADyBIFyhiRukIN0KAMAAAAtBMIRAmUAAIA8QaCcIcxQBgAAAHYvGDLl8xAoAwAA5AMC5QxxOmwqcNkVZOQFAAAA0EIwbKqIDmUAAIC8QKCcQT63U8FwJNtlAAAAADkjFo8r1BBNPsQaAAAAuY1AOYO8bicjLwAAAIBvqG+IypKYoQwAAJAnCJQzyOtxqp5AGQAAAEhKjITzMkMZAAAgLxAoZ5DP7VSAGcoAAABAUrC54YIOZQAAgPxAoJxBXrcrecMMAAAAYFeg7HO7slwJAAAA2oNAOYO8HqcaIjGZ0Xi2SwEAAAByAh3KAAAA+YVAOYMST66mSxkAAABoEghFJDFDGQAAIF8QKGeQl0AZAAAAaCEYNuVy2FTgtGe7FAAAALQDgXIGJQPl5i4MAAAAoLsLhk0VMe4CAAAgbxAoZ1Dia3wBOpQBAAAASVIwZCZHwwEAACD3EShnUOJGuZ5AGQAAAJDU1KHM/GQAAID8QaCcQYmv8tGhDAAAADQJhM3kaDgAAADkPgLlDHLYbXIXOBQMESgDAAAAUtO39wiUAQAA8geBcob53E4F6VAGAAAAFIvHVd8QJVAGAADIIwTKGeb1OBl5AQAAAEiqD0clST6PK8uVAAAAoL0IlDPM63Yy8gIAAADQrmeL0KEMAACQPwiUM8zrdioYjmS7DAAAACDrgqGm+2Kvh0AZAAAgXxAoZ5jXzcgLAAAAQJKCzSMvvIUEygAAAPmCQDnDfB6nImZcETOW7VIAAACArEp8c89HhzIAAEDeIFDOsMR8uCBdygAAAOjmEvfERcxQBgAAyBtpDZRXrFihsWPHatSoUVq0aFGr/S+++KImTJigk08+WRdffLF27NghSVq6dKmGDx+uCRMmaMKECaqurk5nmRnldTc9wZpAGQAAAN1dIGTK5bSpwGnPdikAAABoJ0e63rimpkbV1dVasmSJXC6XzjzzTA0ZMkQDBgyQJAWDQc2dO1dPP/20ysrKdMcdd+iuu+7S1VdfrY0bN2r27NkaP358usrLmsTX+ZijDAAAgO6uPmwmv8EHAACA/JC2DuXVq1dr6NChKi4ulsfj0ejRo7Vy5crkftM0NWfOHJWVlUmSDj74YH311VeSpA0bNmjp0qXy+/264oorkp3LXUHi63zBEIEyAAAAurcAgTIAAEDeaVeHcjAYlNfr1bvvvqsPP/xQ48aNk9P57Td+W7ZsUUlJSXK7tLRU69evT2737NlTJ554oiSpoaFB999/v376059KkkpKSjRt2jQdfvjhuu222zRv3jwtWLCg3RfVu7e33cd2ppISX5vHOAubRl7IbmvX8d0B65Aa1i01rFtqWLfUsG6pYd1Sw7ohHwXDpnwEygAAAHmlzUD5jjvu0GeffabLL79c06dP14ABA7R27VrdeOON33pePB6XYRjJbcuyWmwnBAIB/e///q8GDhyoU089VZJ09913J/dPnz49GTy317ZtQcXjVofO2VslJT7V1gbaPC4Wj0uSvtoSaNfxXV171w0tsW6pYd1Sw7qlhnVLDeuWGtatY2w2I2sNCGgpGDJVUuzOdhkAAADogDZHXrz66qu64YYbtGrVKo0bN04PP/yw3n///TbfuLy8XLW1tcnt2tpalZaWtjhmy5Ytmjx5sg4++OBkQB0IBPTQQw8lj7EsS3Z713lIh91mU1Ghg4fyAQAAoNsLMvICAAAg77RrhrLb7U7ORJakSCTS5jnDhg3TmjVrVFdXp3A4rFWrVmnEiBHJ/bFYTBdeeKHGjBmjq666Ktm97PF49MADD+jtt9+WJD366KMd7lDOdV63k0AZAAAA3Vo0FleoMUqgDAAAkGfaHHnRs2dPzZ07Vxs3btQdd9yhW2+9tVWn8e6UlZWpqqpKU6ZMkWmamjRpkioqKjRjxgzNnDlTmzdv1rvvvqtYLKbnn39ekjRo0CDdeOONuv322zV37lw1NDSof//+uuWWW/b+SnOI10OgDAAAgO6tviEqSQTKAAAAeabNQHn+/PlavHixfve738ntdsswDM2fP79db+73++X3+1u8tnDhQknS4MGD9zg6o7KyUkuXLm3XZ+Qjn9ulup0N2S4DAAAAyJpgqOlbjz4PgTIAAEA+aTNQ7tOnj6ZMmSKv16t3331XBx54oPbZZ59M1NZled1O/aeGB+cAAACg+0p8Y48OZQAAgPzSZqB8xx136LPPPtPll1+u6dOna8CAAVq7dm3yIXrouMQMZcuykrOjAQAAgO6EQBkAACA/tflQvldffVU33HCDVq1apXHjxunhhx/e46gKtI/X45QZjStixrNdCgAAAJAVAQJlAACAvNRmoCxJbrdbq1ev1tChQyVJkUgkrUV1dYmb5kCYdQQAAED3FAwRKAMAAOSjNgPlnj17au7cudq4caOGDRumW2+9VaWlpZmorcvyNd80J77mBwAAAHQ3wbCpAqddLqc926UAAACgA9oMlOfPn6/S0lLdf//9crvdMgxD8+fPz0RtXZbXQ6AMAACA7i0YNulOBgAAyENtPpSvT58+mjBhgt5880299957mjRpkvr06ZOJ2rqsxI1z4mt+AAAAQHdDoAwAAJCf2uxQfv311/WTn/xEL774ol566SVNmjRJL774YiZq67J8HpekXQ8iAQAAALqbQMhMfnMPAAAA+aPNDuU77rhDjz76qAYMGCBJ+te//qVZs2bphBNOSHtxXZWnwCHDoEMZAAAA3VcwHFFZT3e2ywAAAEAHtdmhbJpmMkyWpIMOOkixWCytRXV1NpuhokInM5QBAADQbTHyAgAAID+1GSgXFhZqw4YNye0NGzbI7aaTYG953U5GXgAAAOSZFStWaOzYsRo1apQWLVrUav+rr74qv98vv9+vyy+/XPX19ZKkt956S5MmTdKECRN07rnn6ssvv5QkvfnmmxoyZIgmTJigCRMm6Morr8zo9WRLNBZXuDFGoAwAAJCH2hx5MWvWLF144YXaf//9ZRiGPvnkE91xxx2ZqK1L83qcCoYi2S4DAAAA7VRTU6Pq6motWbJELpdLZ555poYMGZL8Nt/OnTs1e/ZsPfLIIxowYIAWLlyo6upqXX311Zo1a5buueceDRw4UE899ZRuuOEG3Xvvvdq4caOmTZumCy64IMtXl1n1zY0VzFAGAADIP212KFdWVuovf/mLLrjgAk2fPl3PPvusjjjiiEzU1qX53Iy8AAAAyCerV6/W0KFDVVxcLI/Ho9GjR2vlypXJ/Z9++qn23XffZMB87LHH6sUXX1QkEtGll16qgQMHSpIOPvhgffXVV5Kavv33xhtvyO/368ILL0y+3tUlvqlHhzIAAED+abNDWZKKi4s1cuTI5PZZZ52lxx9/PG1FdQdet1P//mpntssAAABAO23ZskUlJSXJ7dLSUq1fvz653b9/f23evFnvv/++Bg4cqOeee05bt26Vy+XShAkTJEnxeFy//e1vkw+49vl8GjNmjEaNGqXHH39cVVVVeuKJJzpUV+/e3k64uo4pKfHt1fmbdzRKkr7Td5+9fq98092ut7Owbqlh3VLDuqWGdUsN65Ya1i272hUo/7cPPvigs+vodryepg5ly7JkGEa2ywEAAEAb4vF4i/u2/76P69Gjh+bPn69rrrlG8Xhcp59+upzOXR24kUhEs2fPVjQaTY64mDdvXnL/WWedpQULFigQCMjna/8/krZtCyoet/bm0jqkpMSn2trAXr3HF1/tkCTFItG9fq980hlr1x2xbqlh3VLDuqWGdUsN65Ya1q39bDYjLc0HbY68QHr43C5FY5YaIrFslwIAAIB2KC8vV21tbXK7trZWpaWlye1YLKby8nL96U9/0tNPP60f/OAH2m+//SRJ9fX1mj59uqLRqO699145nU7F43Hde++9isVa3g/a7fbMXFAWBRl5AQAAkLcIlLMkcfPMHGUAAID8MGzYMK1Zs0Z1dXUKh8NatWqVRowYkdxvGIamTZummpoaWZalhx56SGPHjpXU9KDr/fffX7fffrtcLpckyWaz6YUXXtDzzz8vSVq2bJkOPfRQeTyezF9chu2aoZzSFyYBAACQRXu8g7vhhht2+7plWTJNQtC99c1AuaTYneVqAAAA0JaysjJVVVVpypQpMk1TkyZNUkVFhWbMmKGZM2dq8ODBmjdvnqZPn65IJKIjjzxS5513nt5991299NJLGjBggE499VRJTfOXFy5cmByRcffdd6tXr1665ZZbsnyVmREMmSpw2eV0dP1u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LdX69euT2/3799fmzZv1/vvva+DAgXruuee0detWbd++XV6vVw5H0613SUmJampqWr2nw+GQ1+tVXV2dysrK2l1X797ezri8Dikp6diDW8y4pX18BR0+rytiDVLDuqWGdUsN65Ya1i01rFtqWLfO43a7dcYZZ+iMM85o9zltBsrHH3+8jjzySP3gBz/QoEGDNH78eI0fP36vCkVrvuYHlAQIlAEAAHJSPB5v8dASy7JabPfo0UPz58/XNddco3g8rtNPP11Op7PVcdKeH35iWZZsHezi3bYtqHjc6tA5e6OkxKfa2kCHztn6dUgel73D53U1qawdWLdUsW6pYd1Sw7qlhnVLDevWfjabkZbmgzYD5ZkzZ+r0009PdknceuutGjhwYKcX0t15m+fJJZ6ADQAAgNxSXl6udevWJbdra2tVWlqa3I7FYiovL9ef/vQnSdL69eu13377qVevXgoEAorFYrLb7S3OKy0t1datW1VeXq5oNKr6+noVFxdn9LoyIRg21dNbkO0yAAAA0AnabH/YunWr3nnnHRmGod/85je6+eab9f7772eitm7F6bCrwGln5AUAAECOGjZsmNasWaO6ujqFw2GtWrVKI0aMSO43DEPTpk1TTU2NLMvSQw89pLFjx8rpdKqyslLPPvusJGnZsmXJ80aOHKlly5ZJkp599llVVlbK6XRm/NrSLRg2kyPeAAAAkN/aDJRnz56tzz//XGvWrNHrr7+uCRMm6IYbbshEbd2O1+1UgA5lAACAnFRWVqaqqipNmTJFp5xyisaPH6+KigrNmDFDGzZskM1m07x58zR9+nSddNJJ6tGjh8477zxJ0pw5c7R48WKNHTtW69at02WXXSZJuvTSS/XPf/5T48aN02OPPaZrr702i1eYPsGQKa+HQBkAAKAraHPkxddff62pU6dq/vz5Gj9+vCZOnKhFixZlorZux+tx0qEMAACQw/x+v/x+f4vXFi5cmPz5mGOO0THHHNPqvH79+umRRx5p9XpxcbHuu+++Tq8zlzSaMUWicTqUAQAAuog2O5RN05Rpmnr99dc1bNgwhcNhhUKhTNTW7fjcBMoAAADoWuqb728TD6EGAABAfmszUD7++ON15JFHqmfPnho0aJBOO+00jR8/PhO1dTtNHcqRbJcBAAAAdJrESLeiQjqUAQAAuoI2R17MnDlTp59+usrL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HTW477cec9lls/Tzn1+gmTP/P5122sn605/uUt++++qFF1bqoIO+rxtumC/TNHXOOafpgw/eb3W+aUb1u989qDfeeE0LF95LoIzUfTNQLil2Z7kaAAAAdAeBEIEyAABAqnr27KW+ffeVJJ144kl6992NWrz4MX366b+1Y8cOhcOhVucMGXKkJOl73ztQgcDOjNa7OwTKeczb/CCUxJO2AQAAkF4rVqzQvffeq2g0qnPPPVdnn312i/3vvPOOrr32Wpmmqb59++o3v/mNevToobfeeks333yzTNNUcXGxbrrpJvXr109vvvmmfv7zn6u8vFySdMghh+jmm2/OxqW12876iAqcdrmc9myXAgAA0C5HDW67izhTCgoKkj8/9dQTeuWVl3Xyyadq0qQj9O9/fyzLslqd43K5JEmGYex2f6bZsl0AUudLdihHslwJAABA11dTU6Pq6mo99thjWrZsmZ588kl99NFHLY658cYbNXPmTD3zzDM64IAD9Pvf/16SNGvWLN1www1avny5/H6/brjhBknSxo0bNW3aNC1fvlzLly/P+TBZagqUvW76UgAAANrLbrcrFou1en3t2r/r5JMnatSoMYpEIvrXvz5UPB7PQoUdQ6CcxxIdykE6lAEAANJu9erVGjp0qIqLi+XxeDR69GitXLmyxTHxeFz19fWSpHA4rMLCQkUiEV166aUaOHCgJOnggw/WV181zfDbsGGD3njjDfn9fl144YXJ13NZU6DsynYZAAAAeaNXr94qKyvXTTdd1+L100+frAcfvF9TppyhO+5YoEGDKvTVV5uyVGX70VqQx9wFDtkMQ8EGAmUAAIB027Jli0pKSpLbpaWlWr9+fYtjZs+erWnTpummm26S2+3W4sWL5XK5NGHCBElNgfNvf/tbnXDCCZIkn8+nMWPGaNSoUXr88cdVVVWlJ554InMXlYJAfSTZ2AAAAIC2ORwO3XffH1q9/uMf/48ef3zJbs85/PBKSdJvf3t/8rW+fffVU0+tSE+RHUCg3AmseEzBd15XNF4km7e3DE+xDFv6m79thiGv20GHMgAAQAbE43EZhpHctiyrxXZDQ4OuuuoqPfTQQ6qoqNCDDz6oX/7yl7r//qZ/BEQiEc2ePVvRaFQXXHCBJGnevHnJ88866ywtWLBAgUBAPp+v3XX17u3d20vrkJ31EX3/uz1VUtL+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A7Vnzx5J0rZt2zzWg9Vvv/2m7OxsrV27VsnJyV7rEREReu2119TY2ChjjEpKSjRjxgw/7DSwtLS0yOl0qr29Xa2trSovL/eoC/12aQcOHNDIkSM1aNAgrzX67fLuuusuHT58WL/88osuXryoyspKr74KCwtTbGysPvnkE0nSRx99FPS919raqsWLF+upp55SZmZmt9cMGjRI7777rvu/1hcXFwd97xljtHr1ap05c0adnZ0qLS31qgn91r3m5madP39eMTEx3a7Tb+grcq815F5ryL3WkXutI/daQ+61htxrHbk3MDFQ7oUbb7xRy5YtU3p6uubMmSO73a4777xTjz32mPbu3StJWrt2rV599VUlJibqr7/+uuT3uwST9957T+3t7VqzZo1SUlKUkpKizZs3u+sWGRmp/Px8ZWVlKTExUcaYbj+yFWwSEhI0depUzZkzR6mpqUpNTdX48ePpNx80NjZq2LBhHufoN98MHDhQa9as0ZNPPqmkpCSNGjVKiYmJkqSVK1dqx44dkqS8vDyVlZUpKSlJtbW1evrpp/24a//bunWrTp06pQ0bNrif59544w1J/9QtJCRE69at06pVqzR79mzt379fOTk5ft65f40dO1ZLlizRQw89pOTkZI0bN052u10S/daTo0ePej3PSfQb/j3kXmvIvdaQe60j91pH7rWG3GsNudc6cm9gshljjL83AQAAAAAAAAAIfLxDGQAAAAAAAADgEwbKAAAAAAAAAACfMFAGAAAAAAAAAPiEgTIAAAAAAAAAwCcMlAEAAAAAAAAAPgn19wYAAD277bbbNGbMGA0Y4Pk6YFFRkUaMGPGv/66amhpFRkb+qz8XAAAA6Am5FwACHwNlAOgnNm3aRNgFAADAVY/cCwCBjYEyAPRzu3bt0tq1a3XzzTeroaFBERERWrNmjUaPHq2Wlha99NJLqq+vl81m05QpU7R8+XKFhoaqrq5OBQUFamtrU1hYmFasWKGJEydKkgoLC1VXV6c///xTixcv1oIFC/z8KAEAABDsyL0AEBgYKANAP5GRkeHx0b8RI0aoqKhIkrRv3z4999xzio2N1ebNm5WTk6MPP/xQBQUFGjJkiCoqKtTZ2amsrCy9//77WrRokbKzs1VQUKBp06Zp3759ys3N1bZt2yRJMTExysvL048//qj58+frwQcfVFhYmF8eNwAAAIILuRcAAhsDZQDoJy730b+xY8cqNjZWkpSamqr8/HydPn1aX331lTZv3iybzabw8HClpaVp06ZNmjx5sgYMGKBp06ZJku644w5VVFS4f57dbpckjRs3Th0dHWptbdUNN9zw3z5AAAAAQOReAAh0A3q+BAAQ6EJCQro953K5ZLPZ3OdcLpcuXLigkJAQj/OSdPDgQV24cEGSFBr6v9cb/77GGPNfbR0AAADwGbkXAPyPgTIAXAXq6+tVX18vSSotLdX48eN1/fXXKz4+XsXFxTLGqKOjQ2VlZZo0aZJGjRolm82mqqoqSdL+/fuVkZEhl8vlz4cBAAAAXBa5FwD8j6+8AIB+out3yUnS8uXLFRERoaFDh2rdunU6duyYIiMj5XQ6JUkvvviiCgoK5HA41NnZqSlTpujxxx9XeHi4CgsLtXr1ajmdToWFhamwsFDh4eH+eGgAAACAG7kXAAKbzfB5DgDo13bt2qWXX35ZlZWV/t4KAAAA8J8h9wJAYOArLwAAAAAAAAAAPuEdygAAAAAAAAAAn/AOZQAAAAAAAACATxgoAwAAAAAAAAB8wkAZAAAAAAAAAOATBsoAAAAAAAAAAJ8wUAYAAAAAAAAA+ISBMgAAAAAAAADAJ/8H0qpSiMqAKvsAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_pooling.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Pooling \n",
+ "We can now again explore the functionality of our Hopfield-based pooling layer HopfieldPooling
. \n",
+ "\n",
+ "Again, additional arguments are set to influence the training as well as the validation performance of the Hopfield-based pooling.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " input_size
\n",
+ " num_characters (20) \n",
+ " Size (depth) of the input (state pattern). \n",
+ " \n",
+ " \n",
+ " hidden_size
\n",
+ " 8 \n",
+ " Size (depth) of the association space. \n",
+ " \n",
+ " \n",
+ " num_heads
\n",
+ " 8 \n",
+ " Amount of parallel association heads. \n",
+ " \n",
+ " \n",
+ " \n",
+ " update_steps_max
\n",
+ " 3 \n",
+ " Number of updates in one Hopfield head. \n",
+ " \n",
+ " \n",
+ " scaling
\n",
+ " 0.25 \n",
+ " Beta parameter that determines the kind of fixed point. \n",
+ " \n",
+ " \n",
+ " dropout
\n",
+ " 0.5 \n",
+ " Dropout probability applied on the association matrix. \n",
+ " \n",
+ " \n",
+ " ...
\n",
+ " default \n",
+ " The remaining arguments are not explicitly used in this example. \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_pooling = HopfieldPooling(\n",
+ " input_size=latch_sequence_set.num_characters,\n",
+ " hidden_size=8,\n",
+ " num_heads=8,\n",
+ " update_steps_max=3,\n",
+ " scaling=0.25,\n",
+ " dropout=0.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_pooling.output_size, out_features=1)\n",
+ "network = Sequential(hopfield_pooling, output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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JxiJSSJQBgAAyEdfXig8depUnXHGGbrwwgv7dH2PgfLs2bP1n//8R++9955mzJiROm6327XffvulV20RsHmqJElWqEHqJVCmjzIAAACGolA4GSh7aXkBAACQ9xobG7V58+Y+j+8xUJ4wYYImTJigqVOnqqamZlCKKwaGNxkomy0N6qk7cjmBMgAAAIawYEegzAplAACAvPPlHsobN27U6aef3ufre+2h/Pnnn2vhwoVqamqSZVmp431t0lxsbJ5KSZLV0tDjGJ+bQBkAAKAQrVixQrfffrvi8bjOOeccnX322Z3Ov/XWW/rpT3+qWCymkSNH6pe//KX8fr8eeeQR3XjjjRo2LPkNtiOOOEILFizIxVvIilBHy4syAmUAAIB8s30PZcMwVFVVpT322KPP1/caKP/0pz/VySefrH322UeGYaRXZTFxuWX4R+xwiNNhk7vEoeaWWJaKAgAAwEDV1dVpyZIlWr58uVwul8444wxNnjxZY8eOTY255pprNH/+fB1++OH6+c9/rt///vdasGCB1q1bp0WLFmnWrFk5fAfZEwxH5bAbKnX19J09AAAA5Mouu+yi3/72t7ryyiv10Ucf6YYbbtDixYs1fPjwPl1v622Aw+HQt771LU2ePFkHHXRQ6h90zzAMec+4Xq6Jx+1wnN/jUlOYFcoAAACFYvXq1ZoyZYoqKirkdrs1Y8YMrVy5stMY0zTV0tIiSYpEIiotLZUkrV27Vo888ohqa2v1wx/+UE1NTVmvP5uCkZh8bhcLUgAAAPLQokWLtPvuu0uSRo8erYMOOkiXXHJJn6/vNVDec8899d5776VfIbrl97hoeQEAAFBANm/erEAgkHpdXV2turq6TmMWLVqkyy+/XIceeqhWr16tM844Q5IUCAT0ve99T48//rhGjhypxYsXZ7X2bAuFY/LS7gIAACAvNTY2au7cuZKkkpISzZs3T/X19X2+vteWF+vXr9cpp5yiUaNGqaSkJHWcHso9a/vnQ4r/93V5Tv95j2P8Hpc+2xzKYlUAAAAYCNM0O624tSyr0+vW1lZddtlluvvuuzVx4kTddddd+vGPf6w777xTt956a2rc+eefr2OOOabfzx82zDuwN5CmQMDX72taYwkNKy9L69qhopjf+0Axd+lj7tLH3KWPuUsP85Y+5m7gEomE6urqNGJEsm3vli1bOu2d15teA+WBbBbS26YlTz/9tG6++WaZpqkJEyZo8eLFcrlcaT8vb9jsMpvqZJlxGbbup7jc7dJbrFAGAAAoGDU1NXr99ddTr+vr61VdXZ16/f7776ukpEQTJ06UJJ1++um66aabFAwG9fDDD2vevHmSkkG03d7/3sJbt4Zkmn3/oD8YAgGf6uuD/b6usblVY2rSu3YoSHfewNwNBHOXPuYufcxdepi39DF3/WOzGd0uSpg3b55OOukkHXbYYTIMQ6tXr9aPfvSjvt+3twEHHXSQSktL9dFHH2m//faT0+nsUw/ljk1LHnjgAT366KN68MEH9cEHH6TOh8NhLV68WHfddZf+8pe/qK2tTY888kifC89nhqdSkiUr3HNvPL/HqUhbXLF4InuFAQAAIG1Tp07Vyy+/rIaGBkUiEa1atUrTpk1LnR8zZow2bdqkjz76SJL07LPPasKECXK73frd736nN998U5J03333pbVCuZAEwzH5yobAQhEAAIAhaPbs2brrrru0zz77aPz48frDH/6g2traPl/fa6C8fPlyXXLJJfrd736nYDCo733ve1q2bFmvN+5t0xK3263nnntOw4cPVyQS0datW+X3+/tceD6zeaskSVaooccxfk/yA3ZzSywrNQEAAGBgRowYoQULFmju3Lk66aSTNGvWLE2cOFEXXHCB1q5dq/Lycl133XW6+OKLVVtbq4cffljXXnut7Ha7fv3rX+vKK6/Ucccdp7feeksLFy7M9dvJmHjCVLgtLp+bHsoAAAD5qK6uTn/60580b948HXLIIVqyZMng9lC+99579eCDD2rOnDkaNmyYli9frvPPP1+nnXbaDq/rbtOSNWvWdBrjdDr1wgsv6Ec/+pGqq6t16KGH9rnwfGZ4koGy2dKgnr7MmAqUw1ENKy/NUmUAAAAYiNra2i6rN5YuXZr6+fDDD9fhhx/e5bpJkyYNmW/j9aYlklww4SVQBgAAyEs//vGP9fWvf12SNHr0aB100EG69NJLO32u3ZFeA2WbzSav94teGyNHjuxTz7feNi3pcPjhh+vVV1/Vr371K1155ZW68cYb+1S4lL8bk5i+XfSxJLfCquhh7K6RePIHh72omokX03sdbMxdepi39DF36WPu0sfcpY+5Q74ItgfKPjctLwAAAPJRY2Oj5s6dK0kqKSnRvHnz9Oijj/b5+l4D5YqKCr3z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GWlW7L+vy2pr6fa83+1Scws9lAEAAFAYgpGYvG4CZQAAgGKRsUB59erVmjJliioqKuR2uzVjxgytXLkydT4Wi+mKK67QiBEjJEl77bWXPv/880yVkzfMrZ+q9enfKNHwWbfnyz1ONbFCGQAAIC/19g28t956S6eccopOOOEEfec731Fzc7MkaePGjTr77LN17LHH6sILL1RLS/eLCwpNWyyhaMykhzIAAEARyVigvHnzZgUCgdTr6upq1dXVpV5XVlbqmGOOkSS1trbqzjvv1NFHH52pcvKG4amSJFktDd2e93toeQEAAJCPevsGniRdc801mj9/vh5//HHttttu+v3vfy9Juuqqq3TWWWdp5cqVGj9+vG677bZcvIVBFwonv1nnpeUFAABA0cjYpnymacowjNRry7I6ve4QDAb1P//zPxo3bpy+8Y1v9OsZw4Z5B1xnOgIBX9rXmv5d9LEkt8Kq6OY+NQGf3nivXsOHe7udr0I3kLkrdsxdepi39DF36WPu0sfcpY+5y7ztv4EnKfUNvIsuuig1xjTN1OrjSCSi8vJyxWIxvfbaa7r11lslSSeffLLmzJmjhQsXZv09DLZgJLkQgh7KAAAAxSNjgXJNTY1ef/311Ov6+npVV1d3GrN582add955mjJlii699NJ+P2Pr1pBM0xpwrf0RCPhUXx8c2E1cZQrWbVSsm/s4DSkaN7V+wzaVlWTstycnBmXuihRzlx7mLX3MXfqYu/Qxd+lj7vrHZjPSWpjQ3Tfw1qxZ02nMokWLdO655+raa69VWVmZli1bpsbGRnm9Xjkcyc92gUCg0zf3ClnHCmVaXgAAABSPjCWWU6dO1S233KKGhgaVlZVp1apVuvrqq1PnE4mEvvvd7+q4447T9773vUyVkZdsnipZLY3dnvN7kqs7mluiQy5QBgAAKGS9fQOvtbVVl112me6++25NnDhRd911l3784x/r6quv7vLNs3S+iZaP384zPt0mSdplpwoFArmpL1/xrYH0MXfpY+7Sx9ylj7lLD/OWPuYu9zKWWI4YMUILFizQ3LlzFYvFNHv2bE2cOFEXXHCB5s+fr02bNuntt99WIpHQU089JUkaP368rrnmmkyVlDccux4g2bv/WqDfk1zd0dQS1YgqdzbLAgAAwA709g28999/XyUlJZo4caIk6fTTT9dNN92kqqoqBYNBJRIJ2e32br+51xf5+O28DXXJc7HWKKvkt8O3BtLH3KWPuUsfc5c+5i49zFv6mLv+Sfebeb3J6BLY2tpa1dbWdjq2dOlSSdKECRP07rvvZvLxeavka6f0eM7f/nVBNuYDAADIL719A2/MmDHatGmTPvroI+2+++569tlnNWHCBDmdTk2aNElPPvmkamtr9eijj2ratGk5fCeDJxSJymYYfLMOAACgiPDJLwesRFxWS4MM7zAZNnunc+XtK5SbwwTKAAAA+aS3b+BNmDBB1113nS6++GJZlqVhw4bp2muvlSRdccUVWrRokW6//XaNHDlSv/rVr3L8bgZHMByT1+2UbQhuJg0AAIDuESjnQPw/q9X64h/kOeOXMvyBTue8bqcMsUIZAAAgH+3oG3iSdPjhh+vwww/vct3o0aN17733Zry+bAuFY/KVdd/KDQAAAEOTLdcFFCPDWyVJMlsaupyz22zyup0EygAAAMh7wXBUXgJlAACAokKgnAOGJxkoW90EylJyY74mAmUAAADkuWAkJp+bQBkAAKCYECjngM1TKUkyQz0Eym4XPZQBAACQ90KRmLztm0oDAACgOBAo54DhKpNcZT2uUC73uGh5AQAAgLxmWpZCEXooAwAAFBsC5RyxD99VsnW/J6Lf41JzSyy7BQEAAAD9EG6Ny7KSm0oDAACgeHSfaCLj3LN+3OM5v8eltlhCbdGESlz2LFYFAAAA9E2wvUUbK5QBAACKCyuU85C/vQ9dE32UAQAAkKeC4eQ36nz0UAYAACgqBMo5En3rWQXvvlBWomtrC78n+aGcPsoAAADIV6FI8nOslxXKAAAARYVAOUcMh0uKRmS1bOtyrpxAGQAAAHku1fKCHsoAAABFhUA5RwxPlSTJbGnoco4VygAAAMh3HSuUCZQBAACKC4FyjhjeSkmS1U2g3PGhnEAZAAAA+SoYjqnEZZfTwSbSAAAAxYRAOUdsHSuUQ10DZYfdJk+pg035AAAAkLeC4Zh89E8GAAAoOgTKOWI4SyWXu9sVylKy7QUrlAEAAJCvgpEoG/IBAAAUIUeuCyhmnjOul1Hi6fZcOYEyAAAA8lgoHJPP7cp1GQAAAMgyVijnkK3UJ8Po/reAFcoAAADIZ6FIjBXKAAAARYhAOYei776gyFM3dXvO73apmR7KAAAAyFPBcCy1mTQAAACKB4FyDlkt2xT/5F+yErEu5/welyJtCcXiiRxUBgAAAPQsGkuoLZYgUAYAAChCBMo5ZPNWSZKslsYu5/yeZD+6JtpeAAAAIM+EIskFEfRQBgAAKD4EyjlkeColSWaoocu5jkC5uaXr6mUAAAAgl4Lh5GdUeigDAAAUHwLlHDJSK5S7BsrlqUCZFcoAAADIL8FI8jMqgTIAAEDxIVDOIZsnGSib3QTKfndHy4u2rNYEAAAA9CYU7mh5QaAMAABQbBy5LqCYGc5SlR33A9kqR3c55/ckP5yzQhkAAAD5JkgPZQAAgKJFoJxjjp0ndHvc6bCrrMRBD2UAAADknWA4JsOQ3KX85wQAAECxoeVFjsX++7qibz7Z7Tm/x6WmMCuUAQAAkF9CkZi8ZU7ZDCPXpQAAACDLCJRzLLF+naJv/rXbc+VuJy0vAAAAkHeC4SjtLgAAAIoUgXKOGd5KWa1BWfGuwbHfW0KgDAAAgLwTCidXKAMAAKD4ECjnmM1TJUmywtu6nCt3uwiUAQAAkHdCkZh8BMoAAABFiUA5x4z2QNkMNXQ55/c4FW6LKxY3s10WAAAA0KNkywsCZQAAgGJEoJxjNm/7CuWW7gLlZF+6IBvzAQAAIE+YlqVQJC4vgTIAAEBRIlDOMcNbJdfXTpFt2C5dznUEyk20vQAAAECeCLfGZVqWfGVsygcAAFCMHLkuoNgZjhKV7F/b7bmOQJk+ygAAAMgXoUhMklihDAAAUKRYoZwHEps/UnzD212Ol7sJlAEAAJBfOtqx0UMZAACgOBEo54G2Nx5V26sPdjmeWqFMD2UAAADkiVA4uUKZlhcAAADFiUA5D9g8VbJCXTflczntKnXZ6aEMAACAvBHsaHlRxgplAACAYkSgnAcMb5Ws1qCseNfg2O9x0fICAAAAeaOj5QU9lAEAAIoTgXIesHkqJUlWeFuXcwTKAAAAyCehSEwup00lTnuuSwEAAEAOECjnAcNTJUkyu2l7Ue52qbm9Tx0AAACQa8FwjP7JAAAARYxAOQ/Yyqvl2G2SDGdpl3OsUAYAAEA+CUVitLsAAAAoYo5cFwDJ5guo7JiLuj3n97gUisQUT5hy2Mn/AQAAkFvBcFQ+NuQDAAAoWiSUecJqDclsaexy3O9Jfp0wSNsLAAAA5IFgOCYfK5QBAACKFoFyngg/8XO1/f2eLsf97mSgTNsLAAAA5INQJCYvPZQBAACKFoFynjA8Vd1vyte+Qrk5TKAMAACA3IrFTbVGE6xQBgAAKGIEynnC5qmS1dI1UPZ7kh/WWaEMAACAXAtFkm3Y2JQPAACgeBEo5wnDWyWrNSgr3jk47uihTKAMAACAXAu2f2vOR8sLAACAokWgnCdsnkpJkvWljflKXQ65nDY1ESgDAAAgx4LtK5RpeQEAAFC8CJTzhOELyPCPkBVr7XLO73bRQxkAAAA5Fwq3t7woI1AGAAAoVo5cF4Akx6hx8p5xfbfnyj0uWl4AAAAg51ItL1ihDAAAULRYoVwA/ATKAAAAyAOhSEyGJE8pgTIAAECxIlDOIy0P/0Stq+/vcpxAGQAAAPkgGI7JU+aUzWbkuhQAAADkCIFyPrEkK7ily2G/26VgJCbTtHJQFAAAAJAUjMRodwEAAFDkCJTziOGtkhlq6HLc73HJsr7YVRsAAADIhVA4Kh8b8gEAABQ1AuU8YvNUymrpGiiXe1ySpKZQW7ZLAgAAAFKCkZi8bleuywAAAEAOZTRQXrFihWbOnKnp06fr/vu79gbu8KMf/UjLly/PZCkFwfBUyWoNyop37pfsbw+Um8P0UQYAAEDuhMIxeVmhDAAAUNQyFijX1dVpyZIleuCBB/Too4/qwQcf1AcffNBlzHe/+1099dRTmSqjoNi8VZIkK7yt0/FUoMzGfAAAAMgRy7IUoocyAABA0XNk6sarV6/WlClTVFFRIUmaMWOGVq5cqYsuuig1ZsWKFTrqqKNSY4qdY/evybvbJBnO0k7H/e6OQJkeygAAAMiNSFtcCdOihzIAAECRy1igvHnzZgUCgdTr6upqrVmzptOY888/X5L0xhtvpPWMYcO86Rc4AIGAL0N37v6+lmXJ6bApZmXy2dlR6PXnEnOXHuYtfcxd+pi79DF36WPukGnBcHJxg48eygAAAEUtY4GyaZoyDCP12rKsTq8Hw9atIZmmNaj37E0g4FN9fTAj97bMhFqf/o0cux4g516HdTrnd7u0qT6UsWdnQybnbqhj7tLDvKWPuUsfc5c+5i59zF3/2GxGzhYmFLJgJBkoe2l5AQAAUNQy1kO5pqZG9fX1qdf19fWqrq7O1OOGBMNmV3zT+0rU/7fLOb/HxaZ8AAAAyJlg+2dReigDAAAUt4wFylOnTtXLL7+shoYGRSIRrVq1StOmTcvU44YMm6dKZqihy/Fyj4tN+QAAAJAzofaWF156KAMAABS1jAXKI0aM0IIFCzR37lyddNJJmjVrliZOnKgLLrhAa9euzdRjC57hqZTV0jVQ9nucBMoAAADImVB7ywtfGT2UAQAAilnGeihLUm1trWprazsdW7p0aZdxP//5zzNZRkGxeasU76HlRTAck2lZsg1yL2oAAACgN8FwTC6HTSUue65LAQAAQA5lbIUy0mN4qmS1BmXFO69G9rtdMi0rtTIEAAAAyKZgJMqGfAAAAMjsCmX0n3PswbKPGifZOmf9fk/yq4XNLVH53XzNEAAAIBdWrFih22+/XfF4XOecc47OPvvs1Ll33nlHixYtSr1uaGhQeXm5nnjiCT3yyCO68cYbNWzYMEnSEUccoQULFmS9/oEIhmO0uwAAAACBcr6x+QOy+QNdjpdvFyir62kAAABkWF1dnZYsWaLly5fL5XLpjDPO0OTJkzV27FhJ0t57763HHntMkhSJRHTqqafqyiuvlCStW7dOixYt0qxZs3JV/oCFIjFWKAMAAICWF/nGikbU9vojSmz6T6fjNVVuOeyG/r7m8xxVBgAAUNxWr16tKVOmqKKiQm63WzNmzNDKlSu7HXvHHXfoa1/7miZNmiRJWrt2rR555BHV1tbqhz/8oZqamrJZ+qAIhqPyESgDAAAUPVYo5xubTdH/e0yyO2Sv2TN1uNxboplTxujxf3ysQyaO1L67VuWwSAAAgOKzefNmBQJffFWsurpaa9as6TIuGAxq2bJlWrFiRepYIBDQueeeqwMOOEC/+tWvtHjxYt144439ev6wYd70ix+AQMAnSWppjau6ypN6jR1jntLH3KWPuUsfc5c+5i49zFv6mLvcI1DOM4ajRCrxyGpp7HLu+IPH6JW363TfU+9p8XkHyelgh20AAIBsMU1ThmGkXluW1el1h8cff1xHH310ql+yJN16662pn88//3wdc8wx/X7+1q0hmabV7+sGIhDwqb4+qHjCVLg1Lrss1dcHs1pDIeqYN/Qfc5c+5i59zF36mLv0MG/pY+76x2YzMrIogZYXecjmrZIZauhy3Omw65vT91JdY0RPvvJpDioDAAAoXjU1Naqvr0+9rq+vV3V1dZdxzzzzjGbOnJl6HQwGdffdd6deW5Ylu72wFgYEwzFJko/NoQEAAIoegXIeMjxVslq6BsqStO9uVZq8zwj95eWPVdcQznJlAAAAxWvq1Kl6+eWX1dDQoEgkolWrVmnatGmdxliWpbfeekv7779/6pjb7dbvfvc7vfnmm5Kk++67L60VyrkUiiQDZW8ZPZQBAACKHYFyHrJ5qrptedHhjK+PldNh172r3pNlZfdrjwAAAMVqxIgRWrBggebOnauTTjpJs2bN0sSJE3XBBRdo7dq1kqSGhgY5nU6VlJSkrrPb7fr1r3+tK6+8Uscdd5zeeustLVy4MFdvIy3BcFSS2JQPAAAA9FDOR47dvyZb5ege+/KVe0t0yuG7675V7+vVd+o0ZZ+aHFQJAABQfGpra1VbW9vp2NKlS1M/Dxs2TP/4xz+6XDdp0iQ98sgjGa8vU1IrlGl5AQAAUPRYoZyHHKP3kWv80d2GyR2O2G+0dhvp05+e/UDh1lgWqwMAAECxSfVQpuUFAABA0SNQzkNWNKLYx2/IDG3tcYzNZmjujHEKhqN6+MWPslgdAAAAik0wHJUhyVPGFxwBAACKHYFyHrIiTWpddYsSG9/d4bgxNT4ddeBOev7/Nuijjc1Zqg4AAADFJhSJyV3qkN3Gfz4AAAAUOz4R5iHDUylJMlsaeh37jcN2V7nXpXueelcJ08x0aQAAAChCwXBMPvonAwAAQATKeclwlMgo8cpqaex1bFmJQ2cd/RV9WhfSc29syEJ1AAAAKDahSExeN/2TAQAAQKCctwxv5Q57KG/vwL0CGr97lZa/9JEag20ZrgwAAADFJhiOsiEfAAAAJBEo5y3DU9WnFcqSZBiG5hzzFZmmpT8+836GKwMAAECxCUZi8rFCGQAAACJQzluOncbLPnJcn8dXV7o1a+quev29eq35sG8rmwEAAIDeWJalUDgmbxk9lAEAAECgnLdc449R6dSz+nXNsQftopHD3Lpv1XuKxhIZqgwAAADFJNKWUMK0WKEMAAAASQTKecsyEzKDW2TF+94T2emw6ZvT99KWplY98fLHmSsOAAAARSMUiUqSvPRQBgAAgAiU81bi8/fU8scfKlH3Yb+uGzemUlPH1+ivr3yqjVtaMlQdAAAAikUwHJMk+dy0vAAAAACBct6yeaskqc8b823vtCPHqtRl171PvSfLsga7NAAAABSRYKQjUGaFMgAAAAiU85bhqZQkmaH+b7Dn97g0+4g99N76bVq9btNglwYAAIAiEgwnW174aHkBAAAAESjnLcNRIqPEm9YKZUk67KujtMdovx587gOF2leVAAAAAP3V8VnSywplAAAAiEA5rxneSpktDWldazMMzZ0xTuHWuB56vn99mAEAAIAOoXBMDrtNJU57rksBAABAHiBQzmO2qp1lOErSvn7naq+mf21nvfjmRn3wWdMgVgYAAIBiEQzH5HM7ZRhGrksBAABAHiBQzmNlR35bZUd/b0D3OOHQXVXlL9E9T72reMIcpMoAAABQLEKRGP2TAQAAkEKgPMSVuhw6++iv6LP6Fj3z+me5LgcAAAAFJhiOykf/ZAAAALQjUM5j8Y//peDd35PZtGlA99n/KwHtN3a4Hv37R9ra1DpI1QEAAKAYBCMxed2uXJcBAACAPEGgnM9cpVI0LLOlccC3OuuYPSVJDzzz/oDvBQAAgOIRCtPyAgAAAF8gUM5jNk+VJMkKNQz4XsPLy3TiobvpX//Zon+9Xz/g+wEAAGDoiydMhdvi8tLyAgAAAO0IlPOY4amUJJktAw+UJemYSTtrdMCj+595X63R+KDcEwAAAENXsCUqSaxQBgAAQAqBch4zHC4Zpb5BWaEsSQ67TXNn7KWG5jY9/o+PB+WeAAAAGLqaOgJleigDAACgHYFynjM8lYO2QlmS9typQtO+OlKr/rlen20ODdp9AQAAMPQ0t7RJkrysUAYAAEA7AuU85z7+Ryqb/r+Des/ZR4yVu9She556T6ZlDeq9AQAAMHQ0hTpWKBMoAwAAIIlAOc8ZpV4ZtsH9bfKWOXXakWP1wYYm/X3N54N6bwAAAAwdze0tL7y0vAAAAEA7AuU8F//kXwo/cb2seNug3veQCTX6ys4V+vPfPlBzODqo9wYAAMDQ0BEoe0odOa4EAAAA+YJAOc9ZbWElNr4jK9Q4qPc1DEPfnLGXWqMJ/flvHwzqvQEAADA0NIfa5Cl1yGHnPxsAAACQxFKDPGd4qyRJZkuDbBU1g3rv0cM9OnbyLvrLy5/o0AkjtdculYN6fwAAABS25pYoG/IBAICClEjE1dhYr3i8OL6Z73C4VFkZkN2e+biXQDnP2TzJQNlqacjI/WdN3VWvvl2ne556T1edexCrTwAAAJDS1NImH/2TAQBAAWpsrFdpqVseT40Mw8h1ORllWZZaWprV2Fiv4cNHZvx5pId5zvAkVw2bocwEyiVOu+ZM/4o+3xrWU//8NCPPAAAAQGFihTIAAChU8XhUHo9/yIfJUrK1rcfjz9pqbALlPGc4XDJKfRlboSxJE/cYrgP3Cujxf3yszdsiGXsOAAAACktTKCqfm0AZAAAUpmIIkztk870SKBeA0mMukuurMzP6jDOP2lM2m6H7V70vy7Iy+iwAAADkP8uykiuUCZQBAAAGJBQK6ZJLftjn8e+++7Z+/vOrM1jRwBAoFwDHyL1k81dn9BlV/lJ947DdtfajrXrjvfqMPgsAAAD5rzWaUDxhyldGD2UAAICBCAab9Z//vNfn8ePG7aNFi36SwYoGhk35CkB8w9tKbHhbJQfNzuhzjjpwtFav/VwPPPO+9t2tSmUl/PEAAAAoVsFITJJoeQEAADBAv/71L7VlS70uueSH+uST/6q8vEIlJSW65ppf6LrrrlZ9/WZt2VKvSZMO0qJFP9G//vWG/vCHO/Wb39ypiy76tvbZZ1+9+ea/tW1boy6+eKEOPviQnL4fEsMCkNj8kaL/fkKuA2plOEoy9hy7zaZvHruXrr3nDT360n915tF7ZuxZAAAAyG+hcDJQZlM+AABQ6P6x9nP9fc3nGbn3oRNH6pAJI3c45uKLF+r73/+O5s///3TqqSfoz3++RSNHjtLTT6/Unnt+RT/72fWKxWKaM+dUvffeu12uj8XiuuOOu/T3v7+opUtvJ1BG72yeSkmSFWqUUVGT0WftMapcR+w/Ws+8sV5Tx9doTI0vo88DAABAfgqGk7uE+9y0vAAAABgslZVVGjlylCTpmGOO1dtvr9OyZQ/o44//q6amJkUi4S7XTJ58sCRp9933UDDYnNV6u0OgXAAMb5UkyWxpkC3DgbIknXL47nrjvc2656l3ddk3J8lmK54dMQEAAJAUam95waZ8AACg0B0yofdVxNlSUvJF94GHHvqTnn/+OZ1wwjc0e/ZB+u9/P5RlWV2ucbmSf8FvGEa357ONTfkKgM2TDJStloasPM9d6tQZR+2p/34e1Av/3pCVZwIAACC/BNtbXvhoeQEAADAgdrtdiUSiy/HXXntVJ5xwsqZPP07RaFT/+c/7Mk0zBxX2DyuUC4DR3vLCDGUnUJakyfuM0EtrPtdDL3ykA74SULk3c72bAQAAkH+CkagcdptKXfZclwIAAFDQqqqGacSIGl177VWdjp922lm64YbrdN99d8nj8Wr8+In6/PONGj16pxxV2jcEygXAcLhUMvl02Wuyt0meYRj65oy99NPfv6oHn/tA3z5h36w9GwAAALkXCsfk97hkGLQ/AwAAGAiHw6Hf/vYPXY4feODX9Mc/Lu/2mgMOmCRJ+s1v7kwdGzlylB56aEVmiuwHWl4UCNdXj5N9xNisPrOmyq2ZU8bolbfr9NbH2VsdDQAAgNwLhmMq97IhHwAAADojUC4Qia3rFf/4X1l/7vEHj1F1ZZnue+o9xeJde70AAABgaApFkiuUAQAAgO3R8qJAxN75m2Ifvirfrrdm9blOh13fnL6Xbnzw3/rdE+9o15E+Oew2OR02Oe02Odr/cTqM1HGHvf2cwyaH3ZCz/XhbLCHTsmTja5MAAAB5LxiOalTAm+syAAAAkGcyGiivWLFCt99+u+LxuM455xydffbZnc6/8847uuyyy9TS0qJJkybpqquuksNBxt0dw1MltbXIirfJcGR3g7x9d6vSkfuP1t/+tUGvvbt5wPez24z2INr4IoB2bBdOb3fcsV1w3XlscozTYZfTbqTGffl+zh0cd9gNegICAAD0gBXKAAAA6E7G0tu6ujotWbJEy5cvl8vl0hlnnKHJkydr7Ngv+gAvXLhQP/vZz7Tffvvp0ksv1bJly3TWWWdlqqSCZvNWSZKsUIOMipFZf/43Z+ylM4/eU/GEqXjCUixuKpYwFY+biie++Dn5q9XpWDxhKhY35Sp1qqm5NfW6068Jq9PY1mhCsURM8fbjsS9dkzCtQXlfHaurew6dk7/abYYsSzKt5HNNy5JlSdaXf9WXjrW/Ni1J1hc/W0oONrtc13FtckzHfRx2myxLstkkm2HIZmv/x2j/Z/vjqV8lo/21vf1Xo/24zWbInnr9xfgu926/r2G0388wZBjdHzPar02dl1Kvt7/OZnQ91v39t7u3DLX/X/uvyeOSvjjf/nPy1+SRcNxSY2OL1P56+/Ptt9ruvu1jun3Gl+6/3fjU9V8at90Tuta63X2M9pts/3cbHeNMy1LCtGSaVuefze6Pb/+r1cNx0/rSMeuLe27/2u0uUWtrVHZb8s+/3Z78c+Sw2VI/2zv9bMhut3X62fHl41+6LpPfVtj+3z9r+3/3+vC64/dy+3+HOv58dvx70fFzx59TABhqEqaplta4/N7sLmQAAABA/stYoLx69WpNmTJFFRUVkqQZM2Zo5cqVuuiiiyRJGzZsUGtrq/bbbz9J0sknn6ybb76ZQLkHhqdSktT64l0qPfLbsvmGK/r235RYv6bLWOfeh8uxy36Kb/qPYm8+2eW8bcSeKtlvpqxoRK3P/67rw5ylKjvyguTzVt8vK9R5Qz67JPfUs2SrGKbouy8osX5t11vsNU2OXSYqUfeBomtWSpJKWp1qa4sl7zFiD7kmHpes4cWuu1wazlKVHn5esoZX/tSlBkuW7AeeqkRZpWLvvSRr41upcNZsD9OCI7+mYOVecjT8VxXrX0oGaduN2VY6Sh+VT5YVi2jC5r8kz5lfhLxtMaeesb6ucFtch8X+Lr9C0vbBpqS/Ow9Ri92vfeNva+fEp50DR0nvu/bVBtduqk58rvGt/ydju67lhiFtcY7Su+5JclptmhJcpe1jKcMwFDNc+r+q41RS4tSem55SWaJZ2i6AlqRXyw5T0PDpK63rNDr6iZKHrfZfpXXGOH2oXVRjfq5J1ppU0NZxn8/MgP4eHy+n2aaTXP+QUkFcclCr6dSfwlMlSSeWva4KW0uX36/HIweq0fRqsus/GufcqPb8XGb7+VejY/VubLTG2Ot1ROnbXa7/JBHQ8637qERRneF5ucv5Nqv/NUjSh9udz1UN28tGDY9FJmmb6Wmv4fNuathjuxrekaHkv9P2jhriw/V8W0cNr3S61pTUbDn0YKcawt3UcGCfatjV0V5DKrBN/rnfqGq9ak2U02rTLNtLqT/LHX+u2+TU8rZDZcnScc5/qtxoSY3p+LPd1xo65uHLdjQPktT6pXmotCfnYfuAeWXsa2qWT5Mc72usbUOXv5BYY4zTJ8bOGq06TdLaLn9B8bkxQv+y7yeXFdXRib91qSEql551HilJOiz+D3mtUJcxLzmmKmT4tE/iHY0x13c5/7Z9nD6xjVGNuUn7J978Yp7b5/FzY4T+z/ZVOa2ojjGf7zidGhWVU0/qCMmy9HW9LJ9a1PH/XDp+2542J6vJ8mp/4z3tbny23dOTz3kj/hV9YO6knYw6HeJ8W7Ks1F+0SNIGVetVa4JKFFOt7cXU3/p0zGdUTq2yHSkZ0pHm6vYatp9LQ/9wTlWLza99Em9rl8Sn251PjnjftY82OHdVIP65JkT/td17TNpsH6E1rgPktNo0rfXZ7d9CsgbDpeddX5ckTY3+XZ5ufi/+3v57sXf8be3S6ffCav+92LvT78V2UyBJqrON0JvO/eWyojoy+twXJ9rHmPYS/c11lAxDmtL6krxmqNP1kvTPsmkK233as22ddop9ou3/JsuQ9J+SfbXRtasCsY3ap7Xrvg31jhq9XXagnGabprY80+V8zHBqtXe6JGlSywvymF3n4XXPNIXtfo1tXatR0U8UclRqp2PO1i4jfF3GIrdCkbgksUIZAAAAXWQsUN68ebMCgUDqdXV1tdasWdPj+UAgoLq6un49Y9iw3PR0CwSy/x89pm9fbVq7r8zWsKoqy+Ss9KnREVdL67YuY31lNnkDPoWDNjVEGrucLzNaNSzgUyIifR6u73LeVupNvcdN0W2KtXQdU1XukrPKp8b3WhUKdf1985WY7TUY2hrcJEmKBr/4b9uS4SM0POBTImJoY3PXsMdW4vmihnC9Yk2bOp03JI0YXiZnVZUaP44qFN7U5R677OKWb/xuCn+4TVvXb9UXy08l2aWxY8bo2On7KxEJaeP/+1M38+DR8fOOSNbw4CuKNbZ2GXPUaZPkrBqlxpfqFXrr3S7npxw6Rr7xhyr84b+09emXupyfuLtbp00/uL2G5d3WcPQ5B7XX8FfFGrv+x/m00/Zrr2GTQm91DcYOOXQP+cZPa6/hn13OT919mL43fWZ7DV1DK1tpic6ce4Isy1Ldn99SvLFJqcCpYx5qD5VRXqPwq2FF3/9E0heBtCRN3n+sjLEHK/7pGpmv/Dt1ndU+8Ksjy3X8pMNktoXkWvV8pzBKkiynTeOOnCLLkryr/0+2UNffi10OGq+ENyD3e1tVtuGj7e6fPD9m7CiFRx2okvp3VPnO/6VOdDxnj2Fl+upe+8sWa9Gofz7X6d6WJNMhVU36qmRZGr3mNTkjEX15kPfQPRQtDSjw6SaVb45sd3XSsJ2Ga8rwfeTb9r52+vj17YLSpNHlTu00Zpxs8Yj2fjsZWn2R9xgyHZaqvvZV2W2GRv77dbkiEX15dfMeU8dL/hqVvtso5ycfdVo9axjSpP12l3OvQ6UNaxX9x787rciWpMN2Ha7502fJbA1p070vtv9ebBcQuuyaVntkcoXz0/+Wmlu7/CXFzl/bR9GygDzv18u98UN1BMEdb7di1DAdULmXvNsM7bb+tS/+EqT9HmVlVYoMD8hlRrTrhqYv3lz7W4nbSnXUV3eRYUj7fvIPuaNd/72wHbiL2soCGr1xo4ZtbZHxpXsEdgnosBHj5Wt8XzUfvN4pfJSk3apKtfeeE2W0tWjXfz37xe9i+w9xe6nsh42TZVn6yvuvqrTtixo6/lwfunO1Qs4q7Vb/oUY1N213eXIyWsptsrsrNCKyVaO3NXT582C5/Brud8tl2lTT0Pkv1SQpapSoqrxMklS9rVn+xLYuY4Z5HXI6yhRoaVNN69Yu5zeXJdRcWqphbZZqQl86b0gq8avG75XLatXorV1riNlK9ZWaShmSxtSH5Y01fnFt+1xOrClX2DVcX2l8X6ODXX8/rWFlGl2xk4aHWrVHXVOXufa6hyk2fITs8bB22bit0zmrvYYx1X5ZljRqS0jeeNf/3St322TYXKoIRxSIb0ld3PEslxlRNGHKnmhTVaLr/+ZFbG6p/S8+hptbvpzTqk0lKilxyjCkYbEm+c0earCXaFi4VTVtvf1ebOn0/78kKWbzqKzUKWcioUDbli9OtL+PqFUilRiyJJUnGlVubev8/0glxWNtCsfL5Iw1qyLetYWVae2ibbGoyhMtKo93/d/2bYkSNSaiKrHaVB7rer5NJWoMRSVJ7tjWZA1fEgqFtc1WIiPepHKzTrF4Qq5SV04+W2HHPKUO7Td2uL665/BclwIAAIA8Y1jWl/8TdnDcfvvtamtr08UXXyxJWrZsmdatW6fFixdLkt544w3deOONeuCBByRJH3/8sb773e9q5cqVfX7G1q0hmYPU+qCvAgGf6uuDWX3mUMHcpY+5Sw/zlj7mLn3MXfqYu/Qxd/1jsxk5W5gwEHz2LRzMW/qYu/Qxd+lj7tLH3KWHeUtff+Zu06ZPVFMzJsMVZc/vf3+HJOm8877T45gvv+dMfe619T4kPTU1Naqv/2KVT319vaqrq3s8v2XLlk7nAQAAAAAAAAD5JWMtL6ZOnapbbrlFDQ0NKisr06pVq3T11Venzo8ePVolJSV64403dOCBB+qxxx7TtGnTMlUOAAAAAAAAAOTEvfferb/97WklEqYmT56ieDyuQGCEzjxzjiTpsssWavr0mdp55521ZMkvFYlE1NjYoG9+c55OOml2jqvvLGOB8ogRI7RgwQLNnTtXsVhMs2fP1sSJE3XBBRdo/vz5mjBhgm644QZdfvnlCoVC2nfffTV37txMlQMAAAAAAACgSIVXXNftcXftJZKk1tX3y9z6aZfzJQefJfvwMYq995Ji7/+9x+t35JVXVuu9997R0qX3yDAMXX31TzVmzK565pmndOaZcxQOt2jdurW68sprddttN+ucc87TpEkHacOGzzRv3lnFEyhLUm1trWprazsdW7p0aerncePG6aGHHspkCQAAAAAAAACQM6+//k+9/fY6nXfeNyVJbW2tGjGiRtFomz77bL3Wrn1ThxxymJxOpy666GK9+urLuvfeu/Thhx8oEgnnuPquMhooAwAAAAAAAECu9baSuHTq2Ts879zrMDn3OiytZ5tmQqeddqbOOCPZ3iIYDMput8vj8erZZ1dp3bo1mjNnniTppz9dJJ/Pr0MOOUxHHTVdzzzzVFrPzKSMbcoHAAAAAAAAAMXugAO+pqeeelLhcFjxeFyXXPIDPf/8s5o+/Vg999zT+uyz9Zo4cT9J0muv/VPnn/9dHXbYEXrlldWSpEQikcPqu2KFMgAAAAAAAABkyKGHTtMHH7yvb397nkwzocmTp+q442bJMAyVl1do330nyDAMSdK5516gCy88XyUlLu2xx54aOXKUPv98Y47fQWcEygAAAAAAAACQQfPmna95887vcvzmm3/b6fUZZ8xJtcbY3nnnfSdjtfUXLS8AAAAAAAAAAH1CoAwAAAAAAAAA6BMCZQAAAAAAAABAnxAoAwAAAAAAABhyLMvKdQlZk833yqZ8AAAAQB+tWLFCt99+u+LxuM455xydffbZqXPvvPOOFi1alHrd0NCg8vJyPfHEE9q4caMWLlyorVu3arfddtMNN9wgj8eTi7cAAABQFBwOl1pamuXx+GUYRq7LySjLstTS0iyHw5WV5xEoAwAAAH1QV1enJUuWaPny5XK5XDrjjDM0efJkjR07VpK0995767HHHpMkRSIRnXrqqbryyislSVdddZXOOussHX/88br11lt12223aeHChbl6KwAAAENeZWVAjY31CoW25bqUrHA4XKqsDGTnWVl5CgAAAFDgVq9erSlTpqiiokKSNGPGDK1cuVIXXXRRl7F33HGHvva1r2nSpEmKxWJ67bXXdOutt0qSTj75ZM2ZM4dAGQAAIIPsdoeGDx+Z6zKGJAJlAAAAoA82b96sQOCLVR/V1dVas2ZNl3HBYFDLli3TihUrJEmNjY3yer1yOJIfvQOBgOrq6vr9/GHDvGlWPjCBgC8nzy10zFv6mLv0MXfpY+7Sx9ylh3lLH3OXewTKAAD8/+3da2wUZRvG8Wt7oiAaXG1BoZFARBoNSmjCWagIlHbXAjVSJBQpAiIxAgpaMSmWimQlEYVqjAcgoYFWYoU2HlASkQBBioqAcoiAAtVSKMIWS1vY5/3A677vdhe6TIXd2v/v28wz0z5z5+7kyrOzUwAIgsfj8Xn/njEm4Pv4NmzYoIcffli33XbbFY+z8h6/06dr5PHc2H8sExd3s6qq3Df0d/4bUDfrqJ111M46amcdtbOGullH7a5NRITtujyU0KIXlCMiQvNC7VD93n8DamcdtbOGullH7ayjdtZRO+uoXfCs1qpTp04qLy/3bldVVSk+Pt7vuK+++krTp0/3btvtdrndbl26dEmRkZFXPO96zbu56C1rqJt11M46amcdtbOO2llD3ayjdsG7XrWyGWNu7GMOAAAAQAtUWVmp8ePHa926dWrbtq0yMzO1cOFC9erVy3uMMUZ9+/bVli1b1KZNG+/+adOmyel0yul06p133tHJkyeVm5sbissAAAAAmiUi1BMAAAAAWoKOHTtq9uzZysrK0ujRo+VwONSrVy9NnTpVe/bskSRVV1crOjraZzFZknJzc1VcXKzU1FSVl5dr1qxZIbgCAAAAoPl4QhkAAAAAAAAAEBSeUAYAAAAAAAAABIUFZQAAAAAAAABAUFhQBgAAAAAAAAAEhQVlAAAAAAAAAEBQWFAGAAAAAAAAAASFBWUAAAAAAAAAQFBYUAYAAAAAAAAABIUF5SsoLS1VamqqRowYocLCQr/xn3/+WWPHjtXIkSM1f/58Xbx4MQSzDD/Lly9XWlqa0tLS5HK5Ao4nJycrPT1d6enpAWvbWk2cOFFpaWne2uzevdtnnJ4L7KOPPvLWLD09XX369FFeXp7PMfSdv5qaGjkcDh0/flyStG3bNjmdTo0YMUJvvPFGwHMqKio0YcIEpaSkaMaMGTp//vyNnHJYaFy3oqIiORwOOZ1O5eTkqL6+3u+ckpISDRo0yNt/V6rvv13j2uXk5GjEiBHeunz55Zd+59Bzl/1/7TZv3uxzz+vXr5+mT5/udw59h2tB7rWO7Gsd2dcasu+1I/daR/a1juxrHdm3hTDw88cff5jk5GRz5swZc/78eeN0Os2hQ4d8jklLSzPff/+9McaYnJwcU1hYGIKZhpetW7eacePGmbq6OlNfX2+ysrLMxo0bfY6ZPn26+e6770I0w/Dl8XjMoEGDTENDwxWPoeeadvDgQTN8+HBz+vRpn/30na8ffvjBOBwOc++995pjx46Z2tpaM2TIEPPbb7+ZhoYGk52dbb7++mu/86ZNm2bKysqMMcYsX77cuFyuGz31kGpct8OHD5vhw4cbt9ttPB6PmTdvnlmxYoXfeXl5eaa0tPTGTziMNK6dMcY4HA5TWVl51fNae88ZE7h2fzt58qQZNmyYOXLkiN959B2CRe61juxrHdn3n0H2bRq51zqyr3VkX+vIvi0HTygHsG3bNvXr108dOnRQu3btNHLkSH3++efe8RMnTujChQt64IEHJEljx471GW+t4uLi9OKLLyomJkbR0dHq3r27KioqfI7Zu3ev3n33XTmdTuXl5amuri5Esw0vhw8fliRlZ2frkUce0erVq33G6bngLFiwQLNnz5bdbvfZT9/5Ki4uVm5uruLj4yVJP/74o+666y4lJCQoKipKTqfTr78aGhq0c+dOjRw5UlLr7MHGdYuJiVFubq7at28vm82mHj16+N3zJGnPnj0qKSmR0+nU888/r7Nnz97oqYdc49rV1taqoqJCL730kpxOp9566y15PB6fc+i5yxrX7v+5XC5lZmaqa9eufmP0HYJF7rWO7Gsd2fefQfZtGrnXOrKvdWRf68i+LQcLygGcPHlScXFx3u34+HhVVlZecTwuLs5nvLW6++67vaHv6NGj+uyzzzRkyBDv+Pnz55WYmKi5c+eqpKRE586d09tvvx2i2YaXc+fOqX///iooKNDKlSu1du1abd261TtOzzVt27ZtunDhgkaNGuWzn77z9+qrryopKcm73dQ9T5LOnDmj9u3bKyoqSlLr7MHGdevcubMGDhwoSaqurlZhYaGGDRvmd15cXJyefvppbdiwQXfccYff11Jbg8a1O3XqlPr166dFixapuLhY5eXlWrdunc859NxljWv3t6NHj+rbb79VVlZWwPPoOwSL3Gsd2dc6sm/zkX2DQ+61juxrHdnXOrJvy8GCcgAej0c2m827bYzx2W5qvLU7dOiQsrOzNW/ePJ9Pjm666Sa999576t69u6KiopSdna3NmzeHbqJhpHfv3nK5XLr55ptlt9v16KOP+tSGnmva2rVrNXnyZL/99F3TgumvQPvowcsqKys1adIkZWRkqG/fvn7jBQUF6tOnj2w2m5588klt2bIlBLMMLwkJCSoo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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_pooling_adapted.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Lookup \n",
+ "\n",
+ "In contrast to the first Hopfield
setting, in which the state patterns as well as the stored patterns are directly dependent on the input, HopfieldLayer
employs a trainable but fixed stored pattern matrix, which in turn acts as a learnable lookup table."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "latch_samples_unique = [_[r'data'] for _ in data_loader_train]\n",
+ "latch_samples_unique = torch.cat(latch_samples_unique).view(-1, latch_samples_unique[0].shape[2]).unique(dim=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_lookup = HopfieldLayer(\n",
+ " input_size=latch_sequence_set.num_characters,\n",
+ " quantity=len(latch_samples_unique))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_lookup.output_size * latch_sequence_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield_lookup, Flatten(start_dim=1), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Hopfield-based Lookup "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=18)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABZQAAAHsCAYAAABFbSiOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABvCUlEQVR4nO3deXhU5fn/8c+ZLclMZghLAohWW7FiBerCTzEgalVQIKKAiksREaq2lsrXoqC2KC4o1eJS2yparYoVagXFWkSxKgq24rdfBFHUuouEsGUmM0lmO78/khmNE8x6Mtv7dV29yjnPOTP3PBm5ntzc534M0zRNAQAAAAAAAADQAlu6AwAAAAAAAAAAZAcSygAAAAAAAACAViGhDAAAAAAAAABoFRLKAAAAAAAAAIBWIaEMAAAAAAAAAGgVEsoAAAAAAAAAgFYhoQwAAAAAAAAAaBVHugPoiN27g4rHzS59z549i7VzZ02Xvmc+YX6txfxai/m1FvNrLebXWsyvtdoyvzaboe7dPRZHZA3WvrmH+bUW82st5tdazK+1mF9rMb/WyoS1b1YnlONxs8sX1Yn3hXWYX2sxv9Zifq3F/FqL+bUW82utfJhf1r65ifm1FvNrLebXWsyvtZhfazG/1kr3/NLyAgAAAAAAAADQKiSUAQAAAAAAAACtktUtLwAAANA6pmmqpqZatbU1isdj6Q6nU23fblM8Hm9yzmazq6ioWMXF3WQYRpoiAwAAAHIPCWUAAIA8sHt3lQzDUI8evWW3O3Iqyepw2BSNfpVQNk1TsVhUgcAe7d5dpR49ytIYHQAAAJBbaHkBAACQB8LhOpWU9JTD4cypZHJzDMOQw+FUSUlPhcN16Q4HAAAAyCkklAEAAPKCKcPIr6Vfw+dlh3EAAACgM+XXbxUAAAAAAAAAgHYjoQwAAIAuV1NTozlzftnq6999d7NuueUGCyMCAAAA0BpsygcAAIAuFwj49f77W1p9/YABP9Ds2T+wMCIAAAAArUFCGQAAAF3ujjt+ox07qjRnzi/1yScfqVu3EhUUFOimmxZo/vwbVFW1XTt2VGnIkKM0e/av9J//vKk//ek+/e539+myy36iH/zgUG3Y8H/as2e3rrjiKh111DHp/kgAAABAXiChDAAAkIde2/ilXn3rS0tee/jgvho2qO+3XnP55bP0859frBkz/kdnnnma/vrXu9W37z56/vmVOuig7+vGG29VJBLR+eefqS1b3k25PxKJ6t57H9Srr76ie++9h4QyAAAA0EVIKAMAACCtunfvob5995EknXzyKdq8eZOWLn1MH3/8kaqrq1VbG0q55+ijGxLI3/vegfL7/V0aLwAAAJDPSCgDAADkoWGDWq4i7ioFBQXJPz/xxON66aUXddppZ2jixKP00Uf/lWmaKfe4XC5JkmEYzY4DAAAAsIYt3QEAAAAg/9jtdsVisZTzb7zxL5122niNHHmqwuGw3n//PcXj8TREuHc1NTUaO3asPv/885Sxd955R+PHj9eoUaN0zTXXKBqNSpK2bt2q8847T6eccoouvfRSBYPBrg4bAAAA6BQklAEAANDlevToqd69++jmm69vcv6ss87Vgw/ep8mTz9add96ugQMH68svt6YpylQbNmzQOeeco48//rjZ8VmzZunXv/61nnvuOZmmqaVLl0qSrr/+ep177rlauXKlBg4cqN///vddGDUAAADQeWh5AQAAgC7ncDj0xz/+KeX8kUf+P/3lL082e88RRwyRJP3ud/clz/Xtu4+WL/+7otGuqWJeunSp5s6dqyuvvDJl7IsvvlBdXZ0OO+wwSdL48eN111136cwzz9Qbb7yhe+65J3n+/PPP16xZs7okZgAAAKAzkVBug5f/7wvZnQ4NP7R3ukMBAABAGtx00017Hdu+fbtKS0uTx6WlpaqsrNTu3btVXFwsh8PR5Hw22PrIrxWJRFPOuyvmSJLq1i5WfOenKeMFx5wre6/9FdmyRpH3Xk0Zd35/uJwHH6vYjk9Uv+6xlHFbz++osPw8SVJoxXzVR+L6cmdQX2+XvcQ+TpJ0QvxVlZk7U17jn7Zh2m700qHxdzXQ3JIyvsk4WG/bBqjM3KET4q+ljG83euqftuGSpLNjT6WMd0YM7zgO0Vvm99MaQybMg1UxGIaS35l8ngerYpgUf0rNtbDPt3ng74fsjIG/H/j7IR0xrCo5W7+YOFg2m9FsbNmEhHIbbPpwl7ZX15FQBgAAQIp4PC7D+OoXBNM0k5sGfv28pJTj1ujZs7jDMbbVVklOZ+qvDKWlXknSjiKXws2Md+/uUUGpV4GthQo0M+71Fspb6lV9zKOdzYy7ilzq1fgeW50OBWrrVBeOyet2KfE72H6lvobX2uNSYcSe8hq9u3lU4PKpZ7BIhaHU8Z7uIu3n8akkXKvC6tRxr9Ol/Uoa3qOwKnW8M2IocRekPYZMmAdiyM4YCjIghkyYB/5+IAZiSI2Bvx+aj+GAft1UWurtlIRyYi2WLoaZxdti79xZo3i868J/+Lkt+t/3qnTHz4d32Xvmm9JSr6qqAukOI2cxv9Zifq3F/FqL+bVWJszvtm2fqE+f/dMag1UcDtteW15883PbbEanJGZ/9KMf6eGHH9a+++6bPPfFF19oypQpev755yVJ69ev11133aUHHnhARx99tN544w3Z7XZ9+eWXOv/887V69eo2vWdXr32lzPjuStLTr32k5Ws+0n2zjpfDnjvbwGTK/OYq5tdazK+1mF9rMb/WYn6t1Zb57ay1b8rrdvor5jCf26lAKKxYhu00DgAAgPTr16+fCgoK9Oabb0qSnnrqKY0YMUJOp1NDhgzRs88+K0lavny5RowYkc5Qs04gGJGn0JFTyWQAAIBsxYqsDXwel0xTqglF0h0KAAAAMsT06dO1ceNGSdJtt92m+fPn65RTTlEoFNLkyZMlSXPnztXSpUs1evRorV+/XpdffnkaI84+1aGwvG5XusMAAACA6KHcJr7GRaw/FFG34oI0RwMAAIB0efHFF5N/XrRoUfLPAwYM0BNPPJFyfb9+/fTII490SWy5KBAMy+d2pjsMAAAAiArlNvE2LmL9wXCaIwEAAADyhz8Uls9DhTIAAEAmIKHcBolFrD9EQhkAACDdHnjgXj3wwL3pDgNdwB8My0tCGQAAICOQUG6DREI5QIUyAAAA0CWisbiCddFk+zkAAACkFz2U28Bd4JDDbqiaCmUAAJADQivmN3veXTFHklS3drHiOz9NGS845lzZe+2vyJY1irz36l7vb8kjjzykf/7zecVicR199FBFo1GVlvbWOeecL0m65ppZGjlytPbbbz8tXPgb1dbWavfuXfrxj6fo9NMntvZjIsvV1DZsiE3LCwAAgMxAhXIbGIahbsUFCgQj6Q4FAAAgq73++lpt2fKOFi16WA8+uFhVVVXy+brphReekySFQkFt2rRR5eXDtWLFU7rggot0//0P6667/qh77rkrzdGjKyX2L2FTPgAAgMxAhXIbdSsuoIcyAADICS1VEheWn/et486Dj5Xz4GPb9d7r1/9bmzdv0kUX/ViSVF9fp969+ygcrtfnn3+mjRs3aNiwY+V0OnXZZZfrX/9ap0ceeVD//e8Hqq0Ntes9kZ0Sa28vLS8AAAAyAgnlNiopLtCu6tp0hwEAAJDV4vGYzjrrHE2a1NDeIhAIyG63y+Mp1urVq7Rp01s6//wpkqRf/3q2vF6fhg07VieeODJZxYz8kHg6sBstLwAAADICLS/aqMRboAAVygAAAB1yxBH/T88996xCoZCi0ajmzLlCL720WiNHnqIXX3xen3/+mQYPPkyS9MYb/9a0aZfo2GOP1+uvr5UkxWKxNEaPrkSFMgAAQGahQrmNGlpeRGSapgzDSHc4AAAAWWn48BH64IP39JOfTFE8HtPRR5fr1FPHNuxZ0a1Ehx46KLnWmjp1ui69dJoKClw68MCD1LfvPvryy61p/gToKv5gWA67oaICe7pDAQAAgEgot1lJsUuRaFx14ZiKCpg+AACA9poyZZqmTJmWcv6uu/7Y5HjSpPOTrTG+7qKLLrYsNmQOfygsr9tFMQcAAECGoOVFG5V4CySJjfkAAACALhAIReSjfzIAAEDGIKHcRt2KGxLKic1BAAAAAFjHHwzLR/9kAACAjEFCuY0SCeXqIBXKAAAgu5imme4QulS+fd5c5Q+F5XM70x0GAAAAGpFQbqPujS0vArS8AAAAWcRudygSya/1SyQSlt3OnhfZzDRN+YO0vAAAAMgkJJTbyOehhzIAAMg+xcUl2rOnSuFwfc5X7pqmqXC4Xnv2VKm4uCTd4aAD6sIxRWNxeWl5AQAAkDEo2Wgjp8Mmd4GDHsoAACCrFBV5JEnV1TsUi0XTHE3nstlsisfjTc7Z7Q55vd2TnxvZyd/YZs7noeUFAABApiCh3A4+j0vVVCgDAIAsU1TkyckEa2mpV1VVgXSHAQskngpkUz4AAIDMQcuLdvC5nQqwKR8AAABgKX/jU4H0UAYAAMgcJJTbwetx0UMZAAAAsFhiI2x6KAMAAGQOEsrt4PO4kv3cAAAAAFgjseb2uumhDAAAkClIKLeDz+1SsC6qaCze8sUAAAAA2sUfCstT6JDDzq8tAAAAmYKVWTv4GiskamojaY4EAAAAyF3+UIT+yQAAABmGhHI7JBa1tL0AAAAArOMPhumfDAAAkGFIKLdDYlHLxnwAAACAdQKhcPLpQAAAAGQGEsrtkKhQDgRpeQEAAABYxR8M0/ICAAAgw5BQbgdfY4VyNS0vAAAAAEtEY3EF66LJtTcAAAAyAwnldigqsMthNxSg5QUAAABgiUCo4WlALxXKAAAAGYWEcjsYhiGv20UPZQAAAMAiieINKpQBAAAyCwnldvJ5XPLTQxkAAACwRKJ4w+dhUz4AAIBMQkK5nXxUKAMAAACW8QepUAYAAMhEJJTbyed20kMZAAAAsEjiaUAvCWUAAICMQkK5nRpaXoRlmma6QwEAAAByTiAUlsNuU1GBPd2hAAAA4GtIKLeT1+1SNGaqtj6W7lAAAACAnOMPheXzOGUYRrpDAQAAwNeQUG6nxOYgtL0AAAAAOp8/GKHdBQAAQAYiodxOPk/D4rY6SEIZAAAA6Gz+UFjdPCSUAQAAMg0J5XZK7DZNhTIAAADQ+QKhsLxuZ7rDAAAAwDeQUG6nxON3/lAkzZEAAAAAucU0TfmD4WQRBwAAADKHpQnlFStWaPTo0Ro5cqQWL1681+teeukl/ehHP7IylE6XqJbw0/ICAAAA6FS19TFFYyY9lAEAADKQw6oXrqys1MKFC/Xkk0/K5XJp0qRJOvroo9W/f/8m1+3YsUO33nqrVWFYxmG3yVPokJ+WFwAAAECnSrSVo4cyAABA5rGsQnnt2rUaOnSoSkpK5Ha7NWrUKK1cuTLlumuvvVaXXXaZVWFYyudxKUCFMgAAANCpEhtfez30UAYAAMg0liWUt2/frtLS0uRxWVmZKisrm1zz8MMP6wc/+IF++MMfWhWGpXxuFy0vAAAAgE6WqFCmhzIAAEDmsazlRTwel2EYyWPTNJscv/fee1q1apUeeughbdu2rV3v0bNncYfjbI/SUq8kqVcPtz7e6k8eo3Mwn9Zifq3F/FqL+bUW82st5tdazG9uSWx87aPlBQAAQMaxLKHcp08frV+/PnlcVVWlsrKy5PHKlStVVVWlCRMmKBKJaPv27Tr33HP12GOPtfo9du6sUTxudmrcLSkt9aqqKiBJKrAb2hOoSx6j474+v+h8zK+1mF9rMb/WYn6txfxaqy3za7MZaStKQOsl2soVF9HyAgAAINNY1vKivLxc69at065du1RbW6tVq1ZpxIgRyfEZM2boueee01NPPaX77rtPZWVlbUomZwKfx6VgXVTRWDzdoQAAAAA5ozoUlqfQIYfdsl9XAAAA0E6WrdB69+6tmTNnavLkyTr99NM1duxYDR48WNOnT9fGjRutetsulejpFmh8JA8AAABAxwWCYdpdAAAAZCjLWl5IUkVFhSoqKpqcW7RoUcp1++67r1588UUrQ7GEtzGh7A+G1d1bkOZoAAAAgNzgD0XYkA8AACBD8QxZB3RrrJrwN+5CDQAAAKDj/MGwvFQoAwAAZCQSyh3g9TRsEuIPklAGAAAAOksgFJbPzYZ8AAAAmYiEcgfQQxkAAADoXNFYXMG6KD2UAQAAMhQJ5Q4odNnldNioUAYAAAA6SaJYgx7KAAAAmYmEcgcYhiGf20kPZQAAAKCTJIo1vCSUAQAAMhIJ5Q7yul0klAEAAIBOEmhcW/s89FAGAADIRCSUO8jncdHyAgAAAOgk/mRCmQplAACATERCuYN8bheb8gEAAACdxB+khzIAAEAmI6HcQV6PU/5gWKZppjsUAAAAIOv5Q2E57DYVuuzpDgUAAADNIKHcQd3cLsXipkL10XSHAgAAAGS9QDCsbh6nDMNIdygAAABoBgnlDvI29najjzIAAADQcf5QRF7aXQAAAGQsEsodlOjtRh9lAAAAoOP8wTAb8gEAAGQwEsod5KNCGQAAAOg0/lBYXrcz3WEAAABgL0god5CvcbHrD5FQBgAAADrCNE0FQlQoAwAAZDISyh1U7HbKEBXKAAAAQEfV1kcVjZnJtnIAAADIPCSUO8hus8lT5JSfHsoAAABAhyTW1CSUAQAAMhcJ5U7g87gUoEIZAAAA6JDEU3+0vAAAAMhcJJQ7gc/tpIcyAAAA0EGBxjU1m/IBAABkLhLKncDncdFDGQAAAOggKpQBAAAyHwnlTuB1u+ihDAAAAHRQYk1dXESFMgAAQKYiodwJfG6nauujikTj6Q4FAAAAyFr+UFjFRU457PyaAgAAkKlYqXWCxCN5AfooAwAAAO3mD4bpnwwAAJDhSCh3Ap+7IaHMxnwAAABA+wWC4eTaGgAAAJmJhHIn8DZWKPuD9FEGAAAA2ssfirAhHwAAQIYjodwJfMmEMhXKAAAAQHsFQlQoAwAAZDoSyp3A19jnjR7KAAAAQPtEY3EF66LyeuihDAAAkMlIKHeCAqddLoeNHsoAAABAOwVCDe3jqFAGAADIbCSUO4FhGPJ5XLS8AAAAANopsZamhzIAAEBmI6HcSbxul/whNuUDAAAA2iPxtB8VygAAAJmNhHIn8bmdClChDAAAALRLokKZHsoAAACZjYRyJ/F5XKqmhzIAAADQLvRQBgAAyA4klDuJz+NSTSiiuGmmOxQAAAAg6/hDYTkdNhW67OkOBQAAAN+ChHIn8bpdisVNheqi6Q4FAAAAyDr+YFg+t1OGYaQ7FAAAAHwLEsqdxNfY681PH2UAAICctmLFCo0ePVojR47U4sWLU8ZffvllVVRUqKKiQldccYWCwaAkadmyZRo+fLjGjRuncePGaeHChV0dekbzh8Ly0u4CAAAg4znSHUCuSPR6C4TCkjzpDQYAAACWqKys1MKFC/Xkk0/K5XJp0qRJOvroo9W/f39Jkt/v1+zZs/XII4+of//+WrRokRYuXKhrr71WmzZt0uzZszV27Ng0f4rMFAhG1K2YhDIAAECmo0K5kyQSyv7GzUQAAACQe9auXauhQ4eqpKREbrdbo0aN0sqVK5PjH3/8sfbZZ59kgvmEE07QCy+8IEnauHGjli1bpoqKCv3yl79UdXV1Wj5DpvKHwmzIBwAAkAWoUO4kPk9jQpmWFwAAADlr+/btKi0tTR6XlZXprbfeSh4fcMAB2rZtm959910NGDBA//jHP7Rjxw5JUmlpqaZOnaojjjhCv/3tbzVv3jzdfvvtrX7vnj2LO++DtEFpqdfy9zBNU4FQWL17ebrk/TJJvn3ersb8Wov5tRbzay3m11rMr7XSPb8klDtJcZFThkgoAwAA5LJ4PN5k0zjTNJsc+3w+3XrrrfrVr36leDyus846S05nw14b99xzT/K6adOm6eSTT27Te+/cWaN43OzgJ2ib0lKvqqoClr9PqC6iaMyU01CXvF+m6Kr5zVfMr7WYX2sxv9Zifq3F/FqrLfNrsxmWFCXQ8qKT2GyGit3Oxh7KAAAAyEV9+vRRVVVV8riqqkplZWXJ41gspj59+uivf/2r/va3v+mQQw7Rfvvtp0AgoIceeih5nWmastvtXRl6Rku0jfN6aHkBAACQ6UgodyKfx6VqKpQBAAByVnl5udatW6ddu3aptrZWq1at0ogRI5LjhmFo6tSpqqyslGmaeuihhzR69Gi53W7df//92rBhgyTp0UcfbXOFci5LPOVHD2UAAIDMR8uLTuRzuxRgUz4AAICc1bt3b82cOVOTJ09WJBLRxIkTNXjwYE2fPl0zZszQoEGDNG/ePE2bNk3hcFjHHHOMLrroItntdt1xxx267rrrVFdXpwMOOEALFixI98fJGImEstftTHMkAAAAaAkJ5U7kdTv18TZ6xAAAAOSyiooKVVRUNDm3aNGi5J+PP/54HX/88Sn3DRkyRMuWLbM6vKyUaBvXjZYXAAAAGY+WF53I53GxKR8AAADQRom2ccVUKAMAAGQ8EsqdyOd2qS4cUzgSS3coAAAAQNYIhCIqLnLKbuPXEwAAgEzHiq0T+Rof0aOPMgAAANB6/lA4uZYGAABAZiOh3IkSu1L7Q7S9AAAAAForEAzLR7sLAACArEBCuRN5PQ2LYPooAwAAAK1XHYrI66ZCGQAAIBuQUO5EVCgDAAAAbddQoUxCGQAAIBuQUO5EyYQyFcoAAABAq0RjcYXqo/J5aHkBAACQDUgod6ICl10FTjub8gEAAACtlCjG8LIpHwAAQFYgodzJvG4nLS8AAACAVkoUY9DyAgAAIDuQUO5k3TwuWl4AAAAArZQoxvBRoQwAAJAVSCh3Mq/bJX+QlhcAAABAaySKMXxueigDAABkAxLKnczncSpAywsAAACgVRIVyl5aXgAAAGQFEsqdzOdxKRCKKG6a6Q4FAAAAyHiBYEROh02FLnu6QwEAAEArkFDuZF63S3HTVLCWthcAAABAS/yhsHxulwzDSHcoAAAAaAUSyp0ssTu1P0RCGQAAAGiJPxiWz0P/ZAAAgGxBQrmTJXanTmwuAgAAAGDv/KEw/ZMBAACyCAnlTpbYnZqN+QAAAICWBUKRZFEGAAAAMh8J5U7mpUIZAAAAaBXTNBtaXlChDAAAkDVIKHey4iKnDKPh0T0AAAAAexeqjyoWN5NP+QEAACDzkVDuZDbDkNftkj/IpnwAAADAt0k81eel5QUAAEDWIKFsAZ/bSQ9lAAAAoAWBUEMRBj2UAQAAsgcJZQv4PC56KAMAAAAtSKyZ6aEMAACQPUgoW8DndtFDGQAAAGhBYs1MD2UAAIDsQULZAl63S/4QPZQBAACAb+MPhmVIKiahDAAAkDVIKFvA53GqPhxTfSSW7lAAAACAjOUPReQpcspu49cSAACAbMHKzQKJHnAB+igDAAAAexUIhtmQDwAAIMuQULaAt3FRTNsLAAAAYO/8oTD9kwEAALIMCWULdEsklKlQBgAAAPbKH4pQoQwAAJBlSChbwNtYZZHYtRoAAABAKn8wLK+bhDIAAEA2IaFsgWQPZRLKAAAAQLMi0bhq66O0vAAAAMgyJJQt4HLaVeiyq5qWFwAAAECzEsUXtLwAAADILiSULeJzuxRgUz4AAACgWYn2cD5aXgAAAGQVEsoW8XqcbMoHAAAA7IU/2FB84aVCGQAAIKuQULaIz+1iUz4AAABgL5ItL+ihDAAAkFVIKFvE53EpQIUyAAAA0Cw/PZQBAACyEglli3jdLgVqI4rHzXSHAgAAAGQcfzAsl8OmAqc93aEAAACgDUgoW6SbxyXTlGpq2ZgPAAAA+CZ/MCKv2yXDMNIdCgAAANqAhLJFvI294OijDAAAAKQKhMK0uwAAAMhCJJQt4nM3LI7powwAAACk8gfDbMgHAACQhSxNKK9YsUKjR4/WyJEjtXjx4pTx559/XhUVFRozZoxmz56tcDh3kq+Jagt/iJYXAAAAwDf5Q2F5qVAGAADIOpYllCsrK7Vw4UI99thjWr58uZYsWaIPPvggOR4KhTRv3jw9+OCD+vvf/676+notW7bMqnC6XDKhTIUyAAAA0IRpmgqEIsmn+gAAAJA9LEsor127VkOHDlVJSYncbrdGjRqllStXJsfdbrdefPFF9erVS7W1tdq5c6d8Pp9V4XQ5d6FDNsOghzIAAADwDaH6qGJxkx7KAAAAWchh1Qtv375dpaWlyeOysjK99dZbTa5xOp16+eWXdeWVV6qsrEzDhw9v03v07FncKbG2VWmpt1XXlXhdisRbfz0aMF/WYn6txfxai/m1FvNrLebXWsxvdkk8xUcPZQAAgOxjWUI5Ho/LMIzksWmaTY4TjjvuOP3rX//Sb3/7W1133XW6/fbbW/0eO3fWKB43OyXe1iot9aqqKtCqaz2FTm3fGWz19Wjb/KLtmF9rMb/WYn6txfxai/m1Vlvm12Yz0laUgK8kEsr0UAYAAMg+lrW86NOnj6qqqpLHVVVVKisrSx7v2bNHr776avK4oqJCW7ZssSqctPC5nbS8AAAAAL4h0LhxdTd6KAMAAGQdyxLK5eXlWrdunXbt2qXa2lqtWrVKI0aMSI6bpqlZs2Zp69atkqSVK1fqiCOOsCqctPB5XGzKBwAAAHxDNRXKAAAAWcuylhe9e/fWzJkzNXnyZEUiEU2cOFGDBw/W9OnTNWPGDA0aNEg33HCDLr74YhmGof79++v666+3Kpy08LpdVCgDAAAA3xAIhWVIKi6y7NcRAAAAWMTSFVxFRYUqKiqanFu0aFHyzyeddJJOOukkK0NIK5/HpXAkrvpwTAUue7rDAQAAADKCPxSRp8gpu82yByYBAABgEVZwFvI19oSjShkAAAD4SiAYVjfaXQAAAGQlEsoW8nmckkQfZQAAAOBrqkNhed3OdIcBAACAdiChbCEvFcoAAABAikAwLB8VygAAAFmJhLKFEo/xBUKRNEcCAAAAZA5/KJJsDwcAAIDsQkLZQonH+KppeQEAAABIkiLRmGrro/JSoQwAAJCVSChbyOmwq6jArgAJZQAAAEDSV0/v+eihDAAAkJVIKFvM53bRQxkAAABolFgb0/ICAAAgO5FQtpjX45KfCmUAAABAkuQPNlYo0/ICAAAgK5FQtpjP7WJTPgAAAKBRotiCHsoAAADZiYSyxXweWl4AAAAACYFkywt6KAMAAGSjViWUa2pqJEmbN2/W8uXLFYlQcdtaPrdTNaGIYvF4ukMBAAAA0s4fCsvltKnQ5Uh3KAAAAGiHFhPKd955p+bOnautW7dq2rRpevLJJ3Xdddd1QWi5wet2yZRUUxtNdygAAABA2vmDYTbkAwAAyGItJpRffvll3XjjjVq1apXGjBmjhx9+WO+++25XxJYTujX2hguwMR8AAAAgfygiLwllAACArNWqlhdFRUVau3athg4dKkkKh0mOtpa3sTdcNX2UAQAAAAWCYfonAwAAZLEWE8rdu3fXddddp02bNqm8vFy33XabysrKuiK2nOCjQhkAAABI8ofCyTUyAAAAsk+LCeVbb71VZWVluvfee1VUVCTDMHTrrbd2RWw5IbFY9ofYyBAAAAD5LW6aCoQiJJQBAACyWItbK/fq1UuTJ09WcXGxNm/erAMPPFDdunXrithygrvAIbvNkJ8KZQAAAOS5UF1UsbhJD2UAAIAs1mJC+c4779Snn36qK664QtOmTVP//v31xhtv6KabbuqK+LKeYRjyup3y00MZAAAAeS7QuCb2eeihDAAAkK1abHnx8ssv68Ybb9SqVas0ZswYPfzww3r33Xe7Irac4fO46KEMAACAvJd4as9HhTIAAEDWajGhLElFRUVau3athg4dKkkKh0mOtoXP7aJCGQAAAHkvsa8ICWUAAIDs1WJCuXv37rruuuu0adMmlZeX67bbblNZWVlXxJYzvG6X/EE25QMAAEB+S1Qoe9mUDwAAIGu1mFC+9dZbVVZWpvvuu09FRUUyDEO33nprV8SWM7p5XAqEwjJNM92hAAAAAGkTCIVlSPIW0UMZAAAgW7W4KV+vXr00btw4/fvf/9Y777yjiRMnqlevXl0RW87wepwKR+OqC8dUVNDilAMAAAA5yR8Mq9jtlM1mpDsUAAAAtFOLFcpr1qzRhAkT9MILL2j16tWaOHGiXnjhha6ILWckesQF6KMMAACAPOYPReifDAAAkOVaLJe988479eijj6p///6SpPfff1+zZs3SSSedZHlwucLX2CPOH4qorHuagwEAAADSxB8KJ9fGAAAAyE4tVihHIpFkMlmSDjroIMViMUuDyjWJKozEJiQAAABAPvIHw/K66Z8MAACQzVpMKBcWFmrjxo3J440bN6qoqMjSoHJNYtHsp+UFAAAA8lggFKblBQAAQJZrseXFrFmzdMkll2j//feXYRj68MMPdeedd3ZFbDkj8VhfgAplAAAA5KlINKba+pi8tLwAAADIai0mlIcMGaK///3v2rBhg+LxuA477DB1704j4LZw2G1yFzjkD0bSHQoAAACQFom1cDcSygAAAFmtxZYXklRSUqLjjjtOJ5xwgrp3765zzjnH6rhyjtfjouUFAAAA8lZiLUwPZQAAgOzWqoTyN23ZsqWz48h53dxOBUgoAwAAZL0VK1Zo9OjRGjlypBYvXpwy/vLLL6uiokIVFRW64oorFAwGJUlbt27Veeedp1NOOUWXXnpp8ny+SKyF6aEMAACQ3dqVUEbbeT0uVdNDGQAAIKtVVlZq4cKFeuyxx7R8+XItWbJEH3zwQXLc7/dr9uzZWrhwoVasWKEBAwZo4cKFkqTrr79e5557rlauXKmBAwfq97//fbo+RlokWl74aHkBAACQ1UgodxGf26VAiB7KAAAA2Wzt2rUaOnSoSkpK5Ha7NWrUKK1cuTI5/vHHH2ufffZR//79JUknnHCCXnjhBUUiEb3xxhsaNWqUJGn8+PFN7ssHfiqUAQAAcsJeN+W78cYbmz1vmqYiERKjbeXzuFRTG1EsHpfdRh4fAAAgG23fvl2lpaXJ47KyMr311lvJ4wMOOEDbtm3Tu+++qwEDBugf//iHduzYod27d6u4uFgOR8Pyu7S0VJWVlW167549izvnQ7RRaam3U14nakoFLrv27VfSKa+XKzprftE85tdazK+1mF9rMb/WYn6tle753WtCuaSkZK83XXzxxVbEktN8jZuPBEIRlRQXpDkaAAAAtEc8HpdhGMlj0zSbHPt8Pt1666361a9+pXg8rrPOOktOpzPlOkkpxy3ZubNG8bjZsQ/QRqWlXlVVBTrltSp31Mhb5Oy018sFnTm/SMX8Wov5tRbzay3m11rMr7XaMr82m2FJUcJeE8qXXXZZp79ZPvM2PtrnD4ZJKAMAAGSpPn36aP369cnjqqoqlZWVJY9jsZj69Omjv/71r5Kkt956S/vtt5969OihQCCgWCwmu92ecl8+8AfD9E8GAADIAfRe6CKJxTN9lAEAALJXeXm51q1bp127dqm2tlarVq3SiBEjkuOGYWjq1KmqrKyUaZp66KGHNHr0aDmdTg0ZMkTPPvusJGn58uVN7ssH/lCE/skAAAA5gIRyF0kklP3BcJojAQAAQHv17t1bM2fO1OTJk3X66adr7NixGjx4sKZPn66NGzfKZrNp3rx5mjZtmk455RT5fD5ddNFFkqS5c+dq6dKlGj16tNavX6/LL788vR+mi/lDYXkb28ABAAAgfXbv3t2h+/fa8iIhGo0mNw9B+yV6KCd2twYAAEB2qqioUEVFRZNzixYtSv75+OOP1/HHH59yX79+/fTII49YHV5GipumakIRWl4AAABkgDFjxuiYY47ROeecoyFDhrT5/hYrlE844QQtXLhQX3zxRbsCRIOiAoccdoOEMgAAAPJOqC6qWNyk5QUAAEAGePHFF1VeXq4FCxaooqJCixcvVk1NTavvbzGhvHTpUtntdp1//vm6+OKL9dJLL8k0u3Z36VxgGIa8bhctLwAAAJB3Emtgr4eWFwAAAOlWWFioCRMmaOnSpbr22mv1pz/9Sccee6yuv/76VrXDaDGh3LdvX82YMUOrV6/WmWeeqRtuuEEnnnii7r//foXDJEfbwud2sSkfAAAA8k6g8Sk9KpQBAAAywyuvvKKf//znmjlzpk466SQ9/vjj6tu3r37605+2eG+rmiP/97//1V//+lc988wzOuywwzR+/HitWbNGv/jFL/SHP/yhwx8gX/g8VCgDAAAg/1Q3roHpoQwAAJB+J5xwgkpKSnTuuefqN7/5jQoLCyVJBx98sJYsWdLi/S0mlM855xx99tlnmjBhgp544gn16dNHUsNmI0OHDu1g+PnF53bqix2t70cCAAAA5ILEU3pUKAMAAKTf7bffroMPPlgej0fhcFg7d+5Uz549JUmrV69u8f4WW16ce+65+uc//6mZM2cmk8mSZLPZ9M9//rMDoecfr8clfzBCD2oAAADkFX8wLMOQiovooQwAAJBu27Zt0xlnnCFJ+uKLLzRmzBi9+OKLrb6/xQrlU089VUuWLNGrr74qu92uE044QRMmTJAkeTyedoadn3xul6KxuOrCMRUVtKrbCAAAAJD1AqGwvEVO2WxGukMBAADIe3/84x/18MMPS5K++93vatmyZfrpT3+qH/3oR626v8Ws5k033aQPPvhA48aNk2ma+tvf/qZPP/1UM2fO7FjkecjXuKu1PxgmoQwAAIC8UR0My0v/ZAAAgIwQj8ebdKLo27ev4vF4q+9vseXFa6+9pj/96U+aOHGizjzzTD344INauXJl+6LNc4mecf4QG/MBAAAgfwRCEfonAwAAZIgePXro8ccfVzQaVSwW0xNPPKFevXq1+v4WE8o9evRQLBZLHhuGIZ/P175o81xiV2t/MJLmSAAAAICu4w+F5XXTPxkAACATzJs3T0uXLtXgwYM1ePBgLV26VHPnzm31/S32XRgwYIDOPfdcjR8/Xna7Xc8++6y6d++uBx98UJJ04YUXtj/6POOlQhkAAAB5yB8MJ4srAAAAkF4HHHCAnnzySVVXV8tut6u4uLhN97eYUK6vr9fBBx+st99+W5K07777SpLee++9doSb3xJVGYEgCWUAAADkh3AkprpwjJYXAAAAGWLXrl16+umnFQwGZZqm4vG4PvnkE91+++2tur/FhPL8+fMlSV988YWi0aj233//jkWcxxx2mzyFDiqUAQAAkDcCoYZ2b1QoAwAAZIbLL79chYWF+uCDD1ReXq61a9fqyCOPbPX9LfZQ/uSTTzRmzBidfvrpGj9+vE466ST997//7VDQ+czncclPhTIAAADyRKKYggplAACAzLB161bdd999GjFihM4//3z95S9/0Ycfftjq+1tMKM+bN0/Tpk3TG2+8oTfffFOXXnqprr/++g4Fnc+8bpf8ITblAwAAQH5IFFN4PWzKBwAAkAl69eolqaGX8nvvvafevXsrGo22+v4WE8o7d+7UGWeckTyeMGGCdu/e3Y5QITVUKAdoeQEAAIA8QYUyAABAZunZs6fuv/9+DRw4UH/729/04osvqq6urtX3t5hQjsVi2rNnT/J4165d7QoUDXxuJy0vAAAAkDeSPZRJKAMAAGSEefPmyeVyaciQIRo4cKDuuusu/fKXv2z1/S1uynf++efr7LPP1qmnnirDMPTss8/qggsu6FDQ+czndilYF1U0FpfD3mI+HwAAAMhq/mBYBU67Clz2dIcCAAAASbfeeqsWLFggSZo1a5ZmzZrVpvtbTCiPHz9e+++/v9asWaN4PK65c+eqvLy8fdEiubt1IBRRd29BmqMBAAAArOUPheV10z8ZAAAgU7zzzjsyTVOGYbTr/hYTyhMnTtRTTz2loUOHtusN0JS38VE/fzBMQhkAAAA5LxAMJ4sqAAAAkH5lZWUaM2aMfvjDH8rj8STPX3vtta26v8WEclFRkbZt26Y+ffq0P0ok+Rp3t2ZjPgAAAOQDfyiinr7CdIcBAACARocffrgOP/zwdt/fYkK5trZWJ554ovr06SO32508v2LFina/aT5LVGf4SSgDAAAgD/iDYX23rzfdYQAAAKDRZZdd1qH7W0woX3PNNR16AzTlS7a8iKQ5EgAAAMBacdNUIBRJtn0DAABA+lVUVDR7vrUFxC0mlJcvX66bb765ybkZM2boqKOOatUboKlCl10Ou40KZQAAAOS8UF1UcdNMFlUAAAAg/X71q18l/xyJRPT3v/9d++23X6vv32tCee7cuaqsrNSbb76pXbt2Jc9Ho1F99tln7QwXhmGom8epQJCEMgAAAHJbdeOal035AAAAMsc3C4XLy8s1adIkXXrppa26f68J5YkTJ+r999/Xli1bNGrUqOR5u92uww47rH3RQpLkdbtUTYUyAAAAclyiiMLndqY5EgAAAOzN7t27tX379lZfv9eE8qBBgzRo0CCVl5erT58+nRIcGvg8LlXXkFAGAABAbku0efNSoQwAAJAxvtlDeevWrTr77LNbfX+LPZS//PJLzZo1S9XV1TJNM3m+tU2akcrndumz7TXpDgMAAACwVCDUsBE1LS8AAAAyx9d7KBuGoR49eujAAw9s9f0tJpR//etfa/z48frBD34gwzDaFyWa8HqcCoTCMk2TOQUAAEDOqg6GZRhScSEtLwAAADLFd77zHf3xj3/Uddddpw8//FC33Xab5s2bp169erXq/hYTyg6HQxdeeGGHA8VXfG6XojFTtfVRuVlcAwAAIEcFQmF5i5yy2SiiAAAAyBSzZ8/Wj370I0lSv379dNRRR2nOnDlatGhRq+63tXTBQQcdpC1btnQsSjSReOTP3/gIIAAAAJCL/MEw/ZMBAAAyzO7duzV58mRJUkFBgaZMmaKqqqpW399ihfJnn32mCRMmaJ999lFBQUHyPD2U28/nbkwoB8Pq08Od5mgAAAAAa/hD4eTaFwAAAJkhFoupsrJSvXv3liTt2LGjyd55LWkxoTxz5sz2R4dmed0NbS78wXCaIwEAAACsEwhG9N19itIdBgAAAL5mypQpOv3003XsscfKMAytXbtWV155ZavvbzGhfNRRR+mtt97S5s2bNX78eL399ts6/PDDOxR0vuvW+NhfIERCGQAAALnLHwoniykAAACQGSZOnKiBAwfq9ddfl91u17Rp03TQQQe1+v4Weyg/+eSTmjNnju6//34FAgH99Kc/1dKlSzsUdL4rblxUV1OhDAAAgBwVjsRUF44liykAAACQGSorK/X4449rypQpGjZsmBYuXNimHsotJpQfeeQRLVmyRMXFxerZs6eefPJJ/fnPf+5Q0PnObrOpuMipAJvyAQAAIEf5G5/G89JDGQAAIKNcddVV+t73vidJ6tevn4466ihdffXVrb6/xYSyzWZTcXFx8rhv376y2+3tCBVf5/O4kotsAAAAINckiifYlA8AACCz7N69W5MnT5YkFRQUaMqUKZ1boVxSUqJ33nlHhmFIkp5++ml169atneEiwed2sikfAAAAclZirev10EMZAAAgk8RiMVVWViaPd+zYIdM0W31/i5vyXX311frFL36hTz/9VMOHD1dBQYF+//vfty9aJHndLn26vSbdYQAAAACWSCSUu1GhDAAAkFGmTJmi008/Xccee6wkad26dbryyitbfX+LCeUDDzxQTz31lD7++GPFYjF997vfldNJlUFH+TwuBahQBgAAQI6ihzIAAEBmmjhxogYOHKjXX39ddrtd3/nOd/Twww+roqKiVfe32PJCkux2uw488EDdfvvtJJM7ic/tVKg+qkg0nu5QAAAAgE4XCEVU4LSrwMX+KwAAAJmmb9++CofDuv/++/XnP/85Wa3cGi1WKH/d9u3b2xTYihUr9Ic//EHRaFQXXHCBzjvvvCbjL7zwgu6++26Zpql9991X8+fPz5v+zF5PQ6VGIBRWD19hmqMBAAAAOpc/FJaP/skAAAAZ5cMPP9Sf//xnPf300+rXr5/q6ur04osvyuv1tvo1WlWhnNCW5syVlZVauHChHnvsMS1fvlxLlizRBx98kByvqanRddddp/vuu09PP/20Dj74YN19991tCSerJXrJJXa/BgAAAHKJPxiWj3YXAAAAGeMnP/mJzj//fDmdTj388MN65pln5PF42pRMltqYUJ4xY0arr127dq2GDh2qkpISud1ujRo1SitXrkyORyIRzZ07V71795YkHXzwwfryyy/bEk5WS1QoV9NHGQAAADnIH4zQPxkAACCDbN68WYceeqgOOugg7b///pIkwzDa/DotJpR37Nih1atXS5LefPNNXXDBBXr33XdbfOHt27ertLQ0eVxWVqbKysrkcffu3XXyySdLkurq6nTffffppJNOavMHyFY+d8Pjf4EQCWUAAADkngAtLwAAADLKSy+9pDPOOEPPPPOMhg8frhkzZqi+vr7Nr9NiD+XZs2dr+PDhWrdundasWaMpU6boxhtv1KOPPvqt98Xj8SYZbtM0m814BwIB/exnP9OAAQN0xhlntCn4nj2L23R9ZyktbVsZeHOKfUWSpLhhdMrr5RLmw1rMr7WYX2sxv9Zifq3F/FqL+c0scdNUIBSRz0OFMgAAQKZwOBwaPXq0Ro8erQ8++ECPP/646uvrNXLkSF144YU655xzWvc6LV2wZ88eTZkyRbfeeqvGjh2r8ePHa/HixS2+cJ8+fbR+/frkcVVVlcrKyppcs337dl100UUaOnSorr766lYF/HU7d9YoHm99X+fOUFrqVVVVoMOvY5qmXA6btm4PdMrr5YrOml80j/m1FvNrLebXWsyvtZhfa7Vlfm02I21FCfkkWBtR3DRpeQEAAJCh+vfvr2uvvVZXXHGFnn76aT3++OOtTii32PIiEokoEolozZo1Ki8vV21trUKhUIsvXF5ernXr1mnXrl2qra3VqlWrNGLEiOR4LBbTJZdcolNPPVXXXHNNu/p1ZDPDMOR1u+QPsikfAAAAcou/ceNpNuUDAADIbEVFRTr77LO1bNmyVt/TYoXyiSeeqGOOOUaHHHKIBg4cqLFjx2rs2LEtvnDv3r01c+ZMTZ48WZFIRBMnTtTgwYM1ffp0zZgxQ9u2bdPmzZsVi8X03HPPSZIGDhyom266qdXBZzufx0UPZQAAAOScQOPG07S8AAAAyD0tJpRnzJihs846S71795Yk3XbbbRowYECrXryiokIVFRVNzi1a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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_lookup.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Adapt Hopfield-based Lookup \n",
+ "We can now again explore the functionality of our Hopfield-based lookup layer HopfieldLayer
. \n",
+ "\n",
+ "This lookup setting is especially pronounced, if the state patterns are initialized with a subset of the training set (and optionally provide the corresponding training targets as pattern projection inputs).\n",
+ "\n",
+ "Again, additional arguments are set to increase the training as well as the validation performance of the Hopfield-based lookup.\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " lookup_weights_as_separated
\n",
+ " True \n",
+ " Separate lookup weights from lookup target weights (e.g. to set lookup target weights separately). \n",
+ " \n",
+ " \n",
+ " lookup_targets_as_trainable
\n",
+ " False \n",
+ " Employ trainable lookup target weights (used as pattern projection input). \n",
+ " \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "hopfield_lookup = HopfieldLayer(\n",
+ " input_size=latch_sequence_set.num_characters,\n",
+ " quantity=len(latch_samples_unique),\n",
+ " lookup_weights_as_separated=True,\n",
+ " lookup_targets_as_trainable=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Initialize the trainable but fixed stored patterns with all unique samples from the training set. In this way, the Hopfield-based lookup already starts with meaningful stored patterns (instead of random noise). This may enhance the performance of the network, especially at the beginning of the training."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with torch.no_grad():\n",
+ " hopfield_lookup.lookup_weights[:] = latch_samples_unique.unsqueeze(dim=0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output_projection = Linear(in_features=hopfield_lookup.output_size * latch_sequence_set.num_instances, out_features=1)\n",
+ "network = Sequential(hopfield_lookup, Flatten(start_dim=1), output_projection, Flatten(start_dim=0)).to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=1e-3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "losses, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=18)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ypUaM2aMRo0apSVLljQ5/t5772nChAkaPXq0rrzySkWj0RREmbn+9Kc/aezYsRo7dqwWLlzY7PHjjjtO48eP1/jx45v9HWD3fvrTn2rs2LHJ/L399tuNjvP9bb/HHnssmdfx48frRz/6kRYsWNDoHL6/bVddXa1x48bpiy++kCStWbNGZWVlGjVqlBYtWtTsNVu3btXZZ5+tk046SRdffLGCwWBXhpxRvpvfRx99VOPGjVNZWZmuuOIKhcPhJtcsX75cI0aMSH6Pd/d7QNP8XnHFFRo1alQyd88991yTa/j+tt638/vyyy83+jN42LBhuvDCC5tcw/e37Vj7Wou1r7VY+1qHta91WP9ah7WvtVj7Witj1r4mmvj666/N4447zty5c6cZDAbNsrIy88MPP2x0ztixY83//Oc/pmma5hVXXGEuWbIkBZFmptdee80888wzzbq6OjMcDptTp041V69e3eicCy+80Py///u/FEWY2eLxuDlixAgzEons9hy+v53jgw8+ME888URzx44djZ7n+9s2//3vf81x48aZBx10kLllyxazpqbGPOaYY8zPP//cjEQi5vTp082XXnqpyXUXXHCB+fTTT5umaZp/+tOfzIULF3Z16Bnhu/n9+OOPzRNPPNEMBAJmPB43L7/8cvO+++5rct2CBQvMlStXdn3AGea7+TVN0xw3bpxZXl7+vdfx/W2d5vKbsG3bNvP44483P/nkkybX8f1tG9a+1mLtay3Wvl2HtW/nYf1rHda+1mLta61MWvvSodyMNWvWaNiwYSouLpbb7dbo0aO1atWq5PEvv/xStbW1OvTQQyVJEyZMaHQc36+kpERz586Vy+WS0+nUvvvuq61btzY6Z+PGjbr77rtVVlamBQsWqK6uLkXRZp6PP/5YkjR9+nSdcsopeuihhxod5/vbeebPn6/Zs2ere/fujZ7n+9s2S5cu1bx581RaWipJeuedd7TXXnupX79+cjgcKisra/IdjUQiWrdunUaPHi2J7/H3+W5+XS6X5s2bp8LCQhmGof3337/Jn8GStGHDBi1fvlxlZWX61a9+paqqqq4OPSN8N781NTXaunWrfvOb36isrEy33Xab4vF4o2v4/rbed/P7bQsXLtTkyZO19957NznG97dtWPtai7WvtVj7dh3Wvp2H9a91WPtai7WvtTJp7UtBuRnbtm1TSUlJ8nFpaanKy8t3e7ykpKTRcXy//fbbL7mg+/TTT/XPf/5TxxxzTPJ4MBjUAQccoDlz5mj58uXy+/268847UxRt5vH7/TryyCN1xx136P7779ff//53vfbaa8njfH87x5o1a1RbW6uTTz650fN8f9vuuuuu05AhQ5KPW/ozWJJ27typwsJCORwOSXyPv89389u3b18dddRRkqTKykotWbJExx9/fJPrSkpK9LOf/UxPPfWU+vTp0+T2VtT7bn63b9+uYcOG6frrr9fSpUu1fv16Pf74442u4fvbet/Nb8Knn36qN998U1OnTm32Or6/bcPa11qsfa3F2rdrsPbtXKx/rcPa11qsfa2VSWtfCsrNiMfjMgwj+dg0zUaPWzqO1vnwww81ffp0XX755Y3+hcXj8Wjx4sXad9995XA4NH36dL388supCzTDHHbYYVq4cKG8Xq+6d++uSZMmNcof39/O8fe//13nnXdek+f5/nZca76jzT3H97htysvLde6552rixIkaOnRok+N33HGHfvSjH8kwDM2YMUOvvvpqCqLMPP369dMdd9yh0tJSFRQU6Kc//WmTPwP4/nbco48+qilTpsjlcjV7nO9v27D27Rqsfa3B2rdrsPa1Futf67H2tQZr366RjmtfCsrN6N27tyoqKpKPKyoqGrWbf/f49u3bm21Hx+699dZbmjZtmi677DKddtppjY5t3bq10b9omaaZ/JcstGz9+vVau3Zt8vF388f3t+PC4bDWrVunn/zkJ02O8f3tuJb+DJak7t27KxAIKBaL7fYc7N7//vc/TZ48Waeddpp+/vOfNzkeCAR0//33Jx+bpim73d6FEWau999/X88++2zycXN/BvD97bgXXnhBY8aMafYY39+2Y+1rPda+1mHtaz3WvtZj/Wst1r7WYe3bNdJx7UtBuRnDhw/X2rVrVVlZqZqaGq1evVojR45MHu/bt6/y8vL01ltvSZKefPLJRsfx/b766iv9/Oc/180336yxY8c2OZ6fn6/f//732rJli0zT1JIlS3TiiSemINLMFAgEtHDhQtXV1am6ulrLly9vlD++vx33/vvva++995bb7W5yjO9vxx1yyCH65JNP9NlnnykWi+npp59u8h11Op0aMmSInnnmGUnSihUr+B63UnV1tc4//3z98pe/1PTp05s9x+12695779Xbb78tSXrooYf4HreSaZq6/vrrVVVVpUgkokcffbRJ7vj+dkxlZaVqa2vVr1+/Zo/z/W071r7WYu1rLda+1mPtaz3Wv9Zh7Wst1r7WS9e1LwXlZvTq1UuzZ8/W1KlTdeqpp2rcuHEaPHiwZs6cqQ0bNkiSbr75Zt1www066aSTFAqFdjvHBE395S9/UV1dnW688UaNHz9e48eP1yOPPJLMb/fu3bVgwQJdfPHFOumkk2SaZrO3V6F5xx13nI455hideuqpmjhxoiZOnKjDDjuM728n2rJli3r37t3oOb6/nScvL0833nijfvGLX2jMmDHaZ599dNJJJ0mSrrzySr3wwguSpHnz5mnp0qUaM2aM1q9fr0svvTSFUWeOxx9/XNu3b9d9992X/DP4j3/8o6Rv8mu323Xrrbdq/vz5Ovnkk7Vp0ybNmTMnxZFnhoEDB+qCCy7QWWedpbFjx+qAAw7QuHHjJPH97SxffPFFkz+DJb6/HcHa11qsfa3F2td6rH2tx/rXOqx9rcXa13rpuvY1TNM0LX8XAAAAAAAAAEDGo0MZAAAAAAAAANAqFJQBAAAAAAAAAK1CQRkAAAAAAAAA0CoUlAEAAAAAAAAArUJBGQAAAAAAAADQKo5UBwAAaGrAgAHaf//9ZbM1/ne/O+64Q3vuuWenv9fatWvVvXv3Tn1dAAAAoDVY+wJAZqGgDABp6m9/+xsLXQAAAOQE1r4AkDkoKANAhnnjjTd08803a4899tDHH3+s/Px83Xjjjdp3330VCAR09dVXa/PmzTIMQ0cffbT+3//7f3I4HHr77bd17bXXqqamRk6nU5dffrmOPPJISdLtt9+ut99+W7t27dL555+vs88+O8WfEgAAAGDtCwDpiIIyAKSpc889t9Ftf3vuuafuuOMOSdLGjRv161//WkOGDNEjjzyiOXPmaNmyZbr22mtVXFyslStXKhKJ6OKLL9Zf//pXnXfeefr5z3+ua6+9Vscee6w2btyoK664Qk8++aQkqV+/fpo3b57effddnXnmmTrjjDPkdDpT8rkBAACQe1j7AkDmoKAMAGnq+277GzhwoIYMGSJJmjhxohYsWKCdO3fqlVde0SOPPCLDMORyuTR58mT97W9/01FHHSWbzaZjjz1WknTwwQdr5cqVydcbN26cJOmAAw5QOBxWdXW1unXrZu0HBAAAABqw9gWAzGFr+RQAQLqx2+3NPhePx2UYRvK5eDyuaDQqu93e6HlJ+uCDDxSNRiVJDkf9vy8mzjFN06rQAQAAgDZh7QsA6YWCMgBkoM2bN2vz5s2SpEcffVSHHXaYfD6fRowYoYceekimaSocDmvp0qUaPny49tlnHxmGoddee02StGnTJp177rmKx+Op/BgAAABAi1j7AkB6YeQFAKSp786Rk6T/9//+n/Lz89WzZ0/deuut+vLLL9W9e3ctXLhQknTVVVfp2muvVVlZmSKRiI4++mhddNFFcrlcuv3223X99ddr4cKFcjqduv322+VyuVLx0QAAAIBGWPsCQOYwTO7tAICM8sYbb+iaa67R008/nepQAAAAAEux9gWA9MPICwAAAAAAAABAq9ChDAAAAAAAAABoFTqUAQAAAAAAAACtQkEZAAAAAAAAANAqFJQBAAAAAAAAAK1CQRkAAAAAAAAA0CoUlAEAAAAAAAAArUJBGQAAAAAAAADQKv8f+rM05G6SDs8AAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, accuracy=accuracies, log_file=f'{log_dir}/hopfield_lookup_adapted.pdf')"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/modules/__init__.py b/src/mhnfs/hopfield/examples/latch_sequence/modules/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c11713739acb1aca3b32cca53acf0c3faf1fa9f6
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/modules/__init__.py
@@ -0,0 +1,898 @@
+import torch
+import torch.nn as nn
+
+from math import sqrt
+from torch import Tensor
+from torch.nn import Module, Parameter
+from typing import Optional, Tuple, Union
+
+from .activation import HopfieldCore
+
+
+class Hopfield(Module):
+ """
+ Module with underlying Hopfield association.
+ """
+
+ def __init__(self,
+ input_size: Optional[int] = None,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False
+ ):
+ """
+ Initialise new instance of a Hopfield module.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ """
+ super(Hopfield, self).__init__()
+ assert type(batch_first) == bool, f'"batch_first" needs to be a boolean, not {type(batch_first)}.'
+ assert (association_activation is None) or (type(association_activation) == str)
+
+ # Initialise Hopfield association module.
+ self.association_core = HopfieldCore(
+ embed_dim=input_size, num_heads=num_heads, dropout=dropout, bias=input_bias,
+ add_bias_kv=concat_bias_pattern, add_zero_attn=add_zero_association, kdim=stored_pattern_size,
+ vdim=pattern_projection_size, head_dim=hidden_size, pattern_dim=pattern_size, out_dim=output_size,
+ disable_out_projection=disable_out_projection, key_as_static=stored_pattern_as_static,
+ query_as_static=state_pattern_as_static, value_as_static=pattern_projection_as_static,
+ value_as_connected=pattern_projection_as_connected, normalize_pattern=normalize_hopfield_space,
+ normalize_pattern_affine=normalize_hopfield_space_affine)
+ self.association_activation = None
+ if association_activation is not None:
+ self.association_activation = getattr(torch, association_activation, None)
+
+ # Initialise stored pattern normalization.
+ self.norm_stored_pattern = None
+ if normalize_stored_pattern_affine:
+ assert normalize_stored_pattern, "affine normalization without normalization has no effect."
+ if normalize_stored_pattern:
+ normalized_shape = input_size if stored_pattern_size is None else stored_pattern_size
+ assert normalized_shape is not None, "stored pattern size required for setting up normalisation"
+ self.norm_stored_pattern = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_stored_pattern_affine)
+
+ # Initialise state pattern normalization.
+ self.norm_state_pattern = None
+ if normalize_state_pattern_affine:
+ assert normalize_state_pattern, "affine normalization without normalization has no effect."
+ if normalize_state_pattern:
+ assert input_size is not None, "input size required for setting up normalisation"
+ self.norm_state_pattern = nn.LayerNorm(
+ normalized_shape=input_size, elementwise_affine=normalize_state_pattern_affine)
+
+ # Initialise pattern projection normalization.
+ self.norm_pattern_projection = None
+ if normalize_pattern_projection_affine:
+ assert normalize_pattern_projection, "affine normalization without normalization has no effect."
+ if normalize_pattern_projection:
+ normalized_shape = input_size if pattern_projection_size is None else pattern_projection_size
+ assert normalized_shape is not None, "pattern projection size required for setting up normalisation"
+ self.norm_pattern_projection = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_pattern_projection_affine)
+
+ # Initialise remaining auxiliary properties.
+ if self.association_core.static_execution:
+ self.__scaling = 1.0 if scaling is None else scaling
+ else:
+ assert self.association_core.head_dim > 0, f'invalid hidden dimension encountered.'
+ self.__scaling = (1.0 / sqrt(self.association_core.head_dim)) if scaling is None else scaling
+ self.__batch_first = batch_first
+ self.__update_steps_max = update_steps_max
+ self.__update_steps_eps = update_steps_eps
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset Hopfield association.
+
+ :return: None
+ """
+ for module in (self.association_core, self.norm_stored_pattern,
+ self.norm_state_pattern, self.norm_pattern_projection):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def _maybe_transpose(self, *args: Tuple[Tensor, ...]) -> Union[Tensor, Tuple[Tensor, ...]]:
+ """
+ Eventually transpose specified data.
+
+ :param args: tensors to eventually transpose (dependent on the state of "batch_first")
+ :return: eventually transposed tensors
+ """
+ transposed_result = tuple(_.transpose(0, 1) for _ in args) if self.__batch_first else args
+ return transposed_result[0] if len(transposed_result) == 1 else transposed_result
+
+ def _associate(self, data: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ return_raw_associations: bool = False, return_projected_patterns: bool = False,
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tuple[Optional[Tensor], ...]:
+ """
+ Apply Hopfield association module on specified data.
+
+ :param data: data to be processed by Hopfield core module
+ :param return_raw_associations: return raw association (softmax) values, unmodified
+ :param return_projected_patterns: return pattern projection values, unmodified
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ assert (type(data) == Tensor) or ((type(data) == tuple) and (len(data) == 3)), \
+ r'either one tensor to be used as "stored pattern", "state pattern" and' \
+ r' "pattern_projection" must be provided, or three separate ones.'
+ if type(data) == Tensor:
+ stored_pattern, state_pattern, pattern_projection = data, data, data
+ else:
+ stored_pattern, state_pattern, pattern_projection = data
+
+ # Optionally transpose data.
+ stored_pattern, state_pattern, pattern_projection = self._maybe_transpose(
+ stored_pattern, state_pattern, pattern_projection)
+
+ # Optionally apply stored pattern normalization.
+ if self.norm_stored_pattern is not None:
+ stored_pattern = self.norm_stored_pattern(input=stored_pattern.reshape(
+ shape=(-1, stored_pattern.shape[2]))).reshape(shape=stored_pattern.shape)
+
+ # Optionally apply state pattern normalization.
+ if self.norm_state_pattern is not None:
+ state_pattern = self.norm_state_pattern(input=state_pattern.reshape(
+ shape=(-1, state_pattern.shape[2]))).reshape(shape=state_pattern.shape)
+
+ # Optionally apply pattern projection normalization.
+ if self.norm_pattern_projection is not None:
+ pattern_projection = self.norm_pattern_projection(input=pattern_projection.reshape(
+ shape=(-1, pattern_projection.shape[2]))).reshape(shape=pattern_projection.shape)
+
+ # Apply Hopfield association and optional activation function.
+ return self.association_core(
+ query=state_pattern, key=stored_pattern, value=pattern_projection,
+ key_padding_mask=stored_pattern_padding_mask, need_weights=False, attn_mask=association_mask,
+ scaling=self.__scaling, update_steps_max=self.__update_steps_max, update_steps_eps=self.__update_steps_eps,
+ return_raw_associations=return_raw_associations, return_pattern_projections=return_projected_patterns)
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield association on specified data.
+
+ :param input: data to be processed by Hopfield association module
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ association_output = self._maybe_transpose(self._associate(
+ data=input, return_raw_associations=False,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[0])
+ if self.association_activation is not None:
+ association_output = self.association_activation(association_output)
+ return association_output
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_raw_associations=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[2]
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_projected_patterns=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[3]
+
+ @property
+ def batch_first(self) -> bool:
+ return self.__batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.__scaling.clone() if type(self.__scaling) == Tensor else self.__scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.association_core.kdim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.association_core.embed_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.association_core.vdim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.state_pattern_dim
+
+ @property
+ def hidden_size(self) -> Optional[int]:
+ return self.association_core.head_dim
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.association_core.out_dim
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.association_core.pattern_dim
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.__update_steps_max.clone() if type(self.__update_steps_max) == Tensor else self.__update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.__update_steps_eps.clone() if type(self.__update_steps_eps) == Tensor else self.__update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.association_core.key_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.association_core.query_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.association_core.value_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.norm_stored_pattern is not None
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.normalize_stored_pattern and self.norm_stored_pattern.elementwise_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.norm_state_pattern is not None
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.normalize_state_pattern and self.norm_state_pattern.elementwise_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.norm_pattern_projection is not None
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.normalize_pattern_projection and self.norm_pattern_projection.elementwise_affine
+
+ @property
+ def normalize_hopfield_space(self) -> bool:
+ return self.hopfield.normalize_hopfield_space
+
+ @property
+ def normalize_hopfield_space_affine(self) -> bool:
+ return self.hopfield.normalize_hopfield_space_affine
+
+
+class HopfieldPooling(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed state pattern and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based pooling layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of state patterns
+ :param trainable: state pattern used for pooling is trainable
+ """
+ super(HopfieldPooling, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ pooling_weight_size = self.hopfield.hidden_size if state_pattern_as_static else self.hopfield.input_size
+ self.pooling_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if pooling_weight_size is None else pooling_weight_size)), requires_grad=trainable)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset pooling weights and underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise pooling weights.
+ nn.init.normal_(self.pooling_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Union[Tensor, Tuple[Tensor, Tensor]]) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ assert (type(input) == Tensor) or ((type(input) == tuple) and (len(input) == 2)), \
+ r'either one tensor to be used as "stored pattern" and' \
+ r' "pattern_projection" must be provided, or two separate ones.'
+ if type(input) == Tensor:
+ stored_pattern, pattern_projection = input, input
+ else:
+ stored_pattern, pattern_projection = input
+
+ batch_size = stored_pattern.shape[0 if self.batch_first else 1]
+ return stored_pattern, self.pooling_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.pooling_weights.shape[2])), pattern_projection
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor]], stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based pooling on specified data.
+
+ :param input: data to be pooled
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-pooled input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask).flatten(start_dim=1)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for pooling gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
+
+
+class HopfieldLayer(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed stored pattern, pattern projection and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+ lookup_weights_as_separated: bool = False,
+ lookup_targets_as_trainable: bool = True,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based lookup layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param lookup_weights_as_separated: separate lookup weights from lookup target weights
+ :param lookup_targets_as_trainable: employ trainable lookup target weights (used as pattern projection input)
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of stored patterns
+ :param trainable: stored pattern used for lookup is trainable
+ """
+ super(HopfieldLayer, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ lookup_weight_size = self.hopfield.hidden_size if stored_pattern_as_static else self.hopfield.stored_pattern_dim
+ self.lookup_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if lookup_weight_size is None else lookup_weight_size)), requires_grad=trainable)
+
+ if lookup_weights_as_separated:
+ target_weight_size = self.lookup_weights.shape[
+ 2] if pattern_projection_size is None else pattern_projection_size
+ self.target_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), target_weight_size)), requires_grad=lookup_targets_as_trainable)
+ else:
+ self.register_parameter(name=r'target_weights', param=None)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset lookup and lookup target weights, including underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise lookup and target weights.
+ nn.init.normal_(self.lookup_weights, mean=0.0, std=0.02)
+ if self.target_weights is not None:
+ nn.init.normal_(self.target_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Tensor) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ batch_size = input.shape[0 if self.batch_first else 1]
+ stored_pattern = self.lookup_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.lookup_weights.shape[2]))
+ if self.target_weights is None:
+ pattern_projection = stored_pattern
+ else:
+ pattern_projection = self.target_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.target_weights.shape[2]))
+
+ return stored_pattern, input, pattern_projection
+
+ def forward(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based lookup on specified data.
+
+ :param input: data to used in lookup
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: result of Hopfield-based lookup on input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_association_matrix(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for lookup gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/modules/activation.py b/src/mhnfs/hopfield/examples/latch_sequence/modules/activation.py
new file mode 100644
index 0000000000000000000000000000000000000000..6dcd6e56cddb954cf6b049687bdf5e7783aa2bc9
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/modules/activation.py
@@ -0,0 +1,337 @@
+import torch
+import torch.nn as nn
+
+from torch import Tensor
+from torch.nn import Linear, Module, Parameter
+from typing import Optional
+
+from .functional import hopfield_core_forward
+
+try:
+ from torch.nn.modules.linear import _LinearWithBias
+except ImportError:
+ _LinearWithBias = None
+
+
+class HopfieldCore(Module):
+ r"""Allows the model to jointly attend to information
+ from different representation subspaces.
+ See references: "Hopfield Networks is All You Need" and
+ "Attention Is All You Need" (on which this implementation is partly based on).
+
+ .. math::
+ \text{HopfieldHead}(Q, K, V) = \text{Concat}(head_1,\dots,head_h)W^O
+ \text{where} head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
+
+ Args:
+ embed_dim: total dimension of the model.
+ num_heads: parallel attention heads.
+ dropout: a Dropout layer on attn_output_weights. Default: 0.0.
+ bias: add bias as module parameter. Default: True.
+ add_bias_kv: add bias to the key and value sequences at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ kdim: total number of features in key. Default: None.
+ vdim: total number of features in value. Default: None.
+
+ Note: if kdim and vdim are None, they will be set to embed_dim such that
+ query, key, and value have the same number of features.
+
+ Examples::
+
+ >>> hopfield_attn = HopfieldCore(embed_dim, num_heads)
+ >>> attn_output, attn_output_weights, attn_matrix = hopfield_attn(query, key, value)
+ """
+ __annotations__ = {
+ 'bias_k': torch._jit_internal.Optional[torch.Tensor],
+ 'bias_v': torch._jit_internal.Optional[torch.Tensor],
+ }
+
+ def __init__(self,
+ embed_dim=None, # type: Optional[int]
+ num_heads=1, # type: int
+ dropout=0.0, # type: float
+ bias=True, # type: bool
+ add_bias_kv=False, # type: bool
+ add_zero_attn=False, # type: bool
+ kdim=None, # type: Optional[int]
+ vdim=None, # type: Optional[int]
+
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ out_dim=None, # type: Optional[int]
+ disable_out_projection=False, # type: bool
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ normalize_pattern_affine=False # type: bool
+ ):
+ super(HopfieldCore, self).__init__()
+
+ assert (type(key_as_static) == bool) and (type(query_as_static) == bool) and (type(value_as_static) == bool)
+ self.key_as_static, self.query_as_static, self.value_as_static = key_as_static, query_as_static, value_as_static
+ num_non_static = 3 - (self.key_as_static + self.query_as_static + self.value_as_static)
+ assert 0 <= num_non_static < 4
+
+ self.value_as_connected = value_as_connected
+ self.normalize_pattern, self.normalize_pattern_affine = normalize_pattern, normalize_pattern_affine
+ self.disable_out_projection = disable_out_projection
+
+ # In case of a static-only executions, check corresponding projections and normalizations.
+ self.static_execution = self._check_execution_mode()
+ if self.static_execution:
+ embed_dim, kdim, vdim = None, None, None
+ if embed_dim is None:
+ assert self.static_execution, r'static-only execution requires all projections to be deactivated.'
+
+ # Check and set all other properties, conditioned on .
+ self.embed_dim = embed_dim
+ self.kdim = kdim if kdim is not None else embed_dim
+ self.vdim = vdim if vdim is not None else embed_dim
+ self._qkv_same_embed_dim = all((
+ self.kdim == embed_dim, self.vdim == embed_dim, pattern_dim is None, not self.value_as_connected))
+ assert (not self.value_as_connected) or (self.kdim == self.vdim), r'key and value need to be of same dimension.'
+
+ self.num_heads = num_heads
+ self.dropout = dropout
+ self.head_dim = None
+ self.pattern_dim = pattern_dim
+ self.virtual_hopfield_dim = None
+ self.virtual_pattern_dim = None
+ if not self.static_execution:
+ if head_dim is None:
+ self.head_dim = embed_dim // num_heads
+ assert self.head_dim * num_heads == self.embed_dim, "embed_dim must be divisible by num_heads."
+ else:
+ assert head_dim > 0, "dimension of the association space has to be positive."
+ self.head_dim = head_dim
+ if self.pattern_dim is None:
+ self.pattern_dim = self.head_dim
+ self.virtual_hopfield_dim = self.num_heads * self.head_dim
+ self.virtual_pattern_dim = self.num_heads * self.pattern_dim
+
+ self.out_dim = embed_dim if out_dim is None else out_dim
+ assert disable_out_projection or (self.out_dim > 0), "output projection dimension has to be positive."
+
+ if normalize_pattern_affine:
+ assert normalize_pattern, "affine pattern normalization without pattern normalization has no effect."
+ self.p_norm_weight = Parameter(torch.Tensor(head_dim))
+ self.p_norm_bias = Parameter(torch.Tensor(head_dim))
+ else:
+ self.register_parameter('p_norm_weight', None)
+ self.register_parameter('p_norm_bias', None)
+
+ if self._qkv_same_embed_dim is False:
+ if query_as_static:
+ self.register_parameter('q_proj_weight', None)
+ else:
+ self.q_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, embed_dim))
+ if key_as_static:
+ self.register_parameter('k_proj_weight', None)
+ else:
+ self.k_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, self.kdim))
+ if value_as_static:
+ self.register_parameter('v_proj_weight', None)
+ else:
+ self.v_proj_weight = Parameter(torch.Tensor(
+ self.virtual_pattern_dim,
+ self.virtual_hopfield_dim if (value_as_connected and not key_as_static) else self.vdim))
+ self.register_parameter('in_proj_weight', None)
+ else:
+ if num_non_static > 0:
+ self.in_proj_weight = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim +
+ (not value_as_static) * self.virtual_pattern_dim, embed_dim))
+ else:
+ self.register_parameter('in_proj_weight', None)
+ self.register_parameter('q_proj_weight', None)
+ self.register_parameter('k_proj_weight', None)
+ self.register_parameter('v_proj_weight', None)
+
+ if bias and (num_non_static > 0):
+ self.in_proj_bias = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim + self.virtual_pattern_dim))
+ else:
+ self.register_parameter('in_proj_bias', None)
+ if disable_out_projection:
+ self.register_parameter('out_proj', None)
+ else:
+ if bias and _LinearWithBias is not None:
+ self.out_proj = _LinearWithBias(self.virtual_pattern_dim, self.out_dim)
+ else:
+ self.out_proj = Linear(self.virtual_pattern_dim, self.out_dim, bias=bias)
+
+ self.bias_k, self.bias_v = None, None
+ if add_bias_kv:
+ if not key_as_static:
+ self.bias_k = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ if not value_as_static:
+ self.bias_v = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ assert not (self.bias_k is None and self.bias_v is None), r'cannot set key/value bias if both are static.'
+
+ self.add_zero_attn = add_zero_attn
+ self.reset_parameters()
+
+ def _check_execution_mode(self) -> bool:
+ return all((
+ self.key_as_static, self.query_as_static, self.value_as_static, not self.value_as_connected,
+ not self.normalize_pattern, not self.normalize_pattern_affine, self.disable_out_projection
+ ))
+
+ def reset_parameters(self):
+ if self.p_norm_weight is not None:
+ nn.init.ones_(self.p_norm_weight)
+ nn.init.zeros_(self.p_norm_bias)
+
+ if self._qkv_same_embed_dim and (self.in_proj_weight is not None):
+ nn.init.normal_(self.in_proj_weight, mean=0.0, std=0.02)
+ else:
+ if self.q_proj_weight is not None:
+ nn.init.normal_(self.q_proj_weight, mean=0.0, std=0.02)
+ if self.k_proj_weight is not None:
+ nn.init.normal_(self.k_proj_weight, mean=0.0, std=0.02)
+ if self.v_proj_weight is not None:
+ nn.init.normal_(self.v_proj_weight, mean=0.0, std=0.02)
+
+ if self.in_proj_bias is not None:
+ nn.init.constant_(self.in_proj_bias, 0.0)
+ if not self.disable_out_projection:
+ nn.init.normal_(self.out_proj.weight, mean=0.0, std=0.02)
+ if self.out_proj.bias is not None:
+ nn.init.constant_(self.out_proj.bias, 0.0)
+ if self.bias_k is not None:
+ nn.init.normal_(self.bias_k, mean=0.0, std=0.02)
+ if self.bias_v is not None:
+ nn.init.normal_(self.bias_v, mean=0.0, std=0.02)
+
+ def __setstate__(self, state):
+ super(HopfieldCore, self).__setstate__(state)
+
+ def forward(self,
+ query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+
+ scaling=None, # type: Optional[Tensor]
+ update_steps_max=0, # type: Optional[int]
+ update_steps_eps=1e-4, # type: float
+ return_raw_associations=False, # type: bool
+ return_pattern_projections=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. When given a binary mask and a value is True,
+ the corresponding value on the attention layer will be ignored. When given
+ a byte mask and a value is non-zero, the corresponding value on the attention
+ layer will be ignored.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_pattern_projections: return pattern projection values, unmodified.
+
+ Shape:
+ - Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the position
+ with the zero positions will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensure that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ is not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ - Outputs:
+ - attn_output: :math:`(L, N, E)` where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)` where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if self.query_as_static and self.key_as_static:
+ assert query.shape[2] == key.shape[2], \
+ f'query shape[2] of {query.shape[2]} and key shape[2] of {key.shape[2]} need to be equal'
+ head_dim, embed_dim_to_check = query.shape[2], query.shape[2]
+ else:
+ assert self.query_as_static or (query.shape[2] == self.embed_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.embed_dim}.'
+ assert (not self.query_as_static) or (self.query_as_static and query.shape[2] == self.head_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.head_dim}'
+
+ assert self.key_as_static or (key.shape[2] == self.kdim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.kdim}.'
+ assert (not self.key_as_static) or (self.key_as_static and key.shape[2] == self.head_dim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.head_dim}'
+ head_dim, embed_dim_to_check = self.head_dim, self.head_dim if self.query_as_static else self.embed_dim
+
+ assert self.value_as_static or (value.shape[2] == self.vdim), \
+ f'value shape[2] of {value.shape[2]} invalid, needs to be {self.vdim}.'
+ assert any((
+ not self.value_as_static, self.value_as_static and value.shape[2] == self.pattern_dim,
+ self.disable_out_projection)
+ ), f'value shape[2] of {value.shape[2]} invalid, needs to be {self.pattern_dim}'
+
+ out_weights, out_bias = None, None
+ if not self.disable_out_projection:
+ out_weights, out_bias = self.out_proj.weight, self.out_proj.bias
+
+ if not self._qkv_same_embed_dim:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=True, q_proj_weight=self.q_proj_weight, k_proj_weight=self.k_proj_weight,
+ v_proj_weight=self.v_proj_weight,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
+ else:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/modules/functional.py b/src/mhnfs/hopfield/examples/latch_sequence/modules/functional.py
new file mode 100644
index 0000000000000000000000000000000000000000..2619c45fd87dc5f0348db393aa9b305611b4dd32
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/modules/functional.py
@@ -0,0 +1,450 @@
+import torch
+import torch.nn as nn
+
+from torch.tensor import Tensor
+from typing import Optional, Tuple, Union
+
+
+def hopfield_core_forward(query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ embed_dim_to_check, # type: int
+ num_heads, # type: int
+ in_proj_weight, # type: Optional[Tensor]
+ in_proj_bias, # type: Optional[Tensor]
+ bias_k, # type: Optional[Tensor]
+ bias_v, # type: Optional[Tensor]
+ add_zero_attn, # type: bool
+ dropout_p, # type: float
+ out_proj_weight, # type: Tensor
+ out_proj_bias, # type: Tensor
+ training=True, # type: bool
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+ use_separate_proj_weight=False, # type: bool
+ q_proj_weight=None, # type: Optional[Tensor]
+ k_proj_weight=None, # type: Optional[Tensor]
+ v_proj_weight=None, # type: Optional[Tensor]
+ static_k=None, # type: Optional[Tensor]
+ static_v=None, # type: Optional[Tensor]
+
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ p_norm_weight=None, # type: Optional[Tensor]
+ p_norm_bias=None, # type: Optional[Tensor]
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ scaling=None, # type: Optional[Union[float, Tensor]]
+ update_steps_max=0, # type: Optional[Union[int, Tensor]]
+ update_steps_eps=1e-4, # type: Union[float, Tensor]
+ return_raw_associations=False, # type: bool
+ return_projected_patterns=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ embed_dim_to_check: total dimension of the model (in case of default head dimension).
+ num_heads: parallel attention heads.
+ in_proj_weight, in_proj_bias: input projection weight and bias.
+ bias_k, bias_v: bias of the key and value sequences to be added at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ dropout_p: probability of an element to be zeroed.
+ out_proj_weight, out_proj_bias: the output projection weight and bias.
+ training: apply dropout if is ``True``.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. This is an binary mask. When the value is True,
+ the corresponding value on the attention layer will be filled with -inf.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+ use_separate_proj_weight: the function accept the proj. weights for query, key,
+ and value in different forms. If false, in_proj_weight will be used, which is
+ a combination of q_proj_weight, k_proj_weight, v_proj_weight.
+ q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias: input projection weight and bias.
+ static_k, static_v: static key and value used for attention operators.
+
+ key_as_static: interpret specified key as being static.
+ query_as_static: interpret specified key as being static.
+ value_as_static: interpret specified key as being static.
+ value_as_connected: connect value projection with key projection.
+ normalize_pattern: enable normalization of patterns.
+ p_norm_weight, p_norm_bias: pattern normalization weight and bias.
+ head_dim: dimensionality of each head.
+ pattern_dim: dimensionality of each projected value input.
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_projected_patterns: return pattern projection values, unmodified.
+
+ Shape:
+ Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the zero positions
+ will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensures that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ are not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+ - static_k: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+ - static_v: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ Outputs:
+ - attn_output: :math:`(L, N, E)`, where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if not torch.jit.is_scripting():
+ tens_ops = (query, key, value, in_proj_weight, in_proj_bias, bias_k, bias_v,
+ out_proj_weight, out_proj_bias)
+ if any([type(t) is not Tensor for t in tens_ops]) and nn.functional.has_torch_function(tens_ops):
+ return nn.functional.handle_torch_function(
+ hopfield_core_forward, tens_ops, query, key, value,
+ embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias,
+ bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight,
+ out_proj_bias, training=training, key_padding_mask=key_padding_mask,
+ need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=use_separate_proj_weight,
+ q_proj_weight=q_proj_weight, k_proj_weight=k_proj_weight,
+ v_proj_weight=v_proj_weight, static_k=static_k, static_v=static_v,
+ key_as_static=key_as_static, query_as_static=query_as_static,
+ value_as_static=value_as_static, value_as_connected=value_as_connected,
+ normalize_pattern=normalize_pattern, p_norm_weight=p_norm_weight, p_norm_bias=p_norm_bias,
+ head_dim=head_dim, pattern_dim=pattern_dim, scaling=scaling, update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps, return_raw_associations=return_raw_associations)
+ tgt_len, bsz, embed_dim = query.shape[0], value.shape[1], query.shape[2]
+ assert embed_dim == embed_dim_to_check
+ # allow MHA to have different sizes for the feature dimension
+ assert key.size(0) == value.size(0) and key.size(1) == value.size(1)
+
+ assert (scaling is None) or (type(scaling) in (float, torch.Tensor))
+ if type(scaling) == torch.Tensor:
+ assert scaling.ndimension() == 1 and scaling.shape[0] == num_heads, "only one entry per head."
+
+ assert (update_steps_max is None) or (type(update_steps_max) in (int, torch.Tensor))
+ if type(update_steps_max) == torch.Tensor:
+ assert update_steps_max.ndimension() == 1 and update_steps_max.shape[0] == num_heads, "only one entry per head."
+ elif type(update_steps_max) == int:
+ update_steps_max = torch.tensor([update_steps_max] * num_heads, dtype=torch.int32, device=query.device)
+ elif update_steps_max is None:
+ update_steps_max = -torch.ones(size=(num_heads,), dtype=torch.int32, device=query.device)
+
+ assert type(update_steps_eps) in (float, torch.Tensor)
+ if type(update_steps_eps) == torch.Tensor:
+ assert update_steps_eps.ndimension() == 1 and update_steps_eps.shape[0] == num_heads, "only one entry per head."
+ assert (update_steps_eps <= 0.0).sum() == 0, "only positive thresholds allowed."
+ update_steps_eps = update_steps_eps.to(device=query.device)
+ elif type(update_steps_eps) == float:
+ assert update_steps_eps > 0, "only positive thresholds allowed."
+ update_steps_eps = torch.tensor([update_steps_eps] * num_heads, dtype=query.dtype, device=query.device)
+
+ # Adapt dimensionality of each each.
+ if head_dim is None:
+ head_dim = embed_dim // num_heads
+ assert head_dim * num_heads == embed_dim, r'embed_dim must be divisible by num_heads.'
+ hopfield_dim = num_heads * head_dim
+
+ # Adapt dimensionality of each value projection.
+ if pattern_dim is None:
+ pattern_dim = head_dim
+ assert (not value_as_connected) or (pattern_dim == head_dim)
+
+ q, k, v, xi, src_len = None, None, None, None, 0
+ update_step, xi_old, xi_difference_norm = 0, None, float(r'+inf')
+ update_active_heads = torch.tensor([[[True]]] * num_heads * bsz, device=query.device)
+ assert update_active_heads.any(), "at least one head needs to be active."
+
+ ####################################################################################################################
+ # BEGIN HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ while update_active_heads.any():
+
+ # The query is already projected into the "Hopfield" space at "update_step" equals 0.
+ # No more projection necessary if "update_step" greater than 0.
+ if update_step == 0:
+ if not use_separate_proj_weight:
+
+ if torch.equal(query, key) and torch.equal(key, value) and not (
+ key_as_static or query_as_static or value_as_static):
+ # self-attention
+ q, k, v = nn.functional.linear(query, in_proj_weight, in_proj_bias).chunk(3, dim=-1)
+
+ elif torch.equal(key, value) and not (key_as_static or value_as_static):
+ # encoder-decoder attention
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start = hopfield_dim
+ _end = None
+
+ if key is None:
+ assert value is None
+ k = None
+ v = None
+ else:
+
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k, v = nn.functional.linear(key, _w, _b).chunk(2, dim=-1)
+
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k = nn.functional.linear(key, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if value_as_static:
+ v = value.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ v = nn.functional.linear(value, _w, _b)
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ q_proj_weight_non_opt = torch.jit._unwrap_optional(q_proj_weight)
+ len1, len2 = q_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == query.size(-1)
+ if in_proj_bias is not None:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias[_start:_end])
+ _start += hopfield_dim
+ _end += hopfield_dim
+ else:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias)
+
+ v = value
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ k_proj_weight_non_opt = torch.jit._unwrap_optional(k_proj_weight)
+ len1, len2 = k_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == key.size(-1)
+
+ _bias = None if in_proj_bias is None else in_proj_bias[_start:_end]
+ k = nn.functional.linear(key, k_proj_weight_non_opt, _bias)
+ if value_as_connected:
+ v = nn.functional.linear(v, k_proj_weight_non_opt, _bias)
+ _start += hopfield_dim
+ _end += num_heads * pattern_dim
+
+ if value_as_static:
+ if not (value_as_connected or key_as_static):
+ v = v.repeat(1, num_heads, 1)
+ else:
+ v_proj_weight_non_opt = torch.jit._unwrap_optional(v_proj_weight)
+ len1, len2 = v_proj_weight_non_opt.size()
+ assert len1 == (num_heads * pattern_dim) and len2 == v.size(-1)
+ if in_proj_bias is not None:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias[_start:])
+ else:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias)
+
+ if attn_mask is not None:
+ assert attn_mask.dtype == torch.float32 or attn_mask.dtype == torch.float64 or \
+ attn_mask.dtype == torch.float16 or attn_mask.dtype == torch.uint8 or \
+ attn_mask.dtype == torch.bool, \
+ 'Only float, byte, and bool types are supported for attn_mask, not {}'.format(attn_mask.dtype)
+ if attn_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for attn_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ attn_mask = attn_mask.to(torch.bool)
+
+ if attn_mask.dim() == 2:
+ attn_mask = attn_mask.unsqueeze(0)
+ if list(attn_mask.size()) != [1, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 2D attn_mask is not correct.')
+ elif attn_mask.dim() == 3:
+ if list(attn_mask.size()) != [bsz * num_heads, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 3D attn_mask is not correct.')
+ else:
+ raise RuntimeError("attn_mask's dimension {} is not supported".format(attn_mask.dim()))
+ # attn_mask's dim is 3 now.
+
+ # Optionally normalize patterns.
+ if normalize_pattern:
+ q = torch.nn.functional.layer_norm(
+ input=q.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=q.shape)
+ k = torch.nn.functional.layer_norm(
+ input=k.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=k.shape)
+
+ else:
+ active_xi = xi.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:]))
+ active_k = k.masked_select(mask=update_active_heads).view(size=(-1, *k.shape[1:]))
+ q = torch.masked_scatter(input=q, mask=update_active_heads, source=torch.bmm(active_xi, active_k))
+
+ # Optionally scale association heads (each head separately).
+ if type(scaling) == float:
+ q = q * scaling
+ elif type(scaling) == torch.Tensor:
+ q = q * scaling.view(1, 1, -1).repeat(repeats=(1, 1, q.shape[2] // scaling.shape[0]))
+
+ if update_step == 0:
+ # convert ByteTensor key_padding_mask to bool
+ if key_padding_mask is not None and key_padding_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for key_padding_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ key_padding_mask = key_padding_mask.to(torch.bool)
+
+ if bias_k is not None and bias_v is not None:
+ if static_k is None and static_v is None and key_as_static is None and value_as_static is None:
+ k = torch.cat([k, bias_k.repeat(1, bsz, 1)])
+ v = torch.cat([v, bias_v.repeat(1, bsz, 1)])
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+ else:
+ assert static_k is None, "bias cannot be added to static key."
+ assert static_v is None, "bias cannot be added to static value."
+ assert not key_as_static, "bias cannot be added to static key."
+ assert not value_as_static, "bias cannot be added to static value."
+ else:
+ assert bias_k is None
+ assert bias_v is None
+
+ q = q.contiguous().view(tgt_len, -1, head_dim).transpose(0, 1)
+ if k is not None:
+ k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
+ if v is not None:
+ v = v.contiguous().view(v.shape[0], bsz * num_heads, -1).transpose(0, 1)
+
+ if static_k is not None:
+ assert static_k.size(0) == bsz * num_heads
+ assert static_k.size(2) == head_dim
+ k = static_k
+
+ if static_v is not None:
+ assert static_v.size(0) == bsz * num_heads
+ assert static_v.size(2) == pattern_dim
+ v = static_v
+
+ src_len = k.size(1)
+
+ if key_padding_mask is not None:
+ assert key_padding_mask.size(0) == bsz
+ assert key_padding_mask.size(1) == src_len
+
+ if add_zero_attn:
+ src_len += 1
+ k = torch.cat([k, torch.zeros((k.size(0), 1) + k.size()[2:], dtype=k.dtype, device=k.device)], dim=1)
+ v = torch.cat([v, torch.zeros((v.size(0), 1) + v.size()[2:], dtype=v.dtype, device=v.device)], dim=1)
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+
+ attn_output_weights = torch.bmm(q, k.transpose(1, 2))
+ assert list(attn_output_weights.size()) == [bsz * num_heads, tgt_len, src_len]
+
+ if attn_mask is not None:
+ if attn_mask.dtype == torch.bool:
+ attn_output_weights.masked_fill_(attn_mask, float('-inf'))
+ else:
+ attn_output_weights += attn_mask
+
+ if key_padding_mask is not None:
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ attn_output_weights = attn_output_weights.masked_fill(
+ key_padding_mask.unsqueeze(1).unsqueeze(2),
+ float('-inf'),
+ )
+ attn_output_weights = attn_output_weights.view(bsz * num_heads, tgt_len, src_len)
+
+ # Compute new xi for Hopfield retrieve iterations.
+ if xi is None:
+ xi = nn.functional.softmax(attn_output_weights, dim=-1)
+ else:
+ xi = torch.masked_scatter(input=xi, mask=update_active_heads, source=nn.functional.softmax(
+ attn_output_weights.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:])), dim=-1))
+
+ # Compute threshold-based stopping criterion for Hopfield retrieve iterations.
+ with torch.no_grad():
+ xi_active = xi.view(size=(bsz, num_heads, tgt_len, src_len))
+ update_active_heads = (update_step < update_steps_max) | (update_steps_max < 0)
+ if xi_old is not None:
+ update_active_heads &= ((xi_old - xi_active).norm(p=2, dim=(2, 3)).max(axis=0)[0]) > update_steps_eps
+ update_active_heads = update_active_heads.unsqueeze(dim=1).unsqueeze(dim=2).repeat(repeats=(bsz, 1, 1))
+ xi_old = xi_active
+ update_step += 1
+
+ ####################################################################################################################
+ # END HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ attn_output_weights = nn.functional.dropout(xi, p=dropout_p, training=training)
+ attn_output = torch.bmm(attn_output_weights, v)
+ assert list(attn_output.shape[:2]) == [bsz * num_heads, tgt_len]
+ attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len, bsz, -1)
+ if out_proj_weight is not None:
+ assert attn_output.shape[2] == num_heads * pattern_dim
+ attn_output = nn.functional.linear(attn_output, out_proj_weight, out_proj_bias)
+
+ xi = xi.view(bsz, num_heads, tgt_len, src_len) if return_raw_associations else None
+ v = v.view(bsz, num_heads, src_len, -1) if return_projected_patterns else None
+ if need_weights:
+ # average attention weights over heads
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ return attn_output, attn_output_weights.sum(dim=1) / num_heads, xi, v
+ else:
+ return attn_output, None, xi, v
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/modules/transformer.py b/src/mhnfs/hopfield/examples/latch_sequence/modules/transformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..884e0cb4b57610cf1daf8147f2c3d59f17824750
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/latch_sequence/modules/transformer.py
@@ -0,0 +1,209 @@
+import torch
+import torch.nn as nn
+
+from copy import deepcopy
+from torch import Tensor
+from torch.nn.modules import Module
+from typing import Optional, Tuple, Union
+
+from . import Hopfield
+
+
+class HopfieldEncoderLayer(Module):
+ """
+ Module with underlying Hopfield association to be used as an encoder in transformer-like architectures.
+ """
+
+ def __init__(self,
+ hopfield_association: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association: instance of Hopfield association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ :param dropout: dropout probability to be applied internally
+ """
+ super(HopfieldEncoderLayer, self).__init__()
+ self.hopfield_association = deepcopy(hopfield_association)
+
+ self.linear_residual = nn.Linear(self.hopfield_association.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association.state_pattern_dim)
+
+ self.norm_residual = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.dropout_hopfield_association = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association, self.linear_residual,
+ self.linear_output, self.norm_residual, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, src: Tensor, src_mask: Optional[Tensor] = None,
+ src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield encoding on specified data.
+
+ :param src: data to be processed by Hopfield encoder module
+ :param src_mask: mask to be applied on association matrix
+ :param src_key_padding_mask: mask to be applied on stored patterns
+ :return: Hopfield-encoded input data
+ """
+ data_associated = self.hopfield_association(
+ input=src, stored_pattern_padding_mask=src_key_padding_mask, association_mask=src_mask)
+ src = src + self.dropout_hopfield_association(input=data_associated)
+ src = self.norm_residual(input=src)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=src))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ src = src + self.dropout_output(input=data_associated)
+
+ return self.norm_output(input=src)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output.out_features
+
+
+class HopfieldDecoderLayer(Module):
+
+ def __init__(self,
+ hopfield_association_self: Hopfield,
+ hopfield_association_cross: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association_self: instance of Hopfield self-association module
+ :param hopfield_association_cross: instance of Hopfield cross-association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param dropout: dropout probability to be applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ """
+ super(HopfieldDecoderLayer, self).__init__()
+ self.hopfield_association_self = deepcopy(hopfield_association_self)
+ self.hopfield_association_cross = deepcopy(hopfield_association_cross)
+
+ self.linear_residual = nn.Linear(self.hopfield_association_self.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association_self.state_pattern_dim)
+
+ self.norm_residual_self = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_residual_cross = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.dropout_hopfield_association_self = nn.Dropout(dropout)
+ self.dropout_hopfield_association_cross = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association_self, self.hopfield_association_cross,
+ self.linear_residual, self.linear_output, self.norm_residual_self,
+ self.norm_residual_cross, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None,
+ memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None,
+ memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield decoding on specified data.
+
+ :param tgt: data to be processed by Hopfield decoder module (self-association)
+ :param memory: data to be processed by Hopfield encoder module (cross-association)
+ :param tgt_mask: mask to be applied on self-association matrix
+ :param memory_mask: mask to be applied on cross-association matrix
+ :param tgt_key_padding_mask: mask to be applied on stored patterns
+ :param memory_key_padding_mask: mask to be applied on state patterns as well as pattern projection
+ :return: Hopfield-decoded input
+ """
+ data_associated = self.hopfield_association_self(
+ input=tgt, stored_pattern_padding_mask=tgt_key_padding_mask,
+ association_mask=tgt_mask)
+ tgt = tgt + self.dropout_hopfield_association_self(input=data_associated)
+ tgt = self.norm_residual_self(input=tgt)
+
+ data_associated = self.hopfield_association_cross(
+ input=(memory, tgt, memory), stored_pattern_padding_mask=memory_key_padding_mask,
+ association_mask=memory_mask)
+ tgt = tgt + self.dropout_hopfield_association_cross(input=data_associated)
+ tgt = self.norm_residual_cross(input=tgt)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=tgt))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ tgt = tgt + self.dropout_output(input=data_associated)
+ return self.norm_output(input=tgt)
+
+ def get_association_matrix_self(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield self-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_self.get_association_matrix(input=input)
+
+ def get_association_matrix_cross(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield cross-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_cross.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association_self.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association_self.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output_self.out_features
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_adapted.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a372354c143235492963af3c030fe9e57ef52384
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_base.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_base.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..d79776dad1aaa8521d5e262da58b10a72729f9ec
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_base.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..7d77e71d3d435bb1c7f2cba80325f3568351c5ca
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup_adapted.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..4311173d107115696730da2a301f5214834bf6c0
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_lookup_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0b6a6629bd3338c42b73d976bfcb60464ffb6387
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling_adapted.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling_adapted.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..42603ab847c67dd4ab644a2b39a593f034f3a539
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/hopfield_pooling_adapted.pdf differ
diff --git a/src/mhnfs/hopfield/examples/latch_sequence/resources/lstm_base.pdf b/src/mhnfs/hopfield/examples/latch_sequence/resources/lstm_base.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..b04c2d77f5af97d116474bc74fb32d37a8766f78
Binary files /dev/null and b/src/mhnfs/hopfield/examples/latch_sequence/resources/lstm_base.pdf differ
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/LICENSE b/src/mhnfs/hopfield/examples/mnist_bags/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..236fb4bb131d2ac5692a0f8bd71c54d2b8c3f002
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Maximilian Ilse and Jakub Tomczak
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/README.md b/src/mhnfs/hopfield/examples/mnist_bags/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..27f0e35170dd51bd7f6ebf6ee18cb5e396bfe776
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/README.md
@@ -0,0 +1,28 @@
+# Application of Hopfield-based pooling on Attention-based Deep Multiple Instance Learning
+
+This notebook demonstrates how to apply the Hopfield pooling layer.
+It is based on the PyTorch implementation of the paper [Attention-based Deep Multiple Instance Learning](https://github.com/AMLab-Amsterdam/AttentionDeepMIL) by
+* Ilse, M., Tomczak, J. M., & Welling, M. (2018). Attention-based Deep Multiple Instance Learning. [arXiv preprint arXiv:1802.04712](https://arxiv.org/pdf/1802.04712.pdf).
+
+
+## Installation
+Download the PyTorch code of Attention-based Deep Multiple Instance Learning (ADMIL) from the accompanying [repository](https://github.com/AMLab-Amsterdam/AttentionDeepMIL) into a directory AttentionDeepMIL
on the current directory level ([examples/mnist_bags](.)). Afterwards, line 60 of the file [model.py](https://github.com/AMLab-Amsterdam/AttentionDeepMIL/blob/master/model.py#L60) of this repository needs to be modified. Change
+```python
+error = 1. - Y_hat.eq(Y).cpu().float().mean().data[0]
+```
+to
+```python
+error = 1. - Y_hat.eq(Y).cpu().float().mean().item()
+```
+
+Cell 5 specifies the parameters defining the data set properties, whereas cell 15 defines the Hopfield-based pooling network. As a last step, run the notebook.
+
+
+## Note
+* The neural network with Hopfield-based pooling, implemented in cell 15 of the [mnist_bags_demo.ipynb](mnist_bags_demo.ipynb) notebook is based on the models proposed in [ADMIL](https://github.com/AMLab-Amsterdam/AttentionDeepMIL).
+
+* The code in the [mnist_bags_demo.ipynb](mnist_bags_demo.ipynb) notebook is based on the [main.py](https://github.com/AMLab-Amsterdam/AttentionDeepMIL/blob/master/main.py) file from ADMIL.
+
+
+## Disclaimer
+The purpose of this notebook is merely to demonstrate how to use HopfieldPooling
layer. In no way it is intended as a comparison of the methods.
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/mnist_bags_demo.ipynb b/src/mhnfs/hopfield/examples/mnist_bags/mnist_bags_demo.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..eb7996e2b392511f8501d753d3d1e2a770adb0b5
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/mnist_bags_demo.ipynb
@@ -0,0 +1,736 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Example: Attention-based Deep Multiple Instance Learning "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Import general modules used for e.g. plotting.\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import os\n",
+ "import pandas as pd\n",
+ "import seaborn as sns\n",
+ "import sys\n",
+ "import torch\n",
+ "\n",
+ "# Import Hopfield-specific modules.\n",
+ "from modules import HopfieldPooling\n",
+ "\n",
+ "# Import auxiliary modules.\n",
+ "from distutils.version import LooseVersion\n",
+ "from typing import Optional, Tuple\n",
+ "\n",
+ "# Importing PyTorch specific modules.\n",
+ "from torch import Tensor\n",
+ "from torch.autograd import Variable\n",
+ "from torch.nn import Conv2d, Dropout, Linear, MaxPool2d, Module, ReLU, Sequential, Sigmoid\n",
+ "from torch.nn.utils import clip_grad_norm_\n",
+ "from torch.optim import AdamW\n",
+ "from torch.utils.data import DataLoader\n",
+ "\n",
+ "# Set plotting style.\n",
+ "sns.set()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Append the path of the Attention-based Deep Multiple Instance Learning (ADMIL) repository to the system path in order for Python to find the corresponding modules to import."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sys.path.append(r'./AttentionDeepMIL')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Afterwards, the corresponding modules\n",
+ "- MnistBags
\n",
+ "- Attention
\n",
+ "- GatedAttention
\n",
+ "\n",
+ "are imported to the global namespace."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from dataloader import MnistBags\n",
+ "from model import Attention, GatedAttention"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Specific minimum versions of Python itself as well as of some used modules is required."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Installed Python version: 3.8.8 (β)\n",
+ "Installed PyTorch version: 1.7.0 (β)\n"
+ ]
+ }
+ ],
+ "source": [
+ "python_check = '(\\u2713)' if sys.version_info >= (3, 8) else '(\\u2717)'\n",
+ "pytorch_check = '(\\u2713)' if torch.__version__ >= LooseVersion(r'1.5') else '(\\u2717)'\n",
+ "\n",
+ "print(f'Installed Python version: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro} {python_check}')\n",
+ "print(f'Installed PyTorch version: {torch.__version__} {pytorch_check}')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "Create Dataset \n",
+ "\n",
+ "The dataset itself falls into the category of binary classification tasks in the domain of Multiple Instance Learning (MIL) problems.\n",
+ "The MNIST-bags task was introcuded by Ilse and Tomczak: \n",
+ "Ilse, M., Tomczak, J.M. and Welling, M., 2018. Attention-based deep multiple instance learning. arXiv preprint arXiv:1802.04712. \n",
+ "Each bag comprises a collection of $28\\times{}28$ grayscale images/instances, whereas each instance is a sequence of pixel values in the range of $[0; 255]$. The amount of instances per pag is drawn from a Gaussian with specified mean and variance. The positive class is defined by the presence of the target number/digit, whereas the negative one by its absence. This demonstration shows, that HopfieldPooling
is capable of learning and filtering each bag with respect to the class-defining target number/digit. Defining arguments are:\n",
+ " \n",
+ "\n",
+ " \n",
+ " Argument \n",
+ " Value (used in this demo) \n",
+ " Description \n",
+ " \n",
+ " \n",
+ " target_number
\n",
+ " 9 \n",
+ " Target number/digit defining class affiliation. \n",
+ " \n",
+ " \n",
+ " mean_bag_length
\n",
+ " 10 \n",
+ " Mean amount of instances per bag. \n",
+ " \n",
+ " \n",
+ " var_bag_length
\n",
+ " 2 \n",
+ " Variance of amount of instances per bag. \n",
+ " \n",
+ " \n",
+ " num_bag
\n",
+ " {200; 50} \n",
+ " Amount of samples of the training as well as validation set. \n",
+ " \n",
+ "
\n",
+ "\n",
+ "Let's define the dataset using previously mentioned properties as well as a logging directory for storing all auxiliary outputs like performance plots."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "device = torch.device(r'cuda:0' if torch.cuda.is_available() else r'cpu')\n",
+ "\n",
+ "# Create data loader of training set.\n",
+ "data_loader_train = DataLoader(MnistBags(\n",
+ " target_number=9,\n",
+ " mean_bag_length=10,\n",
+ " var_bag_length=2,\n",
+ " num_bag=200,\n",
+ " train=True\n",
+ "), batch_size=1, shuffle=True)\n",
+ "\n",
+ "# Create data loader of validation set.\n",
+ "data_loader_eval = DataLoader(MnistBags(\n",
+ " target_number=9,\n",
+ " mean_bag_length=10,\n",
+ " var_bag_length=2,\n",
+ " num_bag=50,\n",
+ " train=False\n",
+ "), batch_size=1, shuffle=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "log_dir = f'resources/'\n",
+ "os.makedirs(log_dir, exist_ok=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "Create Auxiliaries \n",
+ "\n",
+ "Before digging into Hopfield-based networks, a few auxiliary variables and functions need to be defined. This is nothing special with respect to Hopfield-based networks, but rather common preparation work of (almost) every machine learning setting (e.g. definition of a data loader as well as a training loop ). We will see, that this comprises the most work of this whole demo."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def train_epoch(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float, float]:\n",
+ " \"\"\"\n",
+ " Execute one training epoch.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader: data loader instance providing training data\n",
+ " :return: tuple comprising training loss, training error as well as accuracy\n",
+ " \"\"\"\n",
+ " network.train()\n",
+ " losses, errors, accuracies = [], [], []\n",
+ " for data, target in data_loader:\n",
+ " data, target = data.to(device=device), target[0].to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " loss = network.calculate_objective(data, target)[0]\n",
+ "\n",
+ " # Update network parameters.\n",
+ " optimiser.zero_grad()\n",
+ " loss.backward()\n",
+ " clip_grad_norm_(parameters=network.parameters(), max_norm=1.0, norm_type=2)\n",
+ " optimiser.step()\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " error, prediction = network.calculate_classification_error(data, target)\n",
+ " accuracy = (prediction == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " errors.append(error)\n",
+ " losses.append(loss.detach().item())\n",
+ " \n",
+ " # Report progress of training procedure.\n",
+ " return sum(losses) / len(losses), sum(errors) / len(errors), sum(accuracies) / len(accuracies)\n",
+ "\n",
+ "\n",
+ "def eval_iter(network: Module,\n",
+ " data_loader: DataLoader\n",
+ " ) -> Tuple[float, float, float]:\n",
+ " \"\"\"\n",
+ " Evaluate the current model.\n",
+ " \n",
+ " :param network: network instance to evaluate\n",
+ " :param data_loader: data loader instance providing validation data\n",
+ " :return: tuple comprising validation loss, validation error as well as accuracy\n",
+ " \"\"\"\n",
+ " network.eval()\n",
+ " with torch.no_grad():\n",
+ " losses, errors, accuracies = [], [], []\n",
+ " for data, target in data_loader:\n",
+ " data, target = data.to(device=device), target[0].to(device=device)\n",
+ "\n",
+ " # Process data by Hopfield-based network.\n",
+ " loss = network.calculate_objective(data, target)[0]\n",
+ "\n",
+ " # Compute performance measures of current model.\n",
+ " error, prediction = network.calculate_classification_error(data, target)\n",
+ " accuracy = (prediction == target).to(dtype=torch.float32).mean()\n",
+ " accuracies.append(accuracy.detach().item())\n",
+ " errors.append(error)\n",
+ " losses.append(loss.detach().item())\n",
+ "\n",
+ " # Report progress of validation procedure.\n",
+ " return sum(losses) / len(losses), sum(errors) / len(errors), sum(accuracies) / len(accuracies)\n",
+ "\n",
+ " \n",
+ "def operate(network: Module,\n",
+ " optimiser: AdamW,\n",
+ " data_loader_train: DataLoader,\n",
+ " data_loader_eval: DataLoader,\n",
+ " num_epochs: int = 1\n",
+ " ) -> Tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:\n",
+ " \"\"\"\n",
+ " Train the specified network by gradient descent using backpropagation.\n",
+ " \n",
+ " :param network: network instance to train\n",
+ " :param optimiser: optimiser instance responsible for updating network parameters\n",
+ " :param data_loader_train: data loader instance providing training data\n",
+ " :param data_loader_eval: data loader instance providing validation data\n",
+ " :param num_epochs: amount of epochs to train\n",
+ " :return: data frame comprising training as well as evaluation performance\n",
+ " \"\"\"\n",
+ " losses, errors, accuracies = {r'train': [], r'eval': []}, {r'train': [], r'eval': []}, {r'train': [], r'eval': []}\n",
+ " for epoch in range(num_epochs):\n",
+ " \n",
+ " # Train network.\n",
+ " performance = train_epoch(network, optimiser, data_loader_train)\n",
+ " losses[r'train'].append(performance[0])\n",
+ " errors[r'train'].append(performance[1])\n",
+ " accuracies[r'train'].append(performance[2])\n",
+ " \n",
+ " # Evaluate current model.\n",
+ " performance = eval_iter(network, data_loader_eval)\n",
+ " losses[r'eval'].append(performance[0])\n",
+ " errors[r'eval'].append(performance[1])\n",
+ " accuracies[r'eval'].append(performance[2])\n",
+ " \n",
+ " # Report progress of training and validation procedures.\n",
+ " return pd.DataFrame(losses), pd.DataFrame(errors), pd.DataFrame(accuracies)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def set_seed(seed: int = 42) -> None:\n",
+ " \"\"\"\n",
+ " Set seed for all underlying (pseudo) random number sources.\n",
+ " \n",
+ " :param seed: seed to be used\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " torch.manual_seed(42)\n",
+ " torch.backends.cudnn.deterministic = True\n",
+ " torch.backends.cudnn.benchmark = False\n",
+ "\n",
+ "\n",
+ "def plot_performance(loss: pd.DataFrame,\n",
+ " error: pd.DataFrame,\n",
+ " accuracy: pd.DataFrame,\n",
+ " log_file: str\n",
+ " ) -> None:\n",
+ " \"\"\"\n",
+ " Plot and save loss and accuracy.\n",
+ " \n",
+ " :param loss: loss to be plotted\n",
+ " :param error: error to be plotted\n",
+ " :param accuracy: accuracy to be plotted\n",
+ " :param log_file: target file for storing the resulting plot\n",
+ " :return: None\n",
+ " \"\"\"\n",
+ " fig, ax = plt.subplots(1, 3, figsize=(20, 7))\n",
+ " \n",
+ " loss_plot = sns.lineplot(data=loss, ax=ax[0])\n",
+ " loss_plot.set(xlabel=r'Epoch', ylabel=r'Loss')\n",
+ " \n",
+ " error_plot = sns.lineplot(data=error, ax=ax[1])\n",
+ " error_plot.set(xlabel=r'Epoch', ylabel=r'Error')\n",
+ " \n",
+ " accuracy_plot = sns.lineplot(data=accuracy, ax=ax[2])\n",
+ " accuracy_plot.set(xlabel=r'Epoch', ylabel=r'Accuracy')\n",
+ " \n",
+ " fig.tight_layout()\n",
+ " fig.savefig(log_file)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Attention-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "network = Attention().to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=5e-4, weight_decay=1e-4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate Attention-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "losses, errors, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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QPyNs81tjG32CeXMzEyUlJTUvS4pKak3bf2X248fP37aae3RYM2aNbj55pvxP//zP5g0aVK9bYWFhfXu9Agh6u7wRJvVq1dj+fLlda9/GWssXRMA8Hq9WLVqFUaMGNFgWyxdF+Dc/14AICUlBVVVVQgEAmfcJxrs2bMHkydPxqRJk3DPPfc02F5VVYU33nij7rUQAoqiRDDCxtmxYwc+++yzuten+xmKlWsCAF9++SXGjRt32m2xck2oPo6z0SeexlmOsdH7eR4P42y8jbEAx9l4E09jLBAf42w8jbEAx9lo/UyPhzEWiL9xtrmNsc0+oTxw4EAsX74cpaWlcLlcWLJkCYYOHVq3PScnByaTCWvWrAEALFiwoN72aHH06FHcc889eOaZZzB+/PgG281mM/7+97/j0KFDEEJg9uzZGDlypA6RnltVVRWefvppeDweVFdXY968efVijZVrcsqOHTuQm5sLq9XaYFssXRcA6NWrF/bt24cDBw4gEAjgo48+avB3bzAY0L9/f3zyyScAgPnz50fd9amursZtt92G3/72t7j11ltPu4/VasXrr79etyrzrFmzovLaCCHw1FNPoaKiAj6fD++9916DOGPhmgC1j2y53W60atXqtNtj5ZpQfRxno088jbMcY6Pz8zxextl4GmMBjrPxKF7GWCB+xtl4GmMBjrPR+JkeL2MsEF/jbLMcY8Oy1F+MWbhwoRg/frwYNWqUeO2114QQQtx+++1i48aNQgghtm3bJq688koxevRo8fvf/154PB49wz2tv/zlL6J3797isssuq/vv7bffrtePxYsX1/XzwQcfjMp+nPLss8+KMWPGiFGjRok33nhDCBF71+SUjz/+WPzud7+r916sXZfhw4fXrV66bNkyUVBQIEaNGiWefPJJoWmaEEKIhx9+WHzxxRdCCCEOHz4sbrjhBjF27Fhx6623ivLyct1i/7lT/fjPf/4junXrVu/fy3PPPSeEqN+PVatWicsvv1yMGTNG3HnnnaKyslLP8Ov5+TWZNWuWGDt2rBg5cqT4+9//XrdPLF0TIYTYsGGDuPrqqxvsEyvXhM6M42z0iZdxlmNs9HyeCxE/42y8jLFCcJxtDuJhjBUivsbZeBljheA4G02f6fEyxgoRP+Nscx9jJSGE0DupTURERERERERERETRr9mXvCAiIiIiIiIiIiKixmFCmYiIiIiIiIiIiIgahQllIiIiIiIiIiIiImoUJpSJiIiIiIiIiIiIqFGYUCYiIiIiIiIiIiKiRlH1DoCIwqNTp07o2LEjZLn+faMZM2agZcuWIT/X8uXLkZKSEtJ2iYiIohXHWSIiovDgGEsU/ZhQJopjb775JgdGIiKiMOE4S0REFB4cY4miGxPKRM3QihUr8MwzzyA7Oxt79+6F2WzG3/72N+Tl5aGqqgqPPfYYtm/fDkmSMGTIEPz+97+HqqrYsGEDnnjiCbhcLhgMBvzhD3/ARRddBAB44YUXsGHDBpSXl+O2227DlClTdO4lERGRPjjOEhERhQfHWKLowIQyURy76aab6j0m1LJlS8yYMQMAsHnzZvzxj39E//798c477+CBBx7A3Llz8cQTT8DhcGDRokXw+Xy466678O9//xu33HIL7rnnHjzxxBO4+OKLsXnzZjz00ENYsGABAKBVq1aYPn06tm7dimuvvRbXXHMNDAaDLv0mIiKKBI6zRERE4cExlii6MaFMFMfO9phQ586d0b9/fwDAlVdeiccffxxlZWX47rvv8M4770CSJBiNRkyePBlvvvkmBg0aBFmWcfHFFwMAunfvjkWLFtW1N2HCBABAly5d4PV6UV1djeTk5PB2kIiISEccZ4mIiMKDYyxRdJPPvQsRxSNFUU77nqZpkCSp7j1N0+D3+6EoSr33AWDnzp3w+/0AAFWtvT91ah8hRLhCJyIiinocZ4mIiMKDYyyR/phQJmqmtm/fju3btwMA3nvvPfTp0weJiYkYPHgwZs2aBSEEvF4v5syZg4EDB6Jdu3aQJAlLly4FAGzZsgU33XQTNE3TsxtERERRieMsERFReHCMJdIfS14QxbFf1p0CgN///vcwm81IS0vDc889hyNHjiAlJQVPP/00AOCRRx7BE088gYKCAvh8PgwZMgR33nknjEYjXnjhBTz11FN4+umnYTAY8MILL8BoNOrRNSIiIt1xnCUiIgoPjrFE0U0SnMtP1OysWLECf/nLX/DRRx/pHQoREVHc4ThLREQUHhxjiaIDS14QERERERERERERUaNwhjIRERERERERERERNQpnKBMRERERERERERFRozChTERERERERERERESNwoQyERERERERERERETUKJumPCwAAADFJREFUE8pERERERERERERE1ChMKBMRERERERERERFRozChTERERERERERERESN8v8BiswBcF0kJtkAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, error=errors, accuracy=accuracies, log_file=f'{log_dir}/attention_base.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "GatedAttention-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "network = GatedAttention().to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=5e-4, weight_decay=1e-4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate GatedAttention-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "losses, errors, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, error=errors, accuracy=accuracies, log_file=f'{log_dir}/gated_attention_base.pdf')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Hopfield-based Pooling "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "class HfPooling(Module): \n",
+ " def __init__(self):\n",
+ " \"\"\"\n",
+ " Initialize a new instance of a Hopfield-based pooling network.\n",
+ " \n",
+ " Note: all hyperparameters of the network are fixed for demonstration purposes.\n",
+ " Morevover, most of the notation of the original implementation is kept in order\n",
+ " to be easier comparable (partially ignoring PEP8).\n",
+ " \"\"\"\n",
+ " super(HfPooling, self).__init__()\n",
+ " self.L = 500\n",
+ " self.D = 128\n",
+ " self.K = 1\n",
+ "\n",
+ " self.feature_extractor_part1 = Sequential(\n",
+ " Conv2d(1, 20, kernel_size=5),\n",
+ " ReLU(),\n",
+ " MaxPool2d(2, stride=2),\n",
+ " Conv2d(20, 50, kernel_size=5),\n",
+ " ReLU(),\n",
+ " MaxPool2d(2, stride=2)\n",
+ " )\n",
+ " self.feature_extractor_part2 = Sequential(\n",
+ " Linear(50 * 4 * 4, self.L),\n",
+ " ReLU(),\n",
+ " )\n",
+ " self.hopfield_pooling = HopfieldPooling(\n",
+ " input_size=self.L, hidden_size=32, output_size=self.L, num_heads=1\n",
+ " )\n",
+ " self.dp = Dropout(\n",
+ " p=0.1\n",
+ " )\n",
+ " self.classifier = Sequential(\n",
+ " Linear(self.L * self.K, 1),\n",
+ " Sigmoid()\n",
+ " )\n",
+ " \n",
+ " def forward(self, input: Tensor) -> Tuple[Tensor, Tensor, Optional[Tensor]]:\n",
+ " \"\"\"\n",
+ " Compute result of Hopfield-based pooling network on specified data.\n",
+ " \n",
+ " :param input: data to be processed by the Hopfield-based pooling network\n",
+ " :return: result as computed by the Hopfield-based pooling network\n",
+ " \"\"\"\n",
+ " x = input.squeeze(0)\n",
+ " H = self.feature_extractor_part1(x)\n",
+ " H = H.view(-1, 50 * 4 * 4)\n",
+ " H = self.feature_extractor_part2(H)\n",
+ " \n",
+ " H = H.unsqueeze(0)\n",
+ " H = self.hopfield_pooling(H)\n",
+ " H = H.squeeze(0)\n",
+ " H = self.dp(H)\n",
+ "\n",
+ " Y_prob = self.classifier(H)\n",
+ " Y_hat = torch.ge(Y_prob, 0.5).float()\n",
+ "\n",
+ " return Y_prob, Y_hat, None\n",
+ "\n",
+ " def calculate_classification_error(self, input: Tensor, target: Tensor) -> Tuple[Tensor, Tensor]:\n",
+ " \"\"\"\n",
+ " Compute classification error of current model.\n",
+ " \n",
+ " :param input: data to be processed by the Hopfield-based pooling network\n",
+ " :param target: target to be used to compute the classification error of the current model\n",
+ " :return: classification error as well as predicted class\n",
+ " \"\"\"\n",
+ " Y = target.float()\n",
+ " _, Y_hat, _ = self.forward(input)\n",
+ " error = 1.0 - Y_hat.eq(Y).cpu().float().mean().item()\n",
+ "\n",
+ " return error, Y_hat\n",
+ "\n",
+ " def calculate_objective(self, input: Tensor, target: Tensor) -> Tuple[Tensor, Optional[Tensor]]:\n",
+ " \"\"\"\n",
+ " Compute objective of the current model.\n",
+ " \n",
+ " :param input: data to be processed by the Hopfield-based pooling network\n",
+ " :param target: target to be used to compute the objective of the current model\n",
+ " :return: objective as well as dummy A (see accompanying paper for more information)\n",
+ " \"\"\"\n",
+ " Y = target.float()\n",
+ " Y_prob, _, A = self.forward(input)\n",
+ " Y_prob = torch.clamp(Y_prob, min=1e-5, max=(1.0 - 1e-5))\n",
+ " neg_log_likelihood = -1.0 * (Y * torch.log(Y_prob) + (1.0 - Y) * torch.log(1.0 - Y_prob))\n",
+ "\n",
+ " return neg_log_likelihood, A"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "set_seed()\n",
+ "network = HfPooling().to(device=device)\n",
+ "optimiser = AdamW(params=network.parameters(), lr=5e-4, weight_decay=1e-4)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Operate HopfieldPooling-based Network "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "losses, errors, accuracies = operate(\n",
+ " network=network,\n",
+ " optimiser=optimiser,\n",
+ " data_loader_train=data_loader_train,\n",
+ " data_loader_eval=data_loader_eval,\n",
+ " num_epochs=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ },
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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rNZUpYMopr2vd+K8xqfj652svtxZitc+2ovBPTNx11UDoBHV/eHJ6fLtVvxgSl/MvrgnNu4qw6dbT+CVD4vw1icH4PUHAQBDenbCpcPz0J+L7FGciGpB2eVy4cYbb8Rf//pX5Ofnh+/fs2cPFixYEL5dU1OD1NRUvP/++1ixYgWee+45ZGZmAgAuvvhiPPDAA9GM2Wqa7N4IVB2FHPRB0BqUjkNEFLcEQUBGRlaH98NLt4hiyzZwArzZ/J0jineROM/yHJs42vt68zWmRLG5qAL/+HAP+nVPx0+uGQitJnmKyaczGU4t4rfvWC2+2FmKNKsBE4d2RqdULrJH8SVqBeXt27fjkUcewZEjR1ps69evH1atWgUA8Hg8uO6667Bw4UIAwK5du7BgwQJMnz49WtHaTT/kCuiHTkv4hvBEREREZxJqqEOo/BBEew8ISTQziIiIiJSxbX8VXn5vN3rlpeKnswZzUTk0fojUt2s6+nZlOz2KX1F7p7Bs2TI89thjyMo69yepL730Ei688EKMGDECALBz506sWLECM2bMwC9+8QvU1dVFK2KbCaIWgiBAlhPtsiEiIiKi83N99yXcq34L2edSOgoRERGp3O7DNXhx5U50zbbi/uuGwKBnMZkoUUStoPzEE0+Ei8Rn43Q6sWzZMtx7773h++x2O+655x689957yM3NxaJFi6IVsV08n/0dng+eUToGERERUcSJxpN9wP1uZYMQERGRqu0tduD55TuQm2nBA9cPhcnAJb6IEomiv7HvvfceJk2aFO6XDAAvvPBC+Os77rgDl19+eZv3m5kZuRVh7XZbs9vVaamoP/QVOmUYIWgSa0XN748lUallHIB6xqKWcQDqGYtaxgGoayxE8U40mAEAst+jcBIiIiJSq4MldfjjOzuQmWrEz28YCqspsWorRKRwQXndunW46667wredTieWL1+OefPmAQBkWYZG0/ZLHqqrXZCk9q12fLozLWIQSOkGOehHedFuaLJ6dvgYsaKWBRnUMg5APWNRyzgA9YxFLeMAEn8soihE9ENOomgTjSwoExERUfQcLXNi8dvbkWrW4xc3DkOKRa90JCJqB8VWW5FlGbt378awYcPC95nNZvztb3/D9u3bAQCvv/56u2YoR5MmpzcAIFS2X+EkRERERJElGhpbXsi+BoWTEBERkdqcqHThube3wWTQ4BdzhiLdZlA6EhG1U0wLynfeeSd27twJAKipqYFOp4PBcOofEI1Ggz/+8Y9YuHAhrrzySuzevRvz58+PZcTzEs1pEGx2FpSJiIhIdTTmFIj2AghavsEjIiKiyCmvcePZt7ZBoxHwiznD0CnVpHQkIuqAqLe8WL9+ffjrJUuWhL/OzMzEl19+2eLxI0aMwIoVK6Idq0M02b0g1RxXOgYRERFRRGltGbBc85jSMYiIiEhFqmo9eOatrZBkGb+cMxzZ6WalIxFRB3EZzXYwXjQP0LLPDxEREamTLMsQBEHpGERERJTgHE4fnnlrK7y+EB68aRg6d7IoHYmIIkCxHsqJTNAZIAgCZLnjC/8RERERxRPX6/fDt+kNpWMQERFRgqtr8OOZN7fC6Q7gZzcMRddsm9KRiChCWFBuJ/eHz8K3canSMYiIiIgiSxAh+91KpyAiIqIE5vIE8NxbW1Hj9OL+64agR+cUpSMRUQSx5UUHhEqLlI5AREREFFGCwQz4PUrHICIiogS17UAVlq7dh7oGP+6/bjD6dElTOhIRRRgLyu2kyekN/5aVkH0NEAzsAURERETqIOjNkH2coUxERERt43D68Ma6ffhmbyU6d7LgwZnD0CsvVelYRBQFLCi3kya7NwAZoYqD0HYZrHQcIiIiosjQmyA31CqdgoiIiBKEJMn4dOsJLP/vQYQkGddO7IEpI7tCq2GXVSK1YkG5nTRZPQBBRKj8AAvKREREpBqC3gzJUaJ0DCIiIkoAxeVO/GtNEQ6XOjGgIAM/mNwHWelmpWMRUZSxoNxOgs4IMbMLpJoTSkchIiIiihjjxNsAUaN0DCIiIopjXn8QKzccxrotx2E1afGjq/pjVL9sCIKgdDQiigEWlDvAPHU+wP7JREREpCKCRqd0BCIiIopjX+8uwwvvbENNvQ8Th3bG7It7wmLk3w9EyYQF5Q4QjFalIxARERFFVODwFgR2fQzTFT+DoDMoHYeIiIjiRE29F2+s249v91Uir5MFv7plAHrnpykdi4gUwIJyB8gBL9wfPA1dn/HQ979U6ThEREREHSZ7nAiV7oXsd7OgTERERJAkGZ98exzvfn4IkiRj7tR+GD8gm4vuESUxFpQ7QNAZITfUIlRSBLCgTERERCogGBoX0pH9bsCSrnAaIiIiUtLRssZF946UOTGwIAO3TOmLAb2zUFnpVDoaESmIBeUO0mT3Qqj8gNIxiIiIiCJC0Jsav/B7lA1CREREimladO/jLcdgM+vx45kDcGFhFhfdIyIALCh3mCanN4KHvobkqoZozVQ6DhEREVGHCPqTM5R9boWTEBERkRK27qvE0nX7UFPvw8XD8jB7Yg+YuegeEZ2GBeUO0mT3BgCEyvZD7MWCMhERESU4/WktL4iIiChp1NR7sfTjfdi6vwr5dgt+/IOB6JWXqnQsIopDLCh3kJjZBdAaEKo6Al2v0UrHISIiIuoQ0dYJpmkPQszIVzoKERERxcimXWV4de1eyJKM6y7uicsv7MJF94jorFhQ7iBB1MBy/ZMQuGgNERERqYCg1UOb11/pGERERBQjkizjjXX70DnTjB/PHAh7mknpSEQU5/hxUwSI1gw2piciIiLV8G17H8Hi7UrHICIiohg4XuFCgzeIS4fns5hMRK3CgnIESLWlaFj5GwRL9igdhYiIiKjDAjs+YkGZiIgoSRQV1wIA+nXjlddE1DosKEeAYEqBVHEIobJ9SkchIiIi6ji9iYvyERERJYmiow5kpZmQkWJUOkrMyJIE7/G9kGVZ6SgJS/LUI1R+QOkYpBAWlCNAMFggpuchVLZf6ShEREREHSbozZB9LCgTERGpnSTJ2HusFoXd0pSOElP+7R+i5F8PIfDdeqWjJC5ZgufjP8O3ZQVkWVI6DcUYC8oRosnphVD5QcgSf4mIiIgosQl6E+D3KB2DiIiIoqy4wgmPL4i+XZOn3YXkqob/2/cAQYRv83LIvgalIyWUwKHNkLxOCAYLNPkD4P92FbzrXoQc9CkdjWKIBeUI0WT3BgIeSLUnlI5CRERE1CGC3gyZBWUiIiLVKzpaCwAoTKKCsm/jG4AA5Nz4MIwTfgjozUpHSgiyLMG3eTm8616Af9sHEDQ6GCfeAcPoGxA8/A3c7/0OkqtG6ZgUIywoR4gmpzcAIFR+UOEkRERERB2j7TUaugGXKh2DiIiIoqyo2IHsDDPSbQalo8SEHAoCWj30w66CucdQ6HpcCEEQIAc4u/Zc5IAP3o9fgH/raugKJ8Bw4WwAgCAI0A++EqYr/h+kunK4Vz/Z+D0m1dMqHUAtBJsdluufhJCao3QUIiIiog7R9bhQ6QhEREQUZSFJwr5jtRjdP1vpKDEjaLQwXXpXs8X4vJveRKi0COarH4Mgct7l90muang++j9INcdgGDMHuoGTIQhCs8douw6FeeajkOsrIGi0kGW5xWNIXfibEiGCIEBMy+UvDBERESU8yVWNYPEOrg1BRESkYkfLXPD6Q0nTP9n/3XoEDn4NAM1qN5qsnpCqjiKw51OlosW1wN4vINVXwjTlAegHTTlr3UuTkQdt92EAAN+Xrzf2p+ZifarFgnIEBUv3omHVbyG5a5WOQkRERNRuwUNb4FnzByDAPspERERqtbfYAQAo7JqmbJAYkJyV8G16C8FDX7fYpu1xITR5/eHbvBySp16BdPFJclYCAPTDZsBy7SJouw5u1fNkSQJCAfi3rm5crI/tRFSJBeUIEkQNpPIDCJXtVzoKERERUbsJhsbFaWSfW+EkREREFC17ih3IzTQj1ar+/sm+TW8CAmAYM6fFNkEQYBh3CxD0wffVvxVIF19kWYLv63fQ8PavEKo6AkEUIabYW/18QRRhmPBDGEbPQfAIF+tTKxaUI0js1A3QaBEqP6B0FCIiIqL205sAALKfBWUiIiI1CoYk7D9Wh8Ju6m93ESzegeCRb6EfdhVEa+YZH6NJ6wz9oCkI7tuQ1DUdOeCF9+M/w7/tfej6jIOYnt+u/TQu1jcFpin3Q6ovh3vF4wjVHItwWlISF+WLIEGjg8beA6FyzlAmIiKixCXoT85Q9rPlBRERkRodKXPCFwihUOX9k+WgH96Nr0NIzYF+8JRzPlY//CpAo4OYnhejdPGlcfG9P0KqOQ7DmJugG3h5h9cJ03YdAvPMR+H76m2IlowIJaV4wBnKEabJ7gWp6ijkoF/pKERERETtcqqgzBnKREREatTUP7mvyvsnyw0OCIII47hbIGh053ysoDPCMOIaCHoTZCkUo4TxQZZCcH/wNKT6KpiueAD6QZM7XExuosnIg/nKn0EwWCC5auDb+j4X61MBFpQjTJPdG5BCCFUeVjoKERERUbsIJhs0eQMgnGx9QUREROpSdNSBPLsFKWa90lGiSkzNhvm6J6DNH9jq5wSOfIuGtx5MmgX6ZFmCIGpgHDcX5qsfhbZL6xbfa4/AgY3wb34H3o9fgBzwRu04FH0sKEeYJq8fzNf9Dpqc3kpHISIiiltf7CjFis+Stz9dvBOtmTBPmw9t535KRyEiIqIIC4Yk7D9Rp/p2F76t70OqK4Mgatr0PDEtB7K7VvUL9DUuvvdveD/7O2RZhjZ/ADTpnaN6TP2QaTCMmYPg0W9PLtZXHdXjUfSwoBxhgs4ITXpnCAK/tUREFHurV6/G1KlTMXnyZCxduvSsj/vss89w6aWXxjBZc3UNPvxj9W5s2F6iWAY6N1kKsoUXERGRCh0qqYc/IKFQxe0ugsU74N/8DgKHv2nzc5st0FemzjWy5IAX3rXPw7/tAwhaHRCjFhSCIEA/aApMUx6AVF/ZuFhfEi+CmMhY9YyCwKHNcP/nD5BlWekoRESURMrLy7F48WK88cYbWLlyJd5++20cONDyD7Sqqio89dRTCiQ85YpRXTG0tx2vrd2LgyV1imahM3P98x74tryrdAwiIiKKsL3FDggA+qp0hnLTQnxiag70g869EN/Z6IdfBcGSAe+Xr6mun7LkrIJ71RMIFm+DYezNMIy/tc2zuDtK23UwzFc/CmgNCJbujemxKTJYUI4C2e9G6NgOSHWlSkchIqIksnHjRowePRppaWkwm82YMmUK1qxZ0+JxjzzyCO69914FEp6iEUXM/8EIpFkNeOHdnahz+RTNQy0JejPARfmIiIhUp6i4FvlZVlhN516kLlH5d6yBXF8Bw7gfQNBo27UPQWeEYcyNkKqLEfju0wgnVE6o5jjcKxdBclXBdOXPoR94ecQW32srTXpnWK5dBP2QqQCAYNl+LtaXQNr3m0Xn1NQ/OVS2H5q06PafISIialJRUQG73R6+nZWVhR07djR7zKuvvor+/ftjyJAhsY7XQopFj3tnDcLvXvsGL6zchQfnDINWw8+644WgN0H2e5SOQURERGfg3/MZtJ37QUzNbtPzAkEJB07U4eKheVFKpizJWQn/1tXQ9rgQ2vwBHdqXtuBC6AZfAU1unwilU55os0OT0wf6C2fFRb2qaQHoUM0xeFb/DmU7BiJozQlv12R0ga5wAuSAD77N77R8vtYAw8jZAADftg8gu2tbPEY/ZCpESzoChzYjVLavxXZtwQhoc/siVF2MwN4NLba3N0OVSQ+vxx/zDLHCgnIUiKm5gMECqfwAUDhR6ThERJQkJElqNsNAluVmt/ft24e1a9fin//8J8rKytp9nMxMa4dynu6CgZ3x/26U8Mzr32DFl0dwz7XKF7rbw263KR0hYprG4rfYIMr+hB1bouY+E7WMRS3jANQzFrWMgyjZyLKMwK518G/7AJYbnoIgtv4D+UMldQgE1ds/OVR5pHF28eg5Hd6XIAgwjr4RQMu/qxOJLEnwf7sKuj7jIKZkwXS5slcqnomYng/DmJvg27YaUsmpln1y16HQFU4AQgEE9n3R4nmCwRIupAaPboXkONHiMbrCiwFLOkIVh864DzGtM5DbF7Kz+ozb25shJAiQTrbCjWWGWGFBOQoEQYAmu5dqm7cTEVF8ysnJwZYtW8K3KysrkZWVFb69Zs0aVFZW4tprr0UgEEBFRQVuuukmvPHGG206TnW1C5LU8XUC7HYbKiud6JefiitGdcV/Nh5BdqoRE4YoP1uiLZrGoQanjyUo6CG7nAk5NrW+JolMLeMA1DMWNYxDFIWIfshJlCgEQYB+2HR41/8VgaL/Qt//klY/t6i4FgKAPiotKOt6XAht18EQtIaI7VOqr4TnkxdhGHMTtCevSE8Ust8Dz/qXECreBmi0MAyboXSkMxIEAfqBlyPvkllnPDcJRits8/5yzn1YZj5yzu3G0TfAOPqGs27Xdh92zmO0NcOZzrOxyBArvK40SjQ5vSHVlUHyJvYfaURElDjGjh2LTZs2oaamBh6PB2vXrsWECRPC2++77z589NFHWLVqFV5++WVkZWW1uZgcLbMn9sSA7ul4fe1eHDzBRfrigWCwAuACw0RERPFG9jUAsgQhNRu+ze+0qe5QdNSBrtk2WIzq6p8sB/3w7/gIctAf0WIyAAimFMjuOvi+fDWhFuiTnJVwv/cEQsd2wDD2FuiHTlc6EqkIC8pRous9DubrnoBgsCgdhYiIkkR2djYeeOABzJ07F1dffTWmT5+OwYMH484778TOnTuVjndOoijgrpkDGxfpW7ETtVykT3HGS++C5ZrHlI5BRERE3yPVlcH76cvQ9Z0I+L3wf/3vVj3PHwjhYEkdCrulRTegAvzb/wPf/95EqOJgxPct6AwwjJkDqfoYAt+tj/j+oyFYtg/uFYsguaphuvJn0A+clLAtOyg+saAcJaIlHZr0PAgCv8VERBQ7M2bMwPvvv4+PPvoId955JwBgyZIlGDRoULPH5efnY/36+PqD2GrS4afXDobbF8SLK3YhGOIqz0rimw4iIqL41LRorianF3SDLkegaAOk2vOvj3HwRB2CIRmFXdOjHTGmpPpK+Le9D22PkdB27heVY2gLRkCTPxC+Le9Ccsf/1XRSdTFgMMNy9a+hzR+odBxSIVY7o8j/3afwfvma0jGIiIgSRpcsK26b2g8HTtThjY9broBMsRPYvxENyx+FHAooHYWIiIhOI/vdAABBb4Zh+EyYpv4CYlrOeZ9XVFwLQQB656dFOWFs+Ta9AQgiDCcX0IsGQRBgHHsLEPTD9/WyqB2nI2RJQvDEdwAAXf/LYJm1CGJarsKpSK1YUI4iqa4MgaLPIYeCSkchIiJKGCP7ZePK0V3x2bYS/Hdby5WaKTZkvxtS9bHwLCgiIiKKD7KvqaBsgqA3QZs/ALIsQ3JVn/N5RcUOdM+xwWzUxiJmTASPbkPw6FYYLpgJ0ZoR1WOJaTnQj5gFTU6fqB6nPSSfB561/wfPB08jVHUUgiBA0EW2lzTR6VhQjiJNdi8gFIBUdUTpKERERAnl2gk9MbAgA6+v3YcDXKRPEYLe3PjFyTetREREFCdOftgbPlcD8H+zAg3vPArJU3/Gp/gCIRwqqVddu4tg8XaIabnQDZwck+MZhk6DvnBiTI7VWpKzEif+9RBCx3bCMO4H0HTqpnQkSgJRLSi7XC5Mnz4dx48fb7Htz3/+My655BLMnDkTM2fOxNKlSwEAJSUluPnmm3HFFVfg7rvvRkNDQzQjRpUmpzcAIFR+QOEkREREiUUUBfzoqgHISGlcpM/h5CJ9sdb0JrXpsloiIiKKD0JqNrQ9RgI6Y/g+bc9RQMB31gX6DhyvQ0iSUdhNXQVlw/i5MF/1MARN7GZdy6EgvF+8Cv/udTE75tk0Lb4XclbDdOXPoR9wmdKRKElEraC8fft2zJkzB0eOHDnj9l27duEPf/gDVq1ahVWrVuHmm28GADz++OO46aabsGbNGgwcOBAvvvhitCJGnWhOg2CzI1S2X+koRERECcdq0uGnswbD6wvhxZU7EQhykb6Y0psAgC0viIiI4oyu+3CYJt3TbAFdTXoedIMmI7B3wxkntRUVOyAKAnrlpcYyatRI9ZUIHt/V2NrBaI3twUUNpPoK+L5erugCfbIUhPfTJYDBgs7zfg9t/gDFslDyiVpBedmyZXjssceQlZV1xu27du3CSy+9hBkzZmDRokXw+XwIBALYvHkzpkyZAgCYNWsW1qxZE62IMaHJ7oVQ+X7Isqx0FCIiooSTn2XFbdP64eCJeryxjov0xZJg4AxlIiKieCS5a8/Y2sIw/CoI5jR4v3gNstT8g/iiYgcKcm0wGdTRP9m36Q14Pv4zZK8r5scOL9AX8sP3VewX6JMlCbLfA0HUwjTlfliufhT6zM4xz0HJLWoF5SeeeAIjRow447aGhgb069cP8+fPx4oVK1BfX48XX3wRDocDVqsVWm3jP3B2ux3l5eXRihgT+mEzYJr2S6VjEBERJawLC7MwdXQ3/HdbCT7jIn0xI6Zkw3zNQs52ISIiijO+Df+C58NnWtwv6E0wjJkDqfoogvu+CN/v9QdxpNSpmnYX4YX4hl8V+9nJJ4lpOdAPvhLB/V8iWBa7SQ+y/+Tiex//GbIkQZORB8FgidnxiZoo8tGUxWLBkiVLwrdvu+02PPTQQ7jpppuaXbIBoMXt1sjMjNw/KHa7rYM76BuZIBHQ4bHECbWMA1DPWNQyDkA9Y1HLOAB1jYXab9aEHiiucGLp2n3I72RFr3x1XK4ZzwStHhp7d6VjEBER0ffIfnezBflOp+0xEsagv7Gn8kn7m/onq2BBPjnoh3fjUohpnWO2EN/Z6IfNQGD/Rvi+eA2aWQshiJqoHk+qr4Dno/+DVFsKw7hbIIhRXRaN6JwUKSiXlJRg48aNmD17NgBAlmVotVpkZGTA6XQiFApBo9GgsrLyrC0zzqW62gVJ6niLCbvdhspKZ4f349v6PgSNDvrBUzq8r/aK1FiUppZxAOoZi1rGAahnLGoZB5D4YxFFIaIfciYzURRw11UD8Jt/bsELK3bi1/MuRLrNoHQs1fP+721ocnpB1/0CpaMQEcWF1atX4y9/+QuCwSBuvfXW8FpATf773//i2WefBQD06dMHixYtgsXC2YMUWbLfDdHa6YzbBEGAru9FjY/zuiAYrSgqdkAjqqN/sn/7h5CdlTBOezCmC/GdiaAzwDD2JoSKtwNBf3j9iWgIlu6F9+M/Q5YlmKb+Atq8/lE7FlFrKPJxhtFoxDPPPINjx45BlmUsXboUl19+OXQ6HUaMGIEPP/wQALBy5UpMmDBBiYgRFSotQmDvBqVjEBERJTSLUYd7rx0Erz+EF1dwkb5YCBR9htCJPUrHICKKC+Xl5Vi8eDHeeOMNrFy5Em+//TYOHDi1+Fl9fT0WLFiAxYsXY/Xq1SgsLMTixYsVTExqJfvc5y1eBk98B9cbP0Oo/ACKjtaioHMKDProzqCNNlkKInBgE7Q9R8VNQVVXMALGibdDiGIxOVR+AJ4PnoZgsMBy9aNxM3ZKbjEtKN95553YuXMnMjIysGjRItx999244oorIMsyfvjDHwIAHnvsMSxbtgxTp07Fli1bcP/998cyYlRocnpDcpyA7GtQOgoREVFCy7dbcfu0fjhYUo+lH3ORvmgT9GbIfo/SMYiI4sLGjRsxevRopKWlwWw2Y8qUKc0WkT9y5Ag6d+6MXr16AQAuueQSrFu3Tqm4pGKy33PeAqbGXgDBYIF7w6soLqtTRbsLQdTCMmsRDONuUTpKC4EDm+Dd9GZU9i3aC6AfOh3mqx+FmJoTlWMQtVXUrw9Yv359+OvT+yZPmTIFU6a0bAGRl5eH1157LdqxYkqT3RuAjFDFQWi7DFY6DhERUUIbUZiFaWO64YNNR9E9x4aLh+UpHUm1BL0Z8LuVjkFEFBcqKipgt9vDt7OysrBjx47w7e7du6OsrAxFRUUoLCzEf/7zH1RVVSkRlVRMlmUIJhsEy7kLxILeBMPoOfB+8iLG6PeiX9dhMUoYHaGKQxAs6RAt6RB08df2THKUILDzI4QqDkLAybXADBaYr7gfAOD55K+QXdUtnme89C6Itk7wb/8QwSNbm22T/W4YJ94OTVYPGEZcE+0hELWJsg1nkoQmqwcgiAiV7WdBmYiIKAKuuagHistdWPrxPuTZLeidn6Z0JFUS9CbILCgTEQEAJElqtmi8LMvNbqekpOCpp57Co48+CkmScP3110On07XpGJFee0EtixurZRxAhMZy74utepjc6VJ8+9UaTJO3oUefH8GcGrnvYyxfEyngw/Flf4XGnIq8H/4+ovuO1Diky+egKtSAUH1l+D7RaArvv8JiQihkbPG8zEwrtKk21KVY4DZ9b7vZBCucsLYyo1p+T9QyDkBdY/k+FpRjQNAZIWZ2Qaj8wPkfTEREROcligJ+dFV//OZfW/Diil1cpC9a9CbIDQ6lUxARxYWcnBxs2bIlfPv7i8iHQiHk5OTg3//+NwBgx44d6NKlS5uOEakF5oHEX9y4iVrGASgzlpW+0ZgrvIXqda+iYcJtEdlnrMfh27ICwdoK6Mb/MKLHjfQ4hNFzWxTZmvYvjL71jAU4hx9ApRMomAhtwcQW2z0APK3IqJbfE7WMA0j8sZxvgXlFFuVLRoaxt8AwNv76/BARESUqi1GHn84aBG8ghBe4SF9U6PtdAv2QK5WOQUQUF8aOHYtNmzahpqYGHo8Ha9eubbaIvCAIuO2221BeXg5ZlvHPf/4TU6dOVTAxqVHIUQLX0p8heGzneR/r9gawvUKLotwZ0A+ZFoN0kSfVV8C//QNoe46GtnM/peMQ0UmcoRwj2pzeSkcgIiJSnTy7FXdM64cXVuzCH/+9HXmdLDHPYDLr4XH7Y37caLh8THfYrfrwbW23ocqFISKKM9nZ2XjggQcwd+5cBAIBzJ49G4MHD8add96J++67D4MGDcKiRYtwxx13wO/3Y8yYMbj99tuVjk0qI/tckBtqgNParZzN3mO1kGUgfcjFEFPTIYeCgCBAEDUxSBoZ3o1LAVELw+gblI5CRKdhQTlGZFmG/9v3IJhSoO9/idJxiIiIVOOCvlmYfXFP/Od/R3G0LPaXlQmiADlClycryesPodYdwD0zB4Tvk2rLEKo6Am3PUc36hBIRJasZM2ZgxowZze47ffH5iy++GBdffHGMU1FSObm2gaA3n/ehe4trodWI6NE5BZKnHp73fgfdgEnQD5wU7ZQREXKUIHRsJwyjrod4nkUIiSi2WFCOEUEQECrZA9lTB12/i/mmjIiIKIKmju6GqaO7KXLsRO+P1uRP7+xAVa2n2X3Bo9/C99UyWLsNBXQtF5IhIiKi2JL9jedqQW8672OLjjrQKy8FOq0GssYGwZoJ35bl0PYcCdGUEu2oHaZJ7wzz7N9CTM06/4OJKKbYQzmGtD1HQqothVRzXOkoMSFLEmQpqHQMIiIiaoU0mwHVdd7md56c/ST73AokIiIiou8Ln5PPM0PZ5QngWIULhd0aZ/YKggDDuJuBoB++r5ZFO2aHhcoPQJZC0KR3hiByLiRRvGFBOYa0BSMAQUTw4FdKR4kJ/+Z34F7+GGQ58S8DJiIiUrt0qx5Otx/+QCh8X9PltE2zoYiIiEhZrZ2hvLe4FjKAwq6nWkVo0jpDP/gKBPd9gWDZ/mjG7BCprhzu1b+Hf/NypaMQ0VmwoBxDoikFms79EDj4VVIUWYWULEiOE5CqjyodhYiIiM4j3dbY0qLW5QvfF36z6ucMZSIionigH3g5LHOegaDVn/Nxe4sd0Gsb+yc3e/6wqyBYMuD78lXIkhTNqO0iy3LjQnwaLXQDL1c6DhGdBQvKMabtORKys1L1bS+k2lLoCkYAogaB/ZuUjkNERETnkW4zAAAcztMKyoamGcosKBMREcUDQWeAaLOf93FFxQ70yk+FVtO87CPoDDBeNBf6YTOAOFzbKXh0K0LHdsBwwdVciI8ojrGgHGO6HiNhvu530GR2UTpK1ITKD6Bh2a8QPL4L2i6DETz4VVx+8klERESnpJ2poGxOg7ZgBASjTalYREREdBr/jjXwff3vcz6m3u3H8cqGZu0uTqftOhS6HiMhCEJcvVeXgz74Ni6FmJ4H3cBJSschonNgZ/MYE/QmaFqxGmsi821ZAcFog7bb0Mae0Ue3IlRaBG1ef6WjERER0VlkNBWUT2t5IVozYbr8XqUiERER0fcET+yG7HXBcI7H7CuuBYDwgnxnIssyvP/9GwABpovviGjG9grs+xKyqxrG6Qu4EB9RnOMMZQWEHCfQsPwxhMoPKB0l4oKlexE6sRv6oVMh6IyNRWWdCaHKQ0pHIyIionMwGbQwGTTNZijLsgzJUw/Z16BgMiIiImoi+z3hRXPPpqjYAYNOg+45Z7/CSBAEiOa0uFqgT9fvYpimL4C2c6HSUYjoPFhQVoBoyYBUewKBg18pHSWiZFmGf/NyCOY06PpfCgAQtHpYb34OhqHTFU5HRERE55ORYmpWUAaAhqU/g3/bBwolIiIiomZ87lOL5p5FUXEtep+hf/L3NV+gLxTJlG0iyzJCjhIIgshiMlGCYEFZAYLe1Nhb+NBmyHL89CvqqNCJ3QiV7YN+2HQI2lMX4Ah6M2RZhuz3KJiOiIiIzqdTmhG1p/dQFgQIehPP4URERHFC9rvPOUO5rsGPkqqGc7a7aCLoDDCMmQOp+hgC362PZMw2CR7dCve/H0Lw+C7FMhBR27CgrBBtj5GQ3bUIxcmlJZGgsRdAP3I2dIUTW2zzrH4S3s/+pkAqIiIiaq3MVFOzHsoAAL2ZBWUiIqI4Ifs9wDlmKO8tdgDAWRfk+z5twQho8gfCt/ldSO66iGRsi1ML8eVDw9nJRAmDBWWFaLsNBTR6BFXS9kKWZQgGCwxDp0PQ6FpsFzt1Q7B4O3swEhERxbHMVCNqnX5Ikhy+TzCYIfvdCqYiIiKiJsaLb4eu95izbi8qroVRr0G3HGur9icIAoxjb4Gu30QIWn2kYraaf+v7kF3VMIz/ARfiI0ogLCgrpGnBOqn6mNJROkyWJXg+eBr+PZ+d9TG6XmMAKYjg4W9iF4yIiIjaJDPVBEmWUe/2h+9rbHnBgjIREVE80PUYCU2n7mfdXnTUgT5d0qARW1/uEdNyYBx9IwS9CcET30Gqr4hA0vOT6srh3/4faHuNgTa3b0yOSUSRwYKygowTfgjTVQ8pHaPDgoe/QahkzxlnJjcR7QUQUrIROLAphsmIiIioLTJTjQDQbGE+wZLebG0EIiIiUobsa4B/9ydnLfg6nD6U1bhb3e6ixf5DQXj/+3e4VyxCsKSoI1FbxbflXUCjg2H0DVE/FhFFFgvKChL0JgiCkNCzfmRJgn/LCohpudD2OvtlN4IgQNdrNEIlRZAaHDFMSERERK11poKy6eI7YZ42X6lIREREdJLkrILvy9cQqjnzlc57j53sn9wtrV37FzRamKfNh2C0wvPBM/AX/be9UVvFOO4HME3+KURzWlSPQ0SRx4KywnxbVsD15nzIoaDSUdolePB/kGpLoB9xDYTzXFKj6zUGYqeukBVo9E9ERETn1ym1cZGf0wvKREREFB+aJqMJevMZtxcdrYXJoEXXLFu7jyGm5sB89aPQ5PWD7/NX4N30JmRJavf+zkQO+iB7XRCMVmjz+kd030QUGywoK0xj7w74GhA6sVvpKG0mS0H4vlkJMbMLtAUjzvt4MS0HllmPN46ZiIiI4k6q1QCNKKDWdaqg7P9uPVxv/gKyFFIwGREREZ23oFzsQN8uaRBFoUPHEQwWmK54ALoBkxDY/Qmk2hMd2t/3+be+j4Zlv4LsdUV0v0QUOywoK0yTPxDQmxA4+LXSUdpM9jZAtNlhuGAWBKH1P0qhmuNse0FERBSHRFFAqlWPmvrTZiiHApCdVYDfo1wwIiIiCp+LBb2pxaaaei8qHB4Udk2LyKEEUQPjuFtgue4JaDK6QJYkSK7qDu9Xqi2Df/t/oOkyCILRGoGkRKQEFpQVJmh00Ha/AMEj30IO+s//hDgimlNhnjYfmm5DW/0cyVMP9zuPIrDns6jlIiIiovZLtxmazVBumgWVyGs+EBERqYHsO/sM5b3FtQCAwm7tW5DvbMTUbACA/5sVaFj+6w4t1ifLMrwbX29ciG/U9ZGKSEQKYEE5Duh6jgQCHgSP71I6SqsFjnyD4InvADQuuNdaoikFmrx+CBzYBFmWoxWPiIiI2indamjeQzlcUOYMZSIiIiWJ6XnQFV4MnGGG8p5iByxGLfKzojPrV9dnPERTCjwfPIP6rR+3ax/BI98gdHwXDCOu4UJ8RAmOBeU4oMnrDzGzGxBMjAVw5KAfvi9eg/+ble0qCut6jYFcXwGp8lAU0hEREVFHpNkaC8pN5/imy2o5Q5mIiEhZ2vwBME6YB0HUtNhWdNSBPl3SILZhwldbiKnZ4cX6qj78K7wb32jT+gqyFIRv05sQM/KhG3BZVDISUeywoBwHBFELy7WPQ9drjNJRWiXw3XrI7lroL7y2TbOTm2gLLgA0WgQO/C8K6YiIiKgjMmxG+AIheHyNbxIFA1teEBERxQOpvhJSfUWL+6vqPKiq80a83cX3CXozTFc8gJQLpyGway3836xs/XNFLUyX3Q3jhNvOWBAnosSiVToAnSK564CAN9yjKB7JAS/82z6AJm8AtLl927UPQW+GtutQBA9+BXn0jTyZEBERxZE0mx4A4HD5YDZqIaZ1huWGpyBYovsmlYiIiM7N97+3INWVwXLdE83ub+qf3K9r9M/VgqhBp8m3wW/Ng7bLYACALEsQhLPPV5T9bkBngia7V9TzEVFscIZynJBlGe53H4Pv638rHeWc/LvWQfY6YRhxTYf2o+t/aeNlLqFghJIRERFRJKRbDQAAh9MLABC0eoip2RC0eiVjERERJT054Dlj/+Siow5YTTp0tltilkXXeywEoxWSuxbudx9DsGTPGR8nyzI8616E56M/ch0lIhVhQTlOCIIAbfcLECzeATngVTrOGcmyhOD+jdB0HdLhTxa1ef1hGD4Tgs4QoXREREQUCekpRgAIL8wnyzK8n/8DgUOblYxFRESU9GSfG8LJxXLD98kyioodKOwavf7J5xQMAKEQPB88C/+ez1puPrkQnzZ/YLtaZhJRfGJBOY5oe44EQn4Ej25TOsoZCYII8zWPwXjRvIjsT2pwwLd1NeQEWYyQiIgoGaRbG2ci154sKAuCgMCBrxAqP6BkLCIioqQn+z0tCsqVdV5U1/vQNwbtLs5ETLHDfPUj0OQPgG/DP+H98vXwYn1ywAffxjcgZnSBrv+liuQjouhgQTmOaHJ6Q7CkI3jwK6WjtCD7GiB56iHoDBAj1ENRqiuDf/NyBI9uj8j+iIiIqON0Wg2sJl14hjIACHoT4PcomIqIiIjgdzeek0+z96gDAKK+IN+5CHozTFPuh27QFAR2r4NnzWLIUgj+rashN9TAMP4HXDuJSGVYUI4jgiBCW3Ahgsd2xt1K6v5tH6DhrQche10R26cmpy8EcxqCBzZFbJ9ERETUcek2w/cKyua4+9uEiIgo2QgpWRBTsprdV1TsQIpFj86Z5rM8KzYEUYRxzBwYJvwQmpw+kJ1V8O/4D7S9x0Gb00fRbEQUeVqlA1Bzut5jASkIOehvcSmLUiR3Hfy710Hb/QIIRmvE9iuIIrS9RiOw62PIXldE901ERETtl24zwOE6rSWVwQyZM5SJiIgUZbn60Wa3G/sn16Kwa1rc9CfWF04EAMhSCIbRN0LbY6TCiYgoGjhDOc5o7N1hHD8XojlN6Shh/m0fAKEgDBfMjPi+db1GA1IIgcNbIr5vIiIiap806/dnKJs4Q5mIiCjOVDg8cDiV6598LoKogX7g5RDNqUpHIaIoYEE5Dsl+N/xF/41oe4n2klw1COxZD12fcRBTcyK+fzGzG8S0XLa9ICIiiiMZNgOc7gACQQkAoB90BQwXXK1sKCIioiQWqi2B85UfI3D4m/B9RcUn+yd3TVMoFRElK7a8iENSXQV8n78CyDL0/S5WNIt/6+rGHMOvisr+BUGAYdwPIJhsUdk/ERERtV2azQAAqHP50CnNBG3+AIUTERERJTmfGwh4IWhOlXGKimuRatUjJyM+2mUSUfLgDOU4JHbqBiElG8FDXysdBbr+l8Iwfi5Emz1qx9Dm9Ycmo0vU9k9ERERtk36yoFxzsu1FqLoY/j2fKZiIiIgouYXXMji51pIsyyg66kC/rulx0z+ZiJIHC8pxSBAE6HqORKhkDyR3nWI5ZFmGJrNLuKl+NAUOfQ3P+peifhwiIiI6v6aCcu3JhfmCxTvg2/BPyEG/krGIiIiSVlNBWdCbAABlNW7UNfjRl+0uiEgBLCjHKW3PkYAsI6jQYnVSbSncKxYiVH0sJseT3XUIHtiEUM2JmByPiIiIzq6poNy0MF/Tm9fw7CgiIiKKqabFcYWTM5SLimsBAIXd4m9BPiJSPxaU45SYng8xrbNibS9836yCVFsKIUYrsmp7jAQEkYvzERERxQGzQQu9TjxVUDac7M148s0sERERxVi4oNz4IW/RUQfSbQZkpZmUTEVESYqL8sUpQRBgGHkdoNXF/NihmuMIHvwK+qFTIZpSYnJM0ZwKTV5/BA7+D/oLr2UPKCIiIgUJgoB0q4EzlImIiOKEbtAV0BVOBHRGyLKMvcUODCjI5HtnIlIEZyjHMW33YdDmD4z5cf1bVgA6I/SDr4zpcXW9xkB2ViFUfiCmxyUiIqKW0m2nCsrQWwCcutyWiIiIYksQRQgGCwRBQIM3iHp3AN2yrUrHIqIkxYJynAse2wnfV8tidrxQ1REEj3wD/eApEIyxPTlpuw8HNHqEirfH9LhERETU0ukFZdGaAV3fCRBidOUSERERNefb9j68G/4F4NQaB+kpRiUjEVESY8uLOBeqOgr/9g+hG3AZRGtm1I8ne10QM7tBP2hy1I/1fYLeBMvsRRBSsmN+bCIiImouzWZArcsHSZYhWjNhnHib0pGIiIiSVqjsAOSGGgCnFZRPLqJLRBRrUZ2h7HK5MH36dBw/frzFtnXr1mHmzJm46qqrcM8996Curg4AsGLFCowfPx4zZ87EzJkzsXjx4mhGjHu6niMBAMGDsVmcT5s/EOZZC8Mrx8aamJoDQRAgS5IixyciIqJG6VYDQpIMpzsAWZYh1ZVDctcpHYuIiCg5BTzhNQ1qXScLylYWlIlIGVErKG/fvh1z5szBkSNHWmxzuVxYuHAhXn75Zbz33nvo27cvnn/+eQDArl27sGDBAqxatQqrVq3CAw88EK2ICUFMyYJoL0DgUHQLyrLXBd+WdyG5qhVv6u9Z+zy8ny1RNAMREVGyS7c1XkZb6/QBkNHw9gIEdq9TNhQREVGSkn3u8MSvmnovBACpVr2yoYgoaUWtoLxs2TI89thjyMrKarEtEAjgscceQ3Z2Y2uDvn37orS0FACwc+dOrFixAjNmzMAvfvGL8MzlZKbrORJS5WFI9RVR2X+o5hgaVjwO//YPEao8HJVjtIVgsiF45BvIAa/SUYiIiJJW02W0DqcPgiACehNkv0fhVERERMlJ9ruBkwXlWpcPKRY9tBoui0VEyojavz5PPPEERowYccZt6enpuPzyywEAXq8XL7/8MiZNmgQAsNvtuOeee/Dee+8hNzcXixYtilbEhKHt0dj2IhqzlAOHv4F75W+BUADmGb+CruDMr1ksaXuNAYJ+BI98q3QUIiKipHWqoNz4Aa+gNzW+mSUiIqKYk/2nWl44nH6ksX8yESlI0UX5nE4nfvKTn6CwsBDXXHMNAOCFF14Ib7/jjjvChee2yMy0Riyj3W6L2L7aH8IGzy2Pw5DXB6K2/Ze0nD4WWZZR+8W/4fz8bRg690b27AehtWVEIm2HyZ2Go/i/nSAUb4F97JQW2+PiNYkQtYxFLeMA1DMWtYwDUNdYiBJJqkUPURDgONmnUTCYAc5QJiIiUoRp0k8gmNMANH7Y2ynVpGwgIkpqihWUKyoqcPvtt2P06NF46KGHADQWmJcvX4558+YBaCx6ajSaNu+7utoFSZI7nNFut6Gy0tnh/USEuRtcDh8AX7uefqaxeKuroO09DrqLboXDqwO8cTJWAJqCkfDsWIPy4hMQTSnh++PqNekgtYxFLeMA1DMWtYwDSPyxiKIQ0Q85iWJJFAWkWvXhleQFvZkzlImIiBSizR8Q/trh9KF3lzTlwhBR0lOk4U4oFMKPf/xjXHnllXj44YfDi8CZzWb87W9/w/bt2wEAr7/+ertmKKuRLEnwfPJX+LZ92KH9SM5KBIsbv7+GMTfDePEdEDow6zlatL3HQDDaINWVKR2FiIgoaaVZDeGCspiaDeG0D3mJiIgoNmRfA3xbVyPkOAF/IIQGbxDpVra8ICLlxHSG8p133on77rsPZWVl+O677xAKhfDRRx8BAAYOHIgnnngCf/zjH7Fw4UJ4vV50794dTz/9dCwjxi1BFCG7HQhWH4V+yJXhInxbBEv2wPvxC4BGC8uNT8dlIbmJJqMLLDcvhiBykQEiIiKlZNgMKKluAAAYJ9ymcBoiIqLkJDXUwL95OcTUHDiQDuDUWgdEREqIekF5/fr14a+XLFkCABg0aBCKiorO+PgRI0ZgxYoV0Y6VkLQ9R8H3xauQao5Dk9ml1c+TZRl1W9bAs/YfEFOzYZpyX1wXk5sIogjJ64QAAYKRl4wTERHFWprNgO+O1igdg4iIKKnJvsaWU4LejNqTVw6xoExESuL0zwSiLRgBCAKCB79q9XPkUBC+Df9C9UdLoOkyEOarH4WYmhPFlJEjeZ1oeP1++Pd8qnQUIiKipJRuM8DjC8HjC8K//T9w/usnkOWOr1NBREREbXByUVxBbwq3omJBmYiUxIJyAhFNKdB07o/Aoa9b/WZOqi9H4MBGpI2dBdPk/wdBnzgrwYpGGzRZPRE8sIlvXomIiBTQ9Ga11nVyUWBfAxDwKpiIiIgo+TQtiivozeGCchp7KBORglhQTjDaniMhN9RCdlad83EhRwlkKQhNeh4sNzyFjEtuTsh+xNpeoyE5SiDVHFM6ChERUdJpWvDH4fQBBjOAU29qiYiIKDbC515DY0HZZNDAZIjpklhERM0kXoUxyel6jYZ17p8gptjP+pjAwa/hfnch/FtWAgBES3qM0kWetseFgKBBYP8mpaMQERElnaYZyg6nL3yVk3zyslsiIiKKDTGzG3SDr2ycoezycXYyESmOBeUEI2gNEHRGyKFAizYQsizBt3k5vJ+8CLFTV+gGTlIoZeSIRhs0XQYiePAryLKkdBwiIqKkktasoNw0Q5kFZSIioljS5vSGcfQNEDRaOJw+9k8mIsWxoJyAgmX74XrtPkgVB8P3yX4PPB/9Cf6tq6HrOwHm6b+EaE5TLmQE6QonQNtlEBDwKR2FiIgoqRh0GliMWjhcpwrK8DcoG4qIiCjJhBwlCFUdBQAWlIkoLrDpTgLSZOQBwQACB7+GJrsXAMC3eTlCx3bAMPZm6AZMgiAICqeMHF33C6DrfoHSMYiIiJJSms0AR70PYmZPWOY+f6qwTERERDHh/2YlQtXFMF/3JOpcfhaUiUhxnKGcgAS9GdougxA8vDl82anhwlkwTf8l9AMvV1UxuYns9yCw70vIwYDSUYiIiJJKus3QOENZo4VotEEQNUpHIiIiSiqy3w1Bb0Jdgx+SLIcXzSUiUgoLyglK23MU5AYHGt5eAMlV3Vhkzu2rdKyoCZXth/ezJXAf3Kp0FCIioqSSbjWg1umDLIXg+fjPCBz4n9KRiIiIkors90DQm1HramwDmW4zKpyIiJIdC8oJStttKARzGjTZvZLi0lNNfn8IRhtcuzcoHYWIKK6tXr0aU6dOxeTJk7F06dIW2z/++GPMmDED06ZNw4IFC+D3+xVISYkk3WZAfYMfQQkIHt0GqbpY6UhERETJ5eQMZYezqaDMGcpEpCwWlGNEkmXsOlyNnYeqcaSsHlV1HvgCoXbvT9AZYbnpOZgm/xSC3hTBpPFJELXQ9rgQ7v1bIIeCSschIopL5eXlWLx4Md544w2sXLkSb7/9Ng4cOBDe7na7sWjRIrzyyiv44IMP4PP5sGLFCgUTUyJItxkgA6hvCEDQmyD73UpHIiIiSipNM5SbCsppLCgTkcK4KF8MSLKMf/2nCBt2lLbYpteJsJl0sJr1sJl0sJl1sJr0jf8362A7+XXj/TpYTDqIJ3skJ1sPQ429AIHv1kNuqIGQkqV0HCKiuLNx40aMHj0aaWlpAIApU6ZgzZo1uPfeewEAZrMZ69evh06ng8fjQXV1NVJSUhRMTImgaRaUw+VDjsEcXr+BiIiIYkPM7AoxIw+Oah80ogCbWad0JCJKciwoR5kkyXjlP3vw5c4yTBvTDUN6dYLT7YfTHYDLE4DT7YfLHYDTE4DTHUBZjRsuTwBe/5lnLwsCYDHqThaZ9eidn4oRfbPQNduqysX4TidYMwEAkqsaIgvKREQtVFRUwG63h29nZWVhx44dzR6j0+nw3//+Fw8++CCysrIwfvz4WMekBJN2cuEfh9OHXL2ZM5SJiIhizHzlzwAAjtXfIc1qCE8yIyJSCgvKUSRJMv7+wR5s2l2Gq8cX4KrxBa1+biAYOq3oHIDTc7IIfbL47HL74XD58J//FeODTUeRlWbCiMIsXFio3uKymJaL1NEzETCnKh2FiCguSZLU7N9/WZbPeD6YOHEivvrqK/zhD3/AwoUL8dxzz7XpOJmZ1g5nbWK32yK2LyWpZRxAy7EYzI0F5YAMGKw2SH5fQow3ETK2llrGopZxAOoZi1rGQaRmsiwDsgxBFOFwetk/mYjiAgvKURKSJPz9gz343+5yXDOhB2aM7d6m5+u0GmSkaJCRcu7VW51uP77dV4kteyux5qtifPi/o7CnGcPF5W7ZNsWKy8GQBFEUIvbpqWhJR+Zlc1FZ6YzI/oiI1CYnJwdbtmwJ366srERW1qkrOmpra7Fr167wrOQZM2bggQceaPNxqqtdkCS5w3ntdpsq/k1XyziAM49FlmVoNSKOl9Zj5KAZEGUp7ser9tckEallHIB6xqKGcYiiENEPOYnikeysRMNbD8J4yY/gcInomsWfeSJSHgvKURCSJPzt/T346rtyXDuxB6aN6R61Y9nMekwcmoeJQ/Pg8gQai8tFFVj79TH853/F6JTaWFy+fHR3pBk1USsuB0MSTlQ24Gi5E0dK63GkzInjlS6k2wyYf+MwdEqLzMKB/oqjCFU7oenULSL7IyJSk7Fjx+L5559HTU0NTCYT1q5di9/85jfh7bIsY/78+Vi+fDk6d+6MNWvWYPjw4QompkQgCALSbXrUOL3Q5gxUOg4REVFSCbea0hpQ63RhSM9MZQMREYEF5YgLSRKWrP4OX++pwHUX98SVo2NX+LSadJgwpDMmDOkMlyeArfsqsXlvBT7efAxrvjpZXO6bhRGFWSjIbf/M5WBIQklVA46UOXG0zIkjZfU4VtGAYEgCAJgMWnTPseHS4fn4cmcpnnpjK3558zB0Su14Ubny/RcQ1JphvvLnHd4XEZHaZGdn44EHHsDcuXMRCAQwe/ZsDB48GHfeeSfuu+8+DBo0CL/5zW9w1113QRAE9OrVC48//rjSsSkBpNuMqHX6ECo/gFD5fugHX6l0JCIioqQg+xoLyn7BAF+gLry2ARGRklhQjqBgSMLL7+3Glr2VuP6SXrhiVFfFslhNOlw0pDMuOllcPljmwqdbivHxlmNY83UxMlOMGFFox4jCLPTITTlrcTkkSSipcuNIWX24gFxc7jqteKxBt2wbJl2Qj245NnTPtcGeZgq3uRg9IBvPvrkNT7+xFb+8aTgyU8/dwuN8NCmdEKg41qF9EBGp2YwZMzBjxoxm9y1ZsiT89aRJkzBp0qRYx6IEl24z4FBJHYLHd8P/zQroBk6GIGqUjkVERKR6st8DAKgPNJZvMlJYUCYi5bGgHCHBkISXVu3GN/sqceOlvTB5pHLF5O+zmnSYNLIrhhSko8EbwLb9VdhcVIF1W47jo6+PITPFgAv6NvZcNug1OFJ6+sxjF/zBxuKxUd9YPL7sgjx0y7GhICcF9nTTOXskd89Jwc9vHIpn39qGp9/8Fr+8afh5+0KfizbVDunQ9rMuNEVERESRl241wOH0A/qT53C/BzCyhyMREVHUnWx5URto/CCXM5SJKB6woBwBwZCEv6zcha37qzBnUm9cPqKL0pHOymLUYdygXIwblAu3N4Ct+6uwpagC6789jrWbT838NZwsHl88LA/dc2zolmNDdoa5XQvsFeSm4Oc3DMVzb2/F029sxYM3DWt3UVmbkgkEvI0nVYOlXfsgIiKitkm3GRAMSfCj8U2s7HdDYEGZiIgo6uSgDwDg8IgAGs/JRERKY0G5gwLBxmLytgNVuPnyPrjsgnylI7WauVlxOYgdh6ogS0D33PYXj8+mR+cU/Oz6oXju7W145s2tePCm4e06EWpT7AAAyVUNDQvKREREMdF0znaFtLDitAWCiIiIKKr0AyZB1+9SVG08AoAzlIkoPohKB0hkgWAIL6zYiW0HqvCDyYlVTP4+s1GL0f1zMGZgDnIzLREtJjfpmZeKn10/FLUNfjz95lbUunxt3ocuIxeavAERz0ZERERnl3ayoNzUv7GpnyMRERFFnyCKqHX5YTProNOyjENEyuO/RO0UCIbw/Ls7seNgNeZe0ReXDE/cYnIs9cpPxc+uH4Japw9Pv7EVdW0sKhuyu8M8bT40mfHTo5qIiEjtMk4WlKslK3SDr4BgTlU4ERERUXLwfbMKnk/+ghqnD+mcnUxEcYIF5XbwB0L40/Kd2H2oBvOuLMTFQ/OUjpRQeuen4YHrh8Dh9OHpN7eirsHfpufLUpCX2hIREcVQikUPAUCF3wzj6BuhSeusdCQiIqKkIFUXQ6o5gVqnj/2TiShusKDcRr5ACH9avgPfHa7BvKmFmDCEb6jao0+XNNx/3WBU13vxzJtbUd+GonLDsofh3fBqFNMRERHR6bQaESkWPWrqvQhVHoHkqlY6EhERUVKQ/W4IehMcLhaUiSh+sKDcBr5ACH96Zwf2HHHgtmn9cNFgFpM7om/XdNw/ewiqaj145q2tqHe3rqgsWtIh840sERFRTKXbDKhzeuFesRCBvV8oHYeIiCgpyH43ZL0JTncgvKYBEZHSWFBuJZ8/hP/793YUFTtwx/T+GDcoV+lIqlDYLR3/b/ZgVDg8ePbNrXC2oqgsWDM5M4qIiCjG0m0G1DQEAJ2RraeIKGmtXr0aU6dOxeTJk7F06dIW23fv3o1rr70WV111Fe666y7U19crkJLURPZ7EBAaC8mcoUxE8YIF5Vbw+oNY/O/t2HusFndO748xA3OUjqQq/bpn4L7Zg1Hu8ODZt7bB5Qmc8/GiNQOy2wFZCsUoIREREaXZDHDU+yDoTQALykSUhMrLy7F48WK88cYbWLlyJd5++20cOHCg2WOeeOIJ3HfffXjvvfdQUFCAv//97wqlJdXwe+CFHgALykQUP1hQPg+PL4jFy7bjwPE6/GjGAIwewGJyNAzonoGfXjsIpdVuPPvm1nMWlQVrJiDLkN21sQtIRESU5DJsBrh9QUBnguz3KB2HiCjmNm7ciNGjRyMtLQ1msxlTpkzBmjVrmj1GkiQ0NDQAADweD4xGoxJRSUVMV/4MJfaxAIB0KwvKRBQfWFA+B7c3gMXLtuPgiXrcNXMARvXPVjqSqg0syMRPrx2EkuoGPPfWNjR4z1xUFq2ZEIw2yF5XjBMSERElr7STb2KDGra8IKLkVFFRAbvdHr6dlZWF8vLyZo9ZsGABHnnkEYwfPx4bN27EjTfeGOuYpDIaewEqgjYAQLqNH1AQUXzQKh0gXnn9QTz18iYcLq3Hj2cOwIjCLKUjJYVBPTJx76xB+PO7O/HsW9sw/8ahMBt1zR6jyR8I69znFUpIRESUnJous/VYOsNo5p+QRJR8JEmCIAjh27IsN7vt9Xrx8MMP45///CcGDx6MV155Bb/85S/x8ssvt/oYmZnWiGa2220R3Z9S1DIOoG1jCXlcqN34LnSubBj1GnTNT2v2M6cktbwmahkHoJ6xqGUcgLrG8n18N3AWJyobcKS0Hj+eORAX9LWf/wkUMYN7dsI91wzCC+/uxHNvb8PPbxgGs/HUj2q8nECJiIiSSVNB+Uj+dORyPQkiSkI5OTnYsmVL+HZlZSWysk5NPNq3bx8MBgMGDx4MALjhhhvwf//3f206RnW1C5IkRySv3W5DZaUzIvtSklrGAbR9LCFHCdz/WwVfyjSkWrugqio+rtJVy2uilnEA6hmLWsYBJP5YRFE454ecbHlxFj3zUvHWb6eymKyQob064Z5rBqK43IU/LNsGjy/YbLt79ZPwfbVMoXRERETJp6mg7HD5IMuRKXYQESWSsWPHYtOmTaipqYHH48HatWsxYcKE8PZu3bqhrKwMhw4dAgB88sknGDRokFJxSQ1OtphyeEVkcEE+IoojLCifg1bDb4+ShvW24+6rB+JombNFUVn2uxFynFAwHRERUXIx6rUwGTTIOvoxXP/4EYvKRJR0srOz8cADD2Du3Lm4+uqrMX36dAwePBh33nkndu7cidTUVDz55JO4//77MWPGDCxfvhy/+93vlI5NCaxpzYIqtxBey4CIKB6w5QXFteF97PjxzAH4y8rdWPzv7Xji7nEAAMGSCdlVrXA6IiKi5JJuM8IVABAKNP6n1SsdiYgopmbMmIEZM2Y0u2/JkiXhrydOnIiJEyfGOhaplOz3AAAq3cBQzlAmojjCKbgU9y7om4UfzxyAQyfq8dt/fA1ZliFaMyGxoExERBRT6VY96vwaAKdmTREREVF0yL7Gc21DSB9uPUVEFA9YUKaEMKIwC9de3AM7D1ahwuGBYM0E/O7wJ7ZEREQUfWk2A2q8jYvjsqBMREQUXZqsHmjoNx0NsoEFZSKKKywoU8IYWJAJADhUWg/RmgEAkFw1SkYiIiJKKuk2I6o9J/985Ie6REREUaXp1A2lORMRhIYFZSKKKywoU8Lo3MkMg16DwyX10HYdAstNf4CYlqt0LCIioqSRbjPALTf2TeZVQkRERNEVqjqK0Ik9AMCCMhHFFRaUKWFoRBG98tNwuLQegt4E0ZoBQeSPMBERUaykWw04GuyEiql/gDZ/oNJxiIjazeFwKB2B6Lz8O9agy+EVEAUBKWYuhEtE8YPVOEoovbuk4Wi5C8GQBO9//4FA0edKRyIiIkoa6TYDZIiobQgqHYWIqEOmTZuGn//859iyZYvSUYjOSva74YMOqVY9RFFQOg4RURgLypRQ+nRNRzAk4XilC8ETuxEsLVI6EhERUdJItxmgQQjZ376EwP6NSschImq39evXY+zYsXj66acxY8YMLF26FC6XS+lYRM35PXBLemSw3QURxRkWlCmh9OmaDgA4XFIP0ZoJ2VWtcCIiIqLkYTXrAFGDFOchSLWlSschImo3o9GIa6+9FsuWLcMjjzyCf/zjH7jooovw+OOPsx0GxQ3Z70ZDSIs0FpSJKM6woEwJJSvdBJtZh0Ol9RCsGZBcNUpHIiIiShqiICDdZoRfMED2u5WOQ0TUIZ9//jl++tOf4oEHHsCkSZPw1ltvITc3F/fcc4/S0YgANC6AWx/QIt3KgjIRxRet0gGI2kIQBBTkpuBwqRPi4EwED22GLEsQBH42QkREFAtpNgN8Hj0sfo/SUYiI2u2SSy5BWloabrrpJjzzzDMwGo0AgL59++Ltt99WOB3RSVm9cbhcQm4KC8pEFF+iWoVzuVyYPn06jh8/3mLbnj17MGvWLEyZMgUPP/wwgsHGxV1KSkpw880344orrsDdd9+NhoaGaEakBNQjNwWlVQ0IGtIAKQTZU690JCIioqSRbjXALekg+zhDmYgS13PPPYfXX38d1113HURRRHX1qVZ6n3zyiYLJiE6pH/oDfOEr5AxlIoo7USsob9++HXPmzMGRI0fOuH3+/Pn49a9/jY8++giyLGPZsmUAgMcffxw33XQT1qxZg4EDB+LFF1+MVkRKUAWdUyADOGHoAdOU+yHoTUpHIiIiShrpNgMaQlrInKFMRAmsrKwM11xzDQDgxIkTmDZtGtavX69wKqJTZElCrcMBARLS2UOZiOJM1ArKy5Ytw2OPPYasrKwW206cOAGv14uhQ4cCAGbNmoU1a9YgEAhg8+bNmDJlSrP7iU5XkJsCADhQq4W221AIWp5ciYiIYiXdZsC7DSMgXXCD0lGIiNrtr3/9K1599VUAQEFBAVasWIHnn39e4VREp8gNNejy6SMYqT/IgjIRxZ2o9VB+4oknzrqtoqICdrs9fNtut6O8vBwOhwNWqxVarbbZ/USns5p0yEoz4ciJWvh3FkHM7Apt535KxyIiIkoK6TYDjocyUafLgk3pMERE7SRJEnJycsK3c3NzIUmSgomImmu6Esgr65HGlhdEFGcUWZRPkiQIghC+LcsyBEEI//9037/dGpmZ1g5nbGK3q+etklrGYrfbUFiQge8OVcPvXAnbkEvQachIpWO1i5peE7VQy1jUMg5AXWMhUoN0mwF9tKWQdrwHTLpJ6ThERO2SkZGBt956C7Nnz4YgCFixYgU6deqkdCyiMNnfuFaBrDdDr9MonIaIqDlFCso5OTmorKwM366qqkJWVhYyMjLgdDoRCoWg0WhQWVl5xpYZ51Nd7YIkyR3OabfbUFnp7PB+4oFaxtI0js4ZZny+9QSkjHS4K8sScmxqe03UQC1jUcs4gMQfiygKEf2QkygepFsN6KkrR9qhnZDlGyEIUV3jmYgoKhYtWoSf/exnWLRoEQRBwIABA/Dss88qHYvolJMFZZ3JonAQIqKWFCko5+XlwWAw4JtvvsEFF1yAVatWYcKECdDpdBgxYgQ+/PBDzJgxAytXrsSECROUiEhxrsfJPspuTQpsrurzPJqIiIgiJc1mgFfWQYAMBHwAF8clogTUvXt3vPvuu6irq4NGo4HVyg+AKb40tbwwWvizSUTxJ6YF5TvvvBP33XcfBg0ahGeffRaPPPIIXC4XBgwYgLlz5wIAHnvsMSxYsAB/+ctfkJubiz/84Q+xjEgJomu2FaIgoCZkhtV9Quk4RERR8dxzz+HnP/+50jGImtFqRMi6xiKy7HdDYEGZiBJQTU0N3nvvPTQ0NECWZUiShKNHj+K5555TOhpRIykEr6yD2cb2b0QUf1pVUK6qqsL27dtx2WWX4ZlnnsGuXbvwq1/9CoWFhed97vr168NfL1myJPx1YWEh3nnnnRaPz8vLw2uvvdaaWJTE9DoN8rMsKPUa0MXnhBz0Q9DqlY5FRBRRn332GQvKFJc0RgsQaurvmKl0HCKiNrv//vthNBpx4MABjB07Fhs3bsQFF1ygdCyiMKHXOCxYEcBVAzKUjkJE1EKrmt4tWLAAx44dw6ZNm7BhwwbMnDkTv/3tb6OdjeiceuSmYHNtJnQXXANIIaXjEBFFXH5+Pm677Tb8+c9/xiuvvBL+j0hpBnPj5bdNl+MSESWakpISvPzyy5gwYQJuueUWvPnmmzh06JDSsYjCal0+yGhcDJeIKN60qqBcW1uLefPm4fPPP8f06dMxa9YseDx8A0HKKshNwT5PBhzdJ/FyWyJSpbS0NGRnZ+PEiRPYt29f+D8ipckp2VgXGA7RnK50FCKidunUqROAxl7K+/btQ3Z2NoLBoMKpiE4JfLMCP7Z9zIIyEcWlVrW8CAQCCAQC2LBhA37/+9/D4/HA7XZHOxvRORV0ToEICRVF25A9sBfE1GylIxERRdSTTz4JADhx4gSCwSC6deumcCKiRsY0O1Y4B2KaKQNsOEVEiSgzMxN/+9vfMHToUDz//POwWq3wer1KxyIKk+rKkCE2wGhlQZmI4k+rZihfdtllGDNmDNLT0zFw4EBcd911mD59erSzEZ1T50wLjDoRBbuXILB/o9JxiIgi7ujRo5g2bRquvvpqzJo1C5MmTcLBgweVjkWEdKsOfbSlqCvjwrhElJgWLVoEvV6PESNGYODAgfjTn/6EX/ziF0rHIgqTvG54ZD3SOEOZiOJQq2Yo33fffbj++uuRnd04A/TZZ59t1YJ8RNEkigK65KShocECnatG6ThERBG3aNEi3HHHHbjmmmsAAMuXL8fjjz+OV199VeFklOzSLTr8JOVj1B/QAV26Kh2HiKjNnnrqKTz99NMAgPnz52P+/PkKJyJqTva74YceFmOryjZERDHVqhnKVVVV2L17NwRBwDPPPIMnn3wSRUVF0c5GdF4FnVNQHTRBclYpHYWIKOKqq6vDxWQAuPbaa+FwOBRMRNQoLc2KgCzC73YpHYWIqF327NkDWZaVjkF0VmLQi6DGCEEQlI5CRNRCqz7qWrBgAcaPH49NmzZhw4YNmDdvHn7729/i9ddfj3Y+onPqkZuCml0W5NezoExE6hMKhVBbW4u0tDQAQE0Nr8ag+JBhM8Ah6xHwNCgdhYioXbKysjBt2jQMGTIEFoslfP8jjzyiYCqiU7QhL6Dj4vNEFJ9aVVCura3FvHnz8NRTT2H69OmYNWsWli5dGu1sROdVkJuCLyQLBPcJyLLMT2+JSFVuueUW3HDDDbjyyishCAI+/PBD3HrrrUrHIoLJoEUp9JB8XKSZiBLTsGHDMGzYMKVjEJ3VP0MzkJ+VhlFKByEiOoNWFZQDgQACgQA2bNiA3//+9/B4PHC7+QaClJeRYkClNgcnDEGkhPyAlgsWEJF6zJo1C926dcOGDRsgSRIee+wxjB07VulYRACAgGgA/B6lYxARtcu9996rdASis5JlGYdcRvRMtSsdhYjojFpVUL7sssswZswY9OvXDwMHDsT06dMxffr0aGcjOi9BEODOHoqljj54gsVkIlKZ2bNnY9WqVRg9erTSUYhaqNTlIygBXKaZiBLRjBkzznj/6tWrY5yEqCVnXR1mGTYiVbgYQC+F0xARtdSqgvJ9992H66+/Hjk5OQCAZ599FoWFfPtA8aEg14aigyVocLpgsVmVjkNEFDEmkwllZWXh8y9RPCmyX46iYgcuVjoIEVE7PProo+GvA4EAPvjgA3Tp0kXBRESn1FfXYJxxP0rF4UpHISI6o1YVlCVJwurVq/H5558jGAxi3Lhx6NWrF7TaVj2dKKp6dhLxVPpbqP7WC8vEq5WOQ0QUMR6PB5dddhlycnJgNpvD93P2FMWDdKseHmcDJEmGKHINAyJKLCNHjmx2e+zYsbjxxhtx9913K5SI6BRnXR1SAZhsKUpHISI6o1ZVhJ977jkUFRXh1ltvhSRJePvtt/H000/joYceinY+ovPq0iUXflkDV3W50lGIiCJq/vz50Ov1SscgOqPBdZ9iYtpXqHdPRJqVbaeIKLE5HA5UVFQoHYMIAOB2OgEAVhaUiShOtaqgvGHDBixfvhw6nQ4AcPHFF+Oqq65iQZnigs2sxxHYEKyvVjoKEVFEPfPMM1i1apXSMYjOSGeywCAEUVXnZkGZiBLO93sol5SU4IYbblAoDVFzHtfJgnKqTeEkRERn1qqCsizL4WIyAOj1+ma3iZQWMKRC63UoHYOIKKLYQ5nimcHS+Ca3rrYOyEtXOA0RUduc3kNZEARkZGSgZ8+eCiYiOsXvdgEANEauEURE8UlszYMKCwvxu9/9DsXFxTh27BiefPJJ9OnTJ9rZiFpNtGUiBS44nD6loxARRUxTD+XLLrsMM2bMCP9HFA/MtsaCsquuTuEkRERt17VrV3z44YcYOXIkMjMz8dxzz6GqqkrpWEQAgEMBO9ZrJ0AwseUFEcWnVs1Qfuyxx/Db3/4WN954I2RZxrhx4zBnzpxoZyNqNXOnzvBU7Ef5iVpcUJitdBwiooh4+OGHlY5AdFYmmw0+nOrzSESUSBYsWIBLL70UAJCXl4eRI0fiV7/6FZYsWaJwMiLgqNsCb8aFELRcS4OI4lOrCspWqxW///3vm903fPhwfPvtt1EJRdRWncZdg3u+ysSUMhcLykSU8EpKStC5c+cWK9ADwOeff65AIqKWRIMFflmLBpdb6ShERG3mcDgwd+5cAIDBYMC8efOwcuVKZUMRnWRrOIZ+mQYAg5SOQkR0Rq1qeXEmsixHMgdRh+i0GuRnWXG4tF7pKEREHfaTn/wk/PVPf/rTZtsWL14c6zhEZ6TtXIi/mn+MA3670lGIiNosFAqhvLw8fLuqqorvcSku+PwhDBf3YHDtx0pHISI6q1bNUD4TQRAimYOoQ6QGB+4KvY73KodAkodC5M8nESWw09/QHjt27KzbiJSWbjXgeGWD0jGIiNps3rx5uPrqq3HRRRdBEARs3LgRDz74oNKxiOBw+WAS/IDOpHQUIqKzandBmSieCAYLLKE62KR6lFW70bmTRelIRETtdvqHtt//AJcf6FK8kANezKh/Ax95ekKWR/Fnk4gSyuzZszFw4ED873//g0ajwR133IHevXsrHYsIDqcPRiEAQW9WOgoR0Vmds6A8bNiwM745kGUZXq83aqGI2krQ6iEZbEj3NuBwaT0LykSU0DgLmRKCRo80XylS5Cx4fCGYjZynQESJo7y8HG+99RYWLlyIQ4cO4dlnn8Xjjz8Ou51tfEhZDqcXaYIfGmMnpaMQEZ3VOf/yf//992OVg6jDtLZMdGpwY09pPcYNylU6DhFRu0mShLq6OsiyjFAoFP4aaOz5SBQPBFFESGOASfTD4fKxoExECeWXv/wlLr30UgBAXl4eRo4ciYceeghLlixROBklO4fTh1zBD73ZqnQUIqKzOudf/nl5ebHKQdRhojUTdv1hfFjChfmIKLHt27cPo0ePDheRR40aFd7GtgIUV3QmGAU/HE4v8nh1EBElEIfDgblz5wIADAYD5s2bh5UrVyobighArdOPvVJX5OUVKh2FiOisOJWEVEOwZiBF3oljFU4EgiHotBqlIxERtUtRUZHSEYhaRdCbYBICcDh9SkchImqTUCiE8vJyZGdnAwCqqqrYcoriQo3TiyLDRFzRb9T5H0xEpBAWlEk1DMNnYk/qeIRWH0RxhQs9O6cqHYmIiEjVNEYLTIILJSwoE1GCmTdvHq6++mpcdNFFAIBNmzbhwQcfVDgVEVDn9KCrxQs56IOgNSgdh4jojESlAxBFimC0oluXxhkGh9n2goiIKOpME2/De6GLOEOZiBLO7Nmz8corr6B///4YNGgQbrjhBrz66qtKxyJCwFWLG52vILBvo9JRiIjOijOUSTUkVzWM/1uKwbbOOFzKgjIREVG0adI7A9bjLCgTUULKzc2F3+/H0qVL4Xa78YMf/EDpSJTkQpKEgKcB0De2lSIiilcsKJN6iBqEjnyL/mlp+LTUqXQaIiIi1Qsc+RaTNV/hYxf7PBJR4jh06BD+9a9/4b333kNeXh68Xi/Wr18Pm82mdDRKcnUuP4xCAAAgGMwKpyEiOju2vCDVEEwpgKhBnsmH8ho3GrwBpSN1iOx3I3BoMzyfvswFQoiIKC5JFQcx0LcVDqdX6ShERK3yox/9CLfccgt0Oh1effVVvP/++7BYLCwmU1xwuHwwCX4AgKBnQZmI4hcLyqQagiBCsGQgU+sGABxJ8FnK/u8+g3fdCwju3wjJcVzpOERERC3pTRAhwev2IhCUlE5DRHRe3333HQYMGIDevXujW7duAABBEBRORdTIUe+D8WRBGWx5QURxjAVlUhXRmglLqLGQfCjB+yiHTuwGDBYAQPDoNmXDEBERnUHT7CmT4Eedi32UiSj+ffbZZ7jmmmvw/vvvY/z48bjvvvvg8/HfL4oPjqZzqTkdwsn3gkRE8YgFZVIVwZoJwV2DnAwzDpckbkFZDvoRKtsLXe9xEO0FLCgTEVFcOr2gXMOF+YgoAWi1WkydOhWvvfYa3n33XWRlZcHn82Hy5Ml48803lY5HSa7W6cPOUE9Yb/4DRHOa0nGIiM6KBWVSFf3gKTBeehcKclNwqLQ+YXsPh8r2AaEgtPkDoO06FFLFIUiexC2QExGROjWtQG8UAqjlDGUiSjC9evXCI488gs8//xy33347li1bpnQkSnIOpw9pVj3bsBBR3GNBmVRFk9kV2ty+6NE5BfUNfjgSdLZU8PhuQNRAk1sIbbehAGSEircrHYuIiKgZMSMfwoU3olayJOw5l4jIZDLhhhtuwIoVK5SOQknO4fRhqmELGlY8rnQUIqJzYkGZVEVqcMD3zSr0sjWuNn8oQdteCKIG2q5DIegMEDO7wjTjV9D2HqN0LCIiomZEayYsQ6fAo7GyoExERNRBDpcPGVoPZF+D0lGIiM5Jq3QAokiS/W74v1mB7Il2aEQBh0vrMaIwS+lYbWYYOTv8tSAI0Ob2VTANERHRmcmhIILF29DT5mFBmYiIqANkWYbD6YPFEgi3lCIiilecoUyqIloyAACCpwZds604XJp4M5Qldy3kYPM35ZKrGu41ixE88Z1CqYiIiM5ACsL78Z8xxHD81Mr0RERE1GYN3iACQQlGIRBe9JaIKF6xoEyqIuhNgMEC2VWDgtwUHC5zQpISa2E+39fL0fDmg80WFBSMNoRO7EHwyDcKJiMiIvoerQEQRKToQnDUs6BMRETUXrUnr/TRyz4WlIko7rGgTKojWjMguapRkJsCnz+E0urE6T8lyzJCJ3ZDk9O72cq+glYPTV5/BI9ua1ZoVhupwQHfV8vYM4yoA1avXo2pU6di8uTJWLp0aYvt69atw8yZM3HVVVfhnnvuQV1dnQIpSS0EQQD0Jli1QdS6fJBUfI4iIiKKppqTBWWd5AXY8oKI4hwLyqQ6giUTsqsGPTqnAAAOJVDbC6muFHJDDTR5A1ps03YbCtlVDclxQoFksRHYvQ7+7R8CGp3SUYgSUnl5ORYvXow33ngDK1euxNtvv40DBw6Et7tcLixcuBAvv/wy3nvvPfTt2xfPP/+8golJDQS9GRZNACFJhssdUDoOERFRQqo92ToqNOUhGEZdr3AaIqJzY0GZVEfXdzx0Ay5DdoYZJoMGh0udSkdqtdDx3QAAbf4ZCspdhwAAgke3xTJSTAWP74Impw8ErR6hysMI7PtS6UhECWXjxo0YPXo00tLSYDabMWXKFKxZsya8PRAI4LHHHkN2djYAoG/fvigtLVUqLqmEoDfDCD8AcGE+IiKidqqp90IAkNqpE0RTitJxiIjOiQVlUh1dwQjo+10MURDQPScFh0sSZ4Zy8PhuCDY7xJSsFttESzrETt0RKlHnwnySpx5S1VFo8gcCAPy7Pob3syXwblwKWQoqnI4oMVRUVMBut4dvZ2Vloby8PHw7PT0dl19+OQDA6/Xi5ZdfxqRJk2Kek9RF23UwBHsPACwoExERtVety4dMCxD49K8InpxoREQUr7RKByCKNNnrQqhsP8ScXujROQVrviqGPxCCXqdROtp5iSYbNOkXnnW76fKfQDCnxzBR7ISO7wIAaLsMBgAYJ94On9GGwM6PIFUXwzjpJ/yknug8JElq1n9dluVmt5s4nU785Cc/QWFhIa655po2Hycz09qhnKez220R25eS1DIOoB1jmToPpjoPsGktAu15fpTES45IUMtY1DIOQD1jUcs4iNTA4fQj1yojeOhraE9OsiEiilcsKJPqSLWl8Kz9P5iu/BkKcnMRkmQUV7jQKy9V6WjnZZx4+zm3izb7ObcnsuCxnRCMNoidugIABFED45g50HTqBu/nr8D97kKYJv8UGnuBwkmJ4ldOTg62bNkSvl1ZWYmsrOZXPFRUVOD222/H6NGj8dBDD7XrONXVLkhSxxdfs9ttqKxMnLZEZ6OWcQDtG4sc8CHodUEQgGOldXHxvUj21yQeqWUcgHrGooZxiKIQ0Q85iZTkcHrR2wIgAMBgVjoOEdE5RbXlxblWmt+zZw9mzpwZ/u+iiy7C9OnTAQArVqzA+PHjw9sWL14czZikMoI1AwAguWpQkNs4ozUR2l5I9RWQg+e/VNi74V/wfPpyDBLFln7g5TCM/wEEofk/S7reY2Ge+TAgCJCcVQqlI0oMY8eOxaZNm1BTUwOPx4O1a9diwoQJ4e2hUAg//vGPceWVV+Lhhx8+4+xlorbybX4H3nceQZrVwJYXRERE7eRw+pBpkgA0rk9ARBTPojZDuWml+XfffRd6vR433ngjRo0ahV69egEA+vXrh1WrVgEAPB4PrrvuOixcuBAAsGvXLixYsCBcYCZqC8GcBggiZFc10m0GpNsMOFwa/wVlz6cvQ4DQWDw9JxnBI99CDgUgaHQxyRYLmqwe0GT1OPO2Tt1huf5JCFo9ACBw8CtoCy6AIPIiC6LTZWdn44EHHsDcuXMRCAQwe/ZsDB48GHfeeSfuu+8+lJWV4bvvvkMoFMJHH30EABg4cCCeeOIJhZNTIhP0ZiDgRZpFz4IyERFRO/gDITR4g0g3hACwoExE8S9q1ZjTV5oHEF5p/t57723x2JdeegkXXnghRowYAQDYuXMnjhw5gpdeegl9+/bFo48+itTU+G9XQPFBEDUQLOmQXDUAgILcFByK84Ky7HdDqjgE/dBp532stutQBPZ8hlDpXtX01goc/Bqypw66AZPOOmOyqZgcKj8A7yd/gSa3L/sqE53BjBkzMGPGjGb3LVmyBAAwaNAgFBUVKRGLVEzQmwDIyLIKKHawoExERNRWDlfj+TNF31RQNikZh4jovKLW8uJ8K803cTqdWLZsWbNCs91uxz333IP33nsPubm5WLRoUbRikkqJ1kzIrmoAQEGuDRUOD1yegMKpzi5YsgeQJWjyBpz3sZq8/oBGj+DRrTFIFhuB3esQ2PtFqy6/12T3gvGSHyFUcQjudxciVHk4BgmJiOhsmmZR2c0yal0sKBMREbVV7ckrfDQ5fWC85EcQLGnKBiIiOo+ozVBu7Urz7733HiZNmoTMzMzwfS+88EL46zvuuAOXX355m47N1efPTC1jac04HIUjIPncyLTbMKxfDpb/9xAc7iAKumbEIGHrNY2l6pv98OmMyBk4tFVtLKQeg+E/vgOdOlnjogdqR362JG8DnBUHkTZ6JjJaux/7FPh69Eb5O0/D897v0GnqXbANvqTdGZrtOol+TxKFmsZCpEonZ1FlmCR4fCF4fEGYDGxJRERE1FpNLaNSsztDl9lb4TREROcXtb/2W7PSPACsW7cOd911V/i20+nE8uXLMW/ePACNhWiNRtOmY3P1+ZbUMpZWj6PPZABAZaUTaUYtBABbi8rQJTN+Lh06fSyuA1sh5vRBVY0XgPe8zw3lDETw8E5UHDkK0Zp53sdHU0d/tgKHvwGkEHwZfdq2H40dhpm/hnfdi6je8C48WUM63FM66X5PEkCij4Wrz1MyEIxWCOY0pJoa/16rdflYUCYiImqDcEHZdQSBagd0fcYrnIiI6Nyi1vLifCvNA43F4t27d2PYsGHh+8xmM/72t79h+/btAIDXX3+9zTOUiWRJguSqhhwKwGzUIifTjMMl8dlHWQ76ocnoAm3BBa1+jq73WFjnPq94MTkSQsd3AjojNNm92vxc0WiDaeovYJr+IASNDpKrGpK7LgopiYjobLSd+8F6yx9hyu0JAFyYj4iIqI0cTh+Meg3Eo1/D99W/lY5DRHReUSson77S/NVXX43p06eHV5rfuXMnAKCmpgY6nQ4GgyH8PI1Ggz/+8Y9YuHAhrrzySuzevRvz58+PVkxSqdDxHWh44+eQqosBAD1yU3C4tB6y3PGZ65EmaPUwXX4v9IUT2/QcQauHLIWimCz6ZFlG8NhOaDv3g6Bp32w2QdRANKdBlmV4178E94rHEao4FOGkRER0Pum2xr/nWFAmIiJqG4fLh3SbAbLfDcFgVjoOEdF5RfV6xHOtNA8AmZmZ+PLLL1s8b8SIEVixYkU0o5HKCSdn7kquamiyeqKgcwq+3FWG6novOqXGT9sLAAhVH4OYmg1Bq2/T8wIHv4J3wz9hueEpiKaUKKWLPuMlP2p3Mfl0giDAMPZmeNb+Ce7Vv4Nx/K3Q9b0oAgmJiOhcZF8DGlYugm3QVAAsKBMREbWVw9lUUPaE1yYgIopnUZuhTKQk0dK4+J7sqgYAFOQ2FlwPl8ZXL1ZZluB5/yl4v3i1zc8VU7IBvwehYzuikCw2BEGANrcvNFk9I7I/TaduMM9aCE1OH3j/+3d4v3wNshSMyL6JiOgstHrIdeXQeOtgMWrhcLGgTERE1BbhgrLPDUHPGcpEFP9YUCZ10psBnRGSqwYA0CXLCq1GiLs+ylJVMWSfC9q8/m1+rtipGwRzGoJHt0U+WIz4tqxA4MCmiO5TNNpguvLn0A2+AoHdnyB4aHNE909ERM0JGh2g0UH2u5FmM8BRz4IyERFRa0mSjDqXv7F1lJ8FZSJKDFyCm1RJEASI1szwDGWtRkTXbBsOlcZXQTl4YhcAQNOOgrIgCNB2HYrAwf9BDgUj0jYiluSgH/7t/4GucAJ0vcZEdN+CqIFx9I3Qdh8OTXZvAIBv6/vQ5PaBNqdPRI9FRESAoDcBfg/SbQbOUCYiVVu9ejX+8pe/IBgM4tZbb8XNN98c3rZnzx4sWLAgfLumpgapqal4//33lYhKCaKuwQ9JlpFuNUDbcxTEFLvSkYiIziuxKlBEbSBm5AMQwrcLclOwYUcJQpIEjRgfk/NDx3dDzMiHaE5r1/O13YYgUPQZQqVF0OYPjGy4KAuV7QNCfmi7DIraMZqKx7LfjcDOj+Df/A7E7F4wDJkGTbchEIT4+DkgIkp4ejNkvwfpVgOOlbuUTkNEFBXl5eVYvHgx3n33Xej1etx4440YNWoUevXqBQDo168fVq1aBQDweDy47rrrsHDhQgUTUyKoPflBbLrNCEPvaxROQ0TUOqymkGqZLrsbpst+HL7dIzcF/oCE0iq3gqlOkQI+hMr2Q5M3oN370OT1h2CwQnJWRTBZbASP7cT/b+++46Oq0v+Bf+6dOzVtJsmkQgo1oVeJgAgqRSRgQcXuquy67q6ru6tr259rXVf9rq6Ku67bXMWCBQELYm+g0mtCh5BCEtLL9Ht+fwRGQgKkzOTOTD7v18uXzNxynpObzJl55tznQFagS80JeluSwYKoK5+EceLVEM21cKz6K5rfvA+ePd8FvW0iot5AMlgg3M2wxRhR3+SG16dqHRIRUcCtXr0aeXl5sFqtsFgsmDlzJlauXNnuvi+88ALGjx+PcePG9XCUFG6OLWZri9bDd+QghKtJ44iIiE6PCWXqNbLTWhbmC5WyF6qjEUrGSCiZo7p8DkkxIuqav8KQOzVgcfUUX/E26FIHQ9Ibe6Q9STHCMOw8RF3+Z5jOuRnQ6eA7chAAILyulhWVqdcSbgfc2z6Ga/27WodCFJbM038B07SftiwoBKCu0a11SEREAVdRUQG7/cdyBElJSSgvL2+zX0NDA5YsWYJf/vKXPRkehaljCWWrwYPmd+4P+BozRETBwJIXFLG8BzfC8cU/ETXvPsjWVCTZzLAYFewvq8eUkWlahwclNgHmGb/q9nkkWQfh8wKqF5LeFIDIgk9trIJaUwLjoMk93rYk66AfkAel/wTA5wEAeHZ8BteG5VDGzYLa7+wulyCh8KM2VMK97RN4Cr8CPA7o0nIhhMpyKESdJEcnAABsMS2J5JpGFxLiwmNMIiLqKFVVIUk/ltQTQrR6fMzy5ctx3nnnISEhodNtJCREdyvGE9ntMQE9n1YipR9A2764fAKKTkLfRCNKAMQmxCMmDPobKdckUvoBRE5fIqUfQGT15URMKFPk0psBVxPUxmrI1lTIkoTs1BjsLw2NGcrO4kIInR2SYujWeYS7GY2v/haGURfAOGpOgKILLskSB/OcuyDHJWsXgyQBR3/2urQhUCr2oXbNMuD7FdAPnAzDyFmQ41I0i6+r3Ns+weGKAmB4PnT2LK3DCVlCCDg/ewHefd8DkKD0Gw/D8BnQJfXXOjSisOTZvRq+8j2wHq39eGy2FRFRJElJScG6dev8jysrK5GUlNRmv08++QQ/+9nPutRGVVUjVFV0Ocbj2e0xqKxsCMi5tBQp/QDa70tJeQPiooyoKa8EADS6ZDhDvL+Rck0ipR9A5PQlUvoBhH9fZFk65ZecnIJFEevYbCnRWOV/LjstFsWVTXB5fFqFBQBQm+tQ+tK9cG9d1e1zSQYL5Ngk+A5uDkBkPUOSFShpOZCjbFqHAgDQJWbCfN4v0PfmZ6AfNBme3d+g6Y274asp0Tq0TvMWb0XznvVoXvoAHF+8CLWpRuuQWvGW7YRz9WIItefrqwqfF54930H4vJAkCZI5BoaRsxF1xZMwn/tzJpOJusFXVQTPzm8QH9syK5kJZSKKRBMnTsSaNWtQXV0Nh8OBVatWYcqUKa32EUJg+/btGD16tEZRUripaXC2lIw6VoLPYNY2ICKiDuAMZYpYUpQNgAT1+IRyaixUIVBU3oCBfayaxeYr2Q4AUPp0fUG+4ykZo+DeuByqswGyKbRvqRCqD87PXoA+dyqU9CFah9OKPj4VprOuh2HsRfDuXwvZ2lIaxfnd61DSh0DXZ3i7tzWGEsus2xEfBZR9tgTuravg3bcWxgmXwzD0XE3j8h7eBfe6pfCVFkC29YEkt3yf2bz8UUjRCdCl5UBJy4UUYw/4z1h1NsCz43N4dnwG0VwL0/RfQp89DqaJVwW0HaLeTDJYAJ8bFgOg6GTUMqFMRBEoOTkZt99+O6699lp4PB7Mnz8fI0aMwMKFC3Hrrbdi+PDhqK6uhl6vh9HYM+uEUPiraXQjIykawt2yeLxksGgcERHR6TGhTBFL0imQLHFQG6v9z2WntizMt7+0XtOEsrdkO2RzNOSEzICcT8kcBfeGZfAVbYE8aFJAzhksauV+ePf9ACU7dFe8li1xMAw9D0BLMtK793t4tqyEHN8XhpHnQ+mf50+IhhK19jCkuGToLLEwTrgM+typcH2/BJKp5TYV4XYAemOP1gf2le+Ba91S+Eq2QzLHwnjmFdDnTmuJx+eBZLHCV7Id3j1r4AL8yWXTlBu7/TNWaw/DveVDeHavBnwe6PoMg+HsG6DrMywAPSOi40nHZlN5nLDFGFDd4NQ2ICKiIMnPz0d+fn6r51588UX/vxMSEvDtt9/2dFgUpoQQqG1wYWT/BEg6b8vEC1Ng62gTEQUDE8oU0aToeIimHxPK1mgj4mON2FemXR1lIQR8JTtgyRoesKSknJgJyWKFt2gT9CGeUPYe2gpIUsjNTj4Z2RSDqAVPwLtnDdybP4Tz83/A0HAExjFztQ6tFeFsRNNb98EwOh+YdTUAQI5Ngnn6j6uLO795CWpdOYxnXgElZVBw4zm6SI1n7/dQq4pgzFsA/ZBpkJQfZ+tIOj3M590CIQTU2jL4SgvgKy2AaKz2/22ULv4jvAYrlLQc6NJyIUfHn6ZdFXA7IBmj4Ks+BM/u1dAPnAT9sOnQxacHtc9EvZl/NpWrGbYYE2coExERdYDD5YXL44M12gglcyCUzFFah0RE1CFMKFNEs8z6TZsaVNmpsdivYUJZrS2DaKqBOXskAvVxW5JkKNnjIJyhX/DdW7wVclL/sPrmXdIp0A8+C8qgSXB8+Bd4dnwGw6gLIMk6rUPz8+z9HlC9p3wTqvQdAVfZm3AsfxRKv/EwnnEZ5Fh7QOPwVeyDa/27UPqOgGHYeTCOvRDG8fMh6U9+26ckSdDZ0qCzpQHHleYQXjdkowXeAxvg3fV1y76xyVDScmCcfF2rL2SExwXPrm/g3vYxdAkZMJ93C5SsMYi66i8hXwaGKBIcSygLtwO2GCP2ldZpHBEREVHoO7bmQHwsS6QQUXhhQpkiWntJy36psVi/sxINzW7EWAw9H5Tqg5I1piWh7AncaU2Trg7cyYJEOBuhVuyHYew8rUPpEkmSYRg1B2rdYUAEZvXtQPHs+hZyfF/oEk9eRkU/cCKUrLFwb1kJ9+b34T2wEYaR58M4/pJut++rPADX+qXwFW0GjFFQMlsWopGMUV0+p6QYkDL/TlRU1EGtOgRfWSF8pYVQa8t+rMH8wZOQjFEtM9/dzZDt2VCyx7YcL+sgMZlM1CPkxEyYpi6EFB0PW7QXNQ1u/50KRERE1L6axpaEsjXaCOea1+A9sAHRVzyhcVRERKfHhDJFNG/xdrg3vw/zubf4k8v+OsplDRjRP6HHY9Il9IV5xq3QW2OAysDOKBaqD6KxCnJsUkDPGyjeku0ABJS+w7UOpcuUtBwgLUfrMFrx1ZRCrdwHY96C0+4r6Y0wjp0Hfc4UuNa+BeFr+VZDqL6W7Z2cdS3cDjg//we8BzcCxigYxl8Cw9DzfqynGgCSJEOXmNmSLB8+88e2vW5AkuErLYCSPgSG4TMhJw9gAotIA3J0vL+Gvy2mDl6fikaHR5svbomIiMJETX1LQtkWY4RwNgJC1TgiIqKOYUKZIprwOuEr2QG18Qh0RxPKmSkxkADsL6vv8YSyUL3wle2CLnlAUM7v/Ozv8FUeQNSCx0MyqaZkjYV5zu8hJ2ZrHUq3qI1VcG96H4aRsyHHJGodDry7vgEkGcqAMzt8jBxlg3nqQoijM609Oz6Dp+BLGM9cAKUDi9apDZWQY+yA3gTh88Aw7mIYhk0PaCL5dCTFAMv5v+mx9ojo5ITXDe+e7yAn9YMtpuW23ZoGFxPKREREp3D8DGWvu7lH30sTEXVHYFYEIwpRcnRLwlhtrPI/ZzYqSEuM0qSOsq98LxzvP95ye34Q6NKGQDRUQq0pDcr5u0vSKVDScgO2GKFmhArPjs/h2fm11pEAAGRbGvTDpkO2xHX62GNfPMgxdgivC44PnkTzh3+B7yS/Q77qQ3B8/ByaXrsTvsoDkCQJ5vN/C+OYuXwDTNSb+TxwfvVv+Iq3w3pcQpmIiIhOrrbBhRiLHnpFhnA7flzklogoxIV5Vofo1KSjCWXRWN3q+ezUWOwrrffPzuwpvuJtgCS1lE0IgmMLsnmLNgXl/N3hqy6G46O/wlcbmsnuzpBj7ND1HQbPzq/8pSK0pB80GaYzr+jWOZTMUYi67FEYJ1wO3+HdaH7rPji/fbmlrAQAX3UJHJ8sQvNbf4C3eDsMY+b6F/QLxdnwRNTD9C1fKAl3M+KPJZQbmVAmIiI6leoGF2zRLeOmcDe3WVCeiChUMaFMEU0yRgM6Q6sZygCQnRaLRocHR+qcPRqPt2Q7ZHu/bi1UdipylA1yQiZ8BzcF5fzd4S3aAu/BjZD0kfEmSZ8zFaKpBr5DWzSNw7PnO/hqSgJyLkmnh2Hk+Yha8Gfoc6dCrS4GdHp49n6P5rfug/fQVhhG5yP6iidgHHdR0H6PiSj8SLIM6M0Q7mbERhkgoWXWFREREZ1cbYPLXyqKM5SJKJywhjJFNEmSIEXHQ5yQUO7nX5ivHnZrzyQ4hasJauV+GEbnB7UdJXMU3BuXQ3U2QDbFBLWtzvAVb4Uc3xdylE3rUAJCyRwJyRwHd8EXUDJHaxKDcDvg/PLf0A+eDN3kawN2XtkcC9PkayFUHyRJgpI+FIbRc2AYPtO/uCUR0YkkgxnC7YCikxEbZUA1E8pERESnVNPoQr+0ls+mUZc+AoTA3Y9ERB3BGcoU8cxn3wjjuItbPZduj4Kik7GvtOfqKHtLCwAhoEsfGtR2lKzRLW04G4PaTmcIjxO+w7ug68Bib+FCkhXoc6bAV7y9ZUVmDXj2/QD43NAPmhSU80uyruX/pmgYx1/CZDIRnZJktADuZgAtq9VzhjIREdHJebwqGpo9/rUHJMXANUmIKGxwhjJFPF3KwDbPKToZmSnRPbown2SMhtJvPHTJ/YPaji4xC5bZvwtqG53lKy0EVB+UvsO1DiWg9MOmQz/kHM0Srd5d30KOS4Fs76dJ+0REx1P6neH/IGyLMaKi1qFxRERERKGr9uhaA7YYY8vi2KuehWHIuVCytLn7kYioMzhDmSKer2IvnN+9DuHztno+OzUWBw83wKeqPRKHkpYD83m/gCQH/3scoarwHt7Vps9a8ZZsBxRDu8n9cCabYyFH2SBUFUL0zO/RMWp9BXyHd0EZNImL4hFRSDCOmQvDsOkAAGuMETX1nKFMRER0MjUNxyWUXc3wFW+D6qjTOCoioo5hQpkinlpTCs+WlRBNNa2e75caC7dXRXFFU/BjcNTDW7IDwucJelsA4Du0GY7lj8JXtrNH2jsd44TLYJl3HySdXutQAs5XW4qm137X44vzeXZ9C0CCfuDEHm2XiOhkVGcD1NoyAEB8jBHNLi9cHtaCJCIiao8/oRxthDhaMoolL4goXDChTBFPik4AAKgnLMw3qK8VAFBYVHPiIQHnPbABjvcfh1pfGfS2AECXNgTQKfAWbeqR9k5H0umhS8jQOoygkGOTANULT8GXPdqufvBkmKbeCPno7zcRkdbc65aiedkjAABrdEs9SNZRJiIiat+PM5RNgOtYQtmiZUhERB3GhDJFPDk6HgAgTkgox8eakBxvQcHB4CeUfcXbIEXZIFtTg94WAEh6I3RpQ+A9uAlCiB5p82Q8O7+G46O/QngiM6kgyQr0g6fAW7QJalPwf5eOkWPs0A+a3GPtERGdjmSwQLgdEELAdnSBoWomlImIiNpV2+iCUa+D2aiDcLesO8AZykQULphQpognRbUklE+coQwAQzJt2HmoFl5f8OrfClWFt7QAuvShPVrrVskcBdFQCbW2tMfabI9n/3r4qosBxaBpHMGkz5kCCAHPzq96pD3XuqVwb/2oR9oiIuowgxkQPsDr9ieUOUOZiIiofdUNLlhjjJAkyV/yApyhTERhgglliniSYoBkjoVorG6zLTfTBpfbh/1l9UFrXz1yAHA1QekzNGhttEfJGAUA8B7c3KPtHk/4vPCVFkDpOzyiF46TY5OgSx8KT+FXEEFe5FF4XHBv/Qi+quKgtkNE1FnHbtMV7mZ/QrmmkQllIiKi9tQ2uBB/dLzUpeXAPOs2lrMjorDBhDL1CoaxF0HpN67N8zmZNkgACg4Er1SBt2Q7AECX3rMJZTk6HvrcaZBj7T3a7vF85bsBrwtKn+GaxdBT9LlTIUfFQziD9+UEAHgPrAc8TugHTQpqO0REnXXsNl3hbobJoMBs1KGmngllIiKi9tQ0uPxrDsgWK5SMUZD0Ro2jIiLqGEXrAIh6gmHItHafjzbrkZEcgx0HazB3cnZQ2pZt6dAPmw7ZHBuU85+K6azrerzN4/kObQUkHXRpOZrG0ROU7HHQ9xsf9HY8u76FFJMIXeqgoLdFRNQZkiUOsjUNEC13athiTJyhTERE1A5VCNQ2uvx39HiLt0GtKYVh+AyNIyMi6hjOUKZeQa0rh2fPd+0uUJebZcPekjq43L6gtK3PGgPTxKuCcu7TEULAV74HviMHNWnfW1YIXcrAXrG4hCRJLT/vin1QHcGZpaw2VsFXsgP6gZMgSXz5JqLQoqTlIuqyR6GL7wsAsEUb/CvYExER0Y8amj3wqT8uYus9sAHujSs0joqIqOOYkaBewXtwI5yf/R04ttjBcYZk2uBTBXYX1wa8XbW2DN7SAgg1OMnq0xNwrHoW7k3va9K6Zc5dME1bqEnbWhCNR9D87oPwFHwRlPN7D20FIFjugojCQlK8BaVVTfAFubY8ERFRuDm2aO2xhLJwNXNBPiIKK0woU68gHV3cQG2sarNtYB8rdLKEHQcDX0fZXfAFHB/+H6BRQlmSZCiZI+E9tBXC5+359hVDr1pYQo6xQ5c+BJ7CLyFE4BMohtypiLr8McixSQE/NxFRd6mOejS+fCvchV8CAAb3tcLl9uHA4QaNIyMiIgot1Q1OAMcllN3NveKuTiKKHEwoU69wLKkpGqvbbDMadOifHheUhfl8JduhSxkESTEE/NwdpWSMBjwO+A7v6tF2nV//F86v/9ujbYYCfc5UiMYq+Iq3B/S8Qm35QkCOSwnoeYmIAkVSjBCOeghnEwAgJ8MGACgMwhe2RERE4ezEGcpwO5hQJqKwwoQy9QpSdDyA9mcoAy1lL4rKG9Do8ASsTbW5Fmp1MXTpQwN2zq7QpQ8BdAq8Bzf1WJtCVeHdtw7CG7ifZ7hQssZAMsUEvOyFa/WraF7+aLt1wImIQoJiACSdv7xUbJQB6YlRKCyq1TYuIiKiEFPT6IIsSYi1tEw8apmhzJIXRBQ+mFCmXkEyxwKyDuIkCeXcLBsEAjuLyleyAwCg9NE2oSzpjdClDYG3aFOPJSPVIwcgXI1Q+g7vkfZCiaRToAyaDO/BTVCbawNyTuHzwLP3e0hR8ZAkKSDnJCIKNEmSIBnMEMetVzA4w4rdxbXw+lhHmYiI6Jiaehfiog2Q5Zb39vqcKVD6jdc4KiKijmNCmXoFSZKhH3QWZFtau9uzU2NhNOhQEMCEsrd4GyRTDOSEjICds6sMQ86BYcg5QBDq+rbHW7wVgASdxsl0rRhyp8J4xvyAlTrxHtwEuJq4GB8RhT6DGcLt8D/MybDB7VFxoIx1lImIiI6paXQh/li5CwCG4TOhH5CnYURERJ2jaB0AUU8xTbn+pNsUnYzBfa0BXZhPSR8KXXxfSJL239somaN6tD3voa2Q7VmQTTE92m6okOOSYRh5fsDO59n1DSSLVfPyKUREpyMZLW1mKANAQVENBvSJ0ygqIiKi0FLT4EJaYhSAlnKBvsM7IVtTIVus2gZGRNRB2me6iHqI8Lig1paddHtupg3l1c2orncGpD39oEkBTSp2l6+6GO4A1/Vtj/C6oVYX98pyF8cTbgdcP7wFb2lht86jNtfBd2gr9AMnQpL5kk1Eoc0y+w6Yz7vF/zjGYkAfezQX5iMiIjpOTYMLtuhjC/I1w/Hen+Hd+722QRERdQKzE9RruDe9h6Y374FQfe1uz81sWY0+EGUvfId3w1taGFILqHn3/QDXNy9BOBuD2o6kGBB9zTMwDJ8Z1HZCnk6Bp+ALeLZ/0q3TiIZKSNEJUAZNDlBgRETBI5miISnGVs/lZFixt6QOHm/o1VFWGyrhK9+jdRhERNSLOFxeON0+2GJbxstjpaK4KB8RhRMmlKnXkKITACEgTrJQWp+kaESb9dhxoPsJZdfGFXB+/d+QWkBNyRgFCAHvoS1BbUcIAUkxQDJGBbWdUCfp9FAGT4b3wEaozXVdPo8ueQCiFjwO3UnqfxMRhRL3js/h+PzFVs/lZNrg9qrYX1avUVStqY56OL97A0L1wvHJ83B89ncIr1vrsIiIqJeobXQBgH+Gsr9UlMGsVUhERJ3GhDL1GnJ0PABAbaxqf7skITfThoKD1d2aWSx8HvjKCqGEWL1b2Z4FyRwHT+FXQfvgLIRA89t/gHvzh0E5f7gx5JwNCB88u77p0vFqUw3UxqqQ+mKCiOhU1NpSeA+sb/Xc4AwrJCAkyl74qovR/O6D8Gz/BOqRIhgnXA7RcATuTe9rHRoREfUS1Q1HE8oxrRPKnKFMROGECWXqNaToBACAaKw+6T65WTbUNrpxuLr5pPucjq98D+B1Q9cntBLKkiTDMDofvrJCNK94DGpT4D/Yq7WlUKuL+e36UbI1FbrUwfAUfgkhOn+rt3vLSjS98Xv/bXBERKFOMlgAjxNC/fE1L8qkR9/kaBQWaZtQ9h7chOZlDwM+Lyz5d0OX1A9KWg6UAXlwb34fal25pvEREVHvUNsmocySF0QUfphQpl5Djjr1DGUAGHK0jnJ3yl74ircDkgwlLafL5wgWw7DzYJr+KwhnA9CFBOfp+A5tBYBevyDf8fQ5Z0PUV0A9crBTxwnVC++eNVD6joTEBD0RhQn/h2FP6y/CcjJs2FNSD4+3/XUMgkkIAffmD+H46K+Q41Jgueh+6JL6+bcbJ1wOyAqcqxeH1NoHREQUmWqOJpStR0teSHoTdCmDIJljtAyLiKhTmFCmXkMymCHH94Ukn/zX3m41IyHW1K2F+bwl2yEn9QvZb5j12WMRdfmfIEcnQLgd8Oz7IWDn9h7aCtmaBvnobHAClOxxiLr8Mejs2Z06zndoG4SjHnouxkdEYUQytox9/nqQR+Vk2OD1qdhbokEdZSHgLdkOpd84WObeDTnK1mqzHGWDcexF8JXsgKg73PPxERFRr1LT4EKUSYFBrwMAKOlDYJl7Dz9DEVFYUYJ58hUrVuBvf/sbvF4vrrvuOlx11VWttj/33HN4++23ERsbCwC47LLLcNVVV6G0tBR33HEHqqqqkJ2djSeffBJRUb17gS8KjKj5D51yuyRJyM2yYcPOSqiqgCx3vnatfuAkSKborobYIyS55U/fvfUjuNe/C9+w3TDmLYAk67p8TuF1wXd4J/RDzg1UmBFBUgyQ4lJaZr2pPki6jr3senZ9A8kUA10GZ3sTURg5ekfFiaV6BvW1QpKAwqIa5GTa2jsy4FRHPURzLXQJGTDP+BWg00OS2v9SWT/sXChZoyHHJvVIbERE1HvVNLhgizH5HwvVB0gy100horAStBnK5eXleOqpp/Dqq6/i3XffxRtvvIE9e/a02mfbtm34y1/+gmXLlmHZsmX+hPMDDzyAK6+8EitXrsSwYcPw/PPPBytM6oVOdzvrkEwbml1eHCxv6NL5DcPOg35AXpeO7WmG0fnQD5sBz7aP4fjgSQhnY5fPpVaXAACUPsMCFV7EEG4Hmt+8F55tqzq2v7MR3oOboAzI8yf/iYjCgS55AMwzft1mlpXFpCAzOabHFuZzlR9A89IH4Fj1LITqhaQYT5pMBlq+aJVjkyB8XnjLdvZIjERE1DvVNLr89ZMBwPXDm2j87y0aRkRE1HlBSyivXr0aeXl5sFqtsFgsmDlzJlauXNlqn23btuGFF15Afn4+HnzwQbhcLng8HqxduxYzZ84EAFx88cVtjiPqKte6pWh65bZT7pN7dOZUV8peeA9sbFmUL0xIsg6miVfCdPaN8B3ejaalD8BXdahL59Il9UP0dYugS88NcJThTzKYIZmi4S74skP1OYXqg37oudAPntID0RERBY5ssULJGg3J2PbOspwMG/aV1cPlCW4dZe/BjSj9372A6oP5vFs69cWca+3bcLz/BFSWviAioiBpmaFs+PEJVzMkvfHkBxARhaCgJZQrKipgt9v9j5OSklBe/uPq2U1NTcjNzcUdd9yBpUuXor6+Hs8//zxqamoQHR0NRWl582+321sdR9QtihHCUdfmVtzjxUUbkZ4YhYID1Z0+vXPNq3Bver87EWpCP/gsWObeDfg88BR+2aVzCFVtmQHGGbXt0udOhagvh6+s8LT7ypY4mM68ArqEvj0QGRFR4Ai3A+4tK+GrKmqzLSfTCq9PYG9JXXDaFgKuTR/A8dEzMCSktyy+18n69YYRMwEdF+gjIqLg8HhVNDS5W5e8cDeH7Po7REQnE7TMj6qqrWoACSFaPY6KisKLL77of3zDDTfgnnvuwZVXXtmmdlBnawklJASufq3dHjkrrUZKX7rTj8a0NFQAsBpcMNhPXidxTG4yPvruIKw2C/RKx+oKN+38Hg0NlYibeCHiOhhjSF0T+yh4M5+EzhwNSaeHu7II+sQ+p7xF+Bir3oGSf/0O9rm3ImrguB4INniCdU1U61QUrXkV8r5vYB95xkn381SXoXnvRsSMmArZ2PU3liH1u9VNkdQXokgnfB64vnsdxolXQ5eQ0WrbwD5WyJKEwqIaDMmKD3jb6pGDcP/wJpR+45E6/zZU1bo7fQ7ZYoVx3EVwrXkN3oMboM8aG/A4iYio96qpd0IArUpeCLfDvwYBEVG4CFpCOSUlBevWrfM/rqysRFLSjwm80tJSrF69GvPnzwfQknBWFAXx8fFoaGiAz+eDTqdrc1xHVFU1QlW7P6vEbo9BZWXX6uiGmkjpS3f74VVbbsGtOlQEBdaT7peVFAW3x4fvNpV0aPEgta4cTcuehWzPhqvPGR2KMTSviQI4nFAbS9C05B4o6UNgmvZTSKd4g2O3x6Bi83dQnU1oQAyaQ65PHRfsa6IbcCaadnyO8qISyObYdvdx/fAh3Js/hDNpBGRL124LD83fra4J977IshTQLzmJQt2xGVbC3dxmm9moICs1BoUHawPapnA3A3ozdPYsmOfeDV3yQMh6I4DOJ5QBQD/0PHh2fg3X6leh9BkGSeFtyEREFBhVdU4AgDX6+IRyc8gv6k5EdKKglbyYOHEi1qxZg+rqajgcDqxatQpTpvxYD9RkMuGJJ57AoUOHIITA4sWLMX36dOj1eowbNw4ffPABAODdd99tdRxRd8jRLTOi1MZTl7MY3NcGSQJ2dKCOsvC64fjkOUCWW2o16vQBiVVLUlQ8jGfMh7doM5qXPQy1vuKU+/uKt0GKToAcl9pDEYYnfc5UyHEpEE3t//4JVYVn92ro+g6HbInr4eiIiLpP0imAztBuQhkABmdYsb+sHi53YOoo+6qK0PTWH+DZ9jEAQEkZ1Ok7204kyToYJ10D0VgFz+41gQiTiIgIAFBV31J6Mf64GcrweSDpOUOZiMJL0BLKycnJuP3223HttdfiwgsvxJw5czBixAgsXLgQW7duRXx8PB588EH8/Oc/x6xZsyCEwE9+8hMAwP33348lS5Zg9uzZWLduHW677bZghUm9jGSxApIM0XTqRLHFpCA7NRYFB09fR1mtK4doroN52s8gx9hPu384kCQJhmHTYZ79O6jNtWha+gC8xdva3Vf4vPCWbIfSZ3i3P8RHOl18OizzH4IuMavd7b7SHRBNNdAPnNSzgRERBZBkMAMnSSjnZtjgUwV2l9R2ux3PgQ1oXvYIIFToUgZ1+3zHU1IHwzLvPuhzzg7oeYmIqHc7Unt0hvJxCeWo+Q/DdM7NWoVERNQlQV09Kz8/H/n5+a2eO75u8syZMzFz5sw2x6Wnp+Pll18OZmjUS0myDtHXPQd04Bvg3EwbPvyuCA6XF2bjyf9UdAl9EbXgiYhcmVdJH4Koi+6HY9UzcKx6FlFXPgnZ1LqerbNkF+BxQtd3mEZRhhdJkuCrLYUECbK19Yxuz65vAYMFSuYobYIjIgoAyWA+6eK3A/rEQSdLKDxYi2HZCV06vxAC7s3vw/3D25DtWTDPuBVy1OnLU3WWLnkAgJZZ0HJ8X35pSkRE3VZV54BekRFlav35UpKDNtePiCgo+KpFvY5ksHToQ+GQTBtUIbDzUG27231HDsDx6d8h3I6ITCYfI8cmwTLvPphn3QbZFAOh+iC8P9al9FSXAooRSvoQDaMMH8LnRfO7D8O1YVnr590OePevh77/GZAUg0bRERF1nz73bCgZI9vdZjK03AFUWHT6klIn417/Ltw/vAWl/xmw5N8dlGTyMd6iLWh++//Be2BD0NogIqLeo7rOCVuM0f95VPg8aHr3QXj2fKdxZEREnRPUGcpEoci9dRV8ZYUwz7j1lPsN6BMHvSKj4EANRg1IbLVNuJrg+Pg5QFUhVC8ifc6SpDdBScsFALi+ex2+8j3+GWGxo86DM2VMRNSO7gmSToF+4ER4Cr6AmNj44wIceiPMs3970sX6iIjChWHE+afcPjjD2qE7gE5GP3gyJL0R+hHnB33WsK7PUMjxfeBac3SBvgj+ApmIiILvSJ0DtuMX5HM1Q63YB+Fq0jAqIqLO4wxl6nWEow7eos0QQj3lfnpFhwHpcW3qKAuhwvH5PyCaamA+75Y2JSAinS4tB2ptGZrf+SO8ZTshVB+TyZ2kzz0bUL0tJS6OkiQZSurgNmUwiIjCjdpwBL7K/SfdnnP0DqDdxXWdOq9728dQm2shx9hhGDm7R0pQHL9An3vjiqC3R0REka3q6Axlv6MloiQDF+UjovDChDL1OlJ0AqD6IBz1p913SJYNxZVNqG/6scSDe9P78BVthjHvCn99xd5EnzUWlnl/APRGOFb8Cfv/dBnU+kqtwworuvi+kJMHwFP4BYQQUOsr0Pz+4/BVH9I6NCKibnNvXAHHyqdPun1A+tE6yp0oe+E9tAWu1YtbfRHXU5TUwVAGToR7y4dQaw/3ePtERBQZhBBtEsri6CK2ktGiVVhERF3ChDL1OnJ0PABANFaddt/czJZ9Cw62fOj1Hd4N97p3oPTPg37oucELMsTp4tMRdeH/gy4tF/qEdEgxXVtYqTcz5JwNtbYMvsO74Nn1LXwlBZAMfCNJRBHAYPF/QG6PUa9D/7RYFB7sWEJZ+DxwfrsYUlwKDMNnBCrKTjFOuAzQGeBa/64m7RMRUfhrcHjg9amwtpNQBj8HEFGYYUKZeh0pqiX5qXYgoZyVEgOzUfGXvZDtWTCMuRCmKdf3+tXeJVM0LHN+jz4/exqSxJeSzlL6nwHDmHmQY5Pg2b0auvRcyNFMzBNR+JMMZsDngfB5TrrP4AwbDpY3oNnpPe353Js/hKgvh2nS1ZqVWJItVphn3QbTWddq0j4REYW/2gYXALSuocySF0QUppgFol6nMzOUZVlCToYVhQeqoNYdhqTTwzh2HiS9Kdhhhg0mk7tGUowwjrsIan0FREMl9AMnaR0SEVFAHLvb4tiH5PbkZNogBLCruPaU51IbjsC98T0o2eOg9BkWyDA7TUkdDMlggeqoh/C4NI2FiIjCT82xhHLsjwllJS0X5rn3QI5N0iosIqIuYSaIeh+DBeY5v4fSwQRebqYNkzzfovHt+6E2Vp/+AKIOEqoKx4o/AQCU7HEaR0NEFBj+OpCnKHsxID0Wik4+bdkLX2kBIOtgPPOKQIbYZaqjHk1v3MUF+oiIqNNq2pmhLJmioaQMgqQYT3YYEVFIUrQOgKinSZIEJS23w/sPV/bDYipARcKZiD06u5koECRZhpI1BnJcCiQ930QSUWSQomyQk/oD4uT76BUdBqTHnnZhPv3gs6BkjYFkjApwlF0jm2OhZI6Ge8uH0A+aDNmaonVIREQUJmoaXJAlIC7a4H/OW7QJvor9MI67SMPIiIg6jzOUqVfy7PkOrg3LT7ufr7YUlo2vokhNwqcirwcio97GPOPWlsWeiIgihJKWi6gL/3DaZGtOhg2HyhvR5Gxba1l43fDs/BpCVUMmmXzMsQX6nKtfgRCnyJoTEREdp6bRBWuMCTr5xzSM99A2uLet0jAqIqKuYUKZeiVfaSE82z4+5T7C44Lz40WQdHpsSLkYO4rq+cGRiIiog043Zg7OsEIA2FVU22abe8uHcH75L/gq9gQnuG6QLXEwjr8YvuJt8O5fp3U4REQUJmoaXEiIa70Wj3A3+9ceICIKJ0woU68kRcdDOBsgvO6T7uOr3A+14QhM59yMrH4ZqG/2oKSyqQejJCIiCj9qYxUa/nkTPDu/OuV+/dLioFdkFJxQ9kJtqGxZiK/feCgpg4IZapfph5wDOb4vXN+9DqH6tA6HiIjCQG2DC4lWc+sn3Q4mlIkoLLGGMvVKcnQCAEA0VkM6yS25SloOoq58ErIpBkNinACAHQdr0CcpusfiJCIiCjeS3gSoXsDtOOV+ekXGgPQ4FB6sbfW8a/WrgCTDmBcaC/G1R5J1MJ19IyC1/JuIiOh0ahpcGD24vRnK5pMcQUQUujhDmXol6WhCWW2sarPNV7EPzu9eh1C9kE0xAICEOBOSbGbsOFDdo3ESERGFHYMZgAThbj7trjmZNhRXNqLR0VJH2Vu0Cd6DG2EYMw9yiC+Eq7NnQZeYBaGqEM5GrcMhIqIQ5nL70OzyIr6dkhfgDGUiCkOcoUy90rEPqeKEhLLqbIDjk0UAAOPofMD445/IkEwb1uwoh9enQtHxuxgiIqL2SJIM6E0Qp5mhDAA5GVYAwM6iGowdnATP7u8gW1NhGD4jyFEGhhACjpV/AYSAefbvIEmS1iEREQWc16fi5Y92oqhCmy/P9IoMj1fVpO1A8fla4j+x5IVh2IyjX8QSEYUXJpSpV5Ki4mHMuwJyUn//c0JV4fzsBYjmOljm3dtmVfkhWfH4YlMpDpQ1YECfuJ4OmYioQ1asWIG//e1v8Hq9uO6663DVVVe1u9+dd96JvLw8XHzxxT0cIfUGksHcoRnK2amxMOhlFB6sxdjBSTCd81OI5jpIuvB4iypJEpSMUXCtfgXe/eug7zde65CIiALujc/24OstZRiaZYNOg4k1BoMCt9vb4+0GWkq8BSMGJEI9ri/6wWdpGBERUdeFx7t1ogCTdAoMI2a2es69cTl8xdtgPOt66OzZbY7JybRBArDjYDUTykQUksrLy/HUU0/hnXfegcFgwIIFCzBhwgQMGDCg1T73338/1qxZg7y8PA2jpUgmGS2A23na/RSdjIF9rCg9WARfpR46ezakKFsPRBg4+iHT4Nn5FVxrXoPSd3hLDWkiogjxzZYyfLq+GDPG98WCcwdqEoPdHoPKygZN2g60hDizvy9CCHgPboQuvg/k2CSNIyMi6hzet0+9lu/wbngPbAQAeIu3w71+GZSBk6DPObvd/aPNevRNjkbBgZp2txMRaW316tXIy8uD1WqFxWLBzJkzsXLlylb7rFixAueeey7OP/98jaKk3sBy0f0wTf9lh/bNybBioutLNK34c4fKZIQaSdbBNOkaiKZquDcs1zocIqKA2V9Wj/99tBO5mTZcOq3/6Q+gzvE44Vz1DLz712sdCRFRp3GGMvVa7m2r4KsqQnTWaOgSM6Efdh6MZ8w/Zf3DIZnx+GT9Ibg8Phj1XNWdiEJLRUUF7Ha7/3FSUhK2bNnSap+bbroJALB+PT+8UPBIOn2H9x1hLIXVcAgVfWcjNkzrSOpSBkIZdBbcWz6CPmcK5LgUrUNql/fQ1jaJC/3wGdDZ0loWRDywqc0xuowR0GeNgVpXDvfmD9tsl+OSoB8+C5LMeSpEkaSuyY3n3tmKuCgDbp43FDr+jQec/0vUMB37iKh3Y0KZei0pOgFi/zqozXWQLXEwTWy/zujxcrNsWPlDEXYX12JYdkIPRElE1HGqqrb6UkwIEZRFwhISogN2Lrs9JmDn0lKk9AMITF9qv1sGV+luJF/8u1Pup3rdcOxZhlI1DhsNo5EXwJ9jT18T3+yfoGnXUMT06wdJDuyXzoHoi7euEoc+eQ6QZMh6o//5uPHnwGyPQd3+OtQe2tTmuJjUdFjtMXC6y1B+wnah+mDIHgF7UmyHXmv4dxJ6IqUfFFhen4q/vbsNTQ4P7r56LGIsBq1DikjHEsqSwaJxJEREnceEMvVacnQCIASaFv8G0dc+02YRvvYM6mOFTpZQcKCGCWUiCjkpKSlYt26d/3FlZSWSkgJfk6+qqhGqKrp9nkipiRgp/QAC1xdnWQk8+7ac9lyuDcvgrS3HuphLsGVXVcB+jtpcExnokwdXVTOExwXpuKRtdwSqL77KMkgxSTDP/DXkmET/840AGisbgOyzYcluW/bLA7S0b0iF5aqn22wXqoojRxrhLS2EHGU96exs/p2EnkjohyxLAf2Sk1q88eke7DpUi5/OHYLMFH7pECzHFq+VjEwoE1H44X0r1GtJUfEAAKX/+A4lkwHAaNChf1osdhxkHWUiCj0TJ07EmjVrUF1dDYfDgVWrVmHKlClah0W9kGQwA24HhDj5Fw/C64Znx+dQ+p2B2AEjUFbVjLpGVw9GGRzuLSvR9OY9EJ7TL0rYk3T2bFguebBVMjkQJFmGUH1wfvVvNL37ELwlOwJ6fiLqWV9vKcWnG4ox84y+yBsSmuV7IsaxhDJLXhBRGGJCmXotJWMkTNN/CdPUhZ06LjcrHkWHG9Do8AQpMiKirklOTsbtt9+Oa6+9FhdeeCHmzJmDESNGYOHChdi6davW4VFvYrAAQgW87pPuIikGWOY/BOPEq5CTYQMAFBbV9lCAwaNL6g/RWBUyC/QJnwfOr1+CWl8RlBI4QMvChJbZv4NsiYPjgyfh3vFZUNohouDaV1qPl48uwjd/KhfhCzbJGAVdxkhI5jitQyEi6jSWvKBeS9Ip0GeP6/RxuZk2LPtmP3YW1WDs4MDfSk5E1B35+fnIz89v9dyLL77YZr/HHnusp0KiXujY7bvC3dxu6QdfVRHk6ATIppZbqTNMKsxGHQqLajBhSHKPxhpoxy/QpwyaDJ0tTdN43FtWwlPwOZSsMZBjg/e+RY5NgmXeH+D49G9wffM/qNUlME68MuD1pIkoOOoaXVi0dCus0Ub8/MJhXISvB+iSB8Ay63atwyAi6hKOEkSd1C8tFka9jmUviIiITuLY7bvH6kMeT3jdcKx6Fo5Vz/qf08kyBvWxojBCxlbjhEsBvRGu1a+csuxHsKkNR+DesAJK1lgofYcHvT3JYIZ55m3Qj5gFT+EXUKsPBb1NIuo+r0/F80cX4fvlxcMRbdZrHVKvIDzOlv80HCeIiLqKCWWiTlJ0Mgb1taLgQGR86CUiIgo0XVouzHPughzdtl6ve/MHEA2VMIyZ2+r5nEwbymscqGkI/zrKsjkWxvEXw1eyA979azWLw7XmNQCAceKVPdamJMsw5S1A1KWPQJeYBSFUqI1VPdY+EXXea5/uxu7iOvxkdi4ykrkIX09xb1iOxpd+GbRyREREwcSEMlEX5GbacLi6OSI+9BIREQWabI6FkpbTptyFWl8B96b3oPSfACV9SKttP9ZRjowvbPW558AwZi50qTmatO89tAXeA+thGDMXcnRCj7cvx7Us5uXe+B6a3voDmvdv7vEYiOj0vt5cis83lGDWGRlhX3Io3Ai3gwvyEVHYYkKZqAuGZLV86N1xoFrjSIiIiEKPcDXBtW4pfEcOtHreuXoxICsw5i1oc0zfpGhYjErElL2QZBnGcRdDNsdCqL4eb19tOAI5vi8MI2b2eNvH0w84E3JUPA6/9jDc2z/VNBYiam1vaR1eXrUTQ7JsuGRqP63D6XWEuxk4uuYAEVG4YUKZqAv6JEUj2qxHQYR86CUiIgok4fPAvWEZfBX7/M/5jhyEr2gzjGPmQY6ytTlGliUMzrBGzAzlY3yHd6Pp9Tvhqynt0XYNQ86B5eI/QtJpWwtVjrXDMu9eWPqPhuvbl+H85n8QqlfTmIjo6CJ877QswnfzPC7Cp4WWGcpMKBNReOKoQdQFsiQhJ9OGgoM1XESBiIjoBD8uyufwP6dLzIRl3n3QD59+0uNyMmyorHWiqs4Z9Bh7ihSXDOF2wPXtyz3ynkFtOALXpvcgfB5Isi7o7XWEZDAj+dLfQz/ifHh2fAbXD29pHRJRr+b1qVj07jY0O71chE9Dwt3MkhdEFLaYUCbqoiGZNtQ0uHC4uu0K9kRERL2azgDIOsDdMkb6qoshhIAueQAkWTnpYYMzrAAip44ycHSBvjPmw1daAO++H4LenmvNa3BvWA7hqA96W50hyTqY8i6H6ZybYRg5GwAghKpxVES902uf7MYeLsKnOUmSIZlitQ6DiKhLmFAm6qLco3WUWfaCiIioNUmSIBksEG4H1PoKNC/9I9wbl5/2uGMlpSIpoQwA+pypkBMz4VrzWqtZ24HmLdJ2Ib6O0A/Ig2yOhepsQPPSB+At3qZ1SES9ylebS/H5xhLMmsBF+LRmmXsPzOferHUYRERdwoQyURclWc1IiDWi4EBkfeglIiIKCIMZwt3sX4hPP3jKaQ+RJQmD+1pReLA2+PH1IEmWYZp0DURzLVwbTp9Y7wrhdcO5+hXIcSkwDJ8VlDYCyusGVB8cH/4F7u2faB0NUYetWLECs2fPxowZM7B48eI22/ft24drrrkGc+fOxY033oi6ujoNomzf3pI6vLJqJ4Zm2TD/7P5ah0NERGGMCWWiLpIkCbmZ8SgsqoGqso4yERHR8QwjZgGyvmUhvrHtL8TXnpxMG6rqnThSG7yZvFrQJQ+AYdzFUDJGBuX87i0rIeorYJx0NSTdycuKhAo5OgGWufdC13cEXN++wsX6KCyUl5fjqaeewquvvop3330Xb7zxBvbs2ePfLoTAz3/+cyxcuBDLly9Hbm4u/vGPf2gY8Y/qGl1YtLRlEb6fzRsGWZa0DqlXE6oPTUvuhrvwS61DISLqEiaUibohN8uGJqcXRRUNWodCREQUUvSDJsNXVgDZlgb9sJMvxHeiY3WUCyKs7AUAGMfMhZKWAyFEQBfoE0JArdwPpd94KH2GBey8wSYZzDDPuBWGkbPh2fEZHB/8H5PKFNJWr16NvLw8WK1WWCwWzJw5EytXrvRv3759OywWC6ZMabkj4+abb8ZVV12lVbh+/kX4XF786pIRXIQvFLgdUGvLAI9L60iIiLok9KcvEIWw3MyjdZQP1CArhQsqEBERHePZ9Q1EwxGY5vz+lAvxnSg9MQoxFj0KD9birBFpQYxQG8LZCMenz0M/eAr0A/ICck5JkmCacSvgcwfkfD1JkmUYJ1wG2ZYGta68U78rPU1tqoHr25dR7KyD1+vzP2+Zew8kxQDnt6/AV76nzXHGiVdBSRkIz65v4N7WtryHftAkGIZNh6+6GM4v/tlmu2xLh3naQgBA07KHAV/bpHtXYnApOn8/ejKGcFZRUQG73e5/nJSUhC1btvgfFxUVITExEffccw8KCgrQr18//OEPf9Ai1FZePboI383zhqJvUrTW4RDgr6cvGcwaR0JE1DWh+46NKAxYo41IS4zCjoM1OD8vU+twiIiIQoYcnQDjhMuhpOV26jhJkjA4w4bCohoIISBJEXZbtsEC4WqC67vXoWSM7HYywVtaCAgVSvoQQDEGKMiepx802f9vz+7VkMyxITXbWggBx0dPQ609DHPmUPg8vjb7SMYoSJa4ts/LupZ/KMb2tx+9bpKstL/dGOX/t2yOO+Us7s7EoBgU+Nzeno8hjKmq2uo16cTXKK/Xix9++AGvvPIKhg8fjqeffhqPPfYYHnvssQ63kZAQ2ITvhr3V+GJjCS6ZNgAXTBkQ0HP3JLs9RusQAsZuj4HLV4kmAHH2BESFad8i5ZpESj+AyOlLpPQDiKy+nIgJZaJuys204evNpfB4VegVVpEhIiIC0FIruIv1gnMzrFhXWIHKWgeSbJYAR6YtSZZhmnwtmt99CK4Ny2DKW9DlcwmvG86v/g1JkqG79FFIcvi/DxGqCve2j6EeOQDjmVdCP/Q8zb9UEKp69LpdB+j0SMkZgsrKtuXOjOMuOuV59P3GQ99v/Em3y9YUWGbdfspzmGf86pTbOxOD3R7Tph89EUM4S0lJwbp16/yPKysrkZSU5H9st9uRmZmJ4cOHAwDmzJmDW2+9tVNtVFU1Bmx9lqpmD/7+zmYMzY7H+eP7tvt7Gw7a+10NV8f64i0/AgCod0poDsO+Rco1iZR+AJHTl0jpBxD+fZFl6ZRfcob/u04ijQ3JtMHtVbGvNHRWcCYiIgpngzNaSkoVFtVqG0iQ6JL6Q58zBZ6tH8NXXdLl87RaiC8CkslAS8LdMuf3UDJGwbV6MVzfvKRZXWUhVLjWLYXjo6chVBW6pH7QJfTVJBYKDRMnTsSaNWtQXV0Nh8OBVatW+eslA8Do0aNRXV2NwsJCAMBnn32GoUOHahJrbaMLf/rvD7DFGPGzuUO5CF+IEe5mACx5QUThKzLeeRJpaHCGFZIE7DgQeYsHERERaSE1wYK4KAMKD0bu2Go441LAYILr25e7tECf2lAJ98YVYbcQX0dIehNMM34Fw6gL4Cn4omWxPmdjj8YgvC44P/0b3BuWQTLHAELt0fYpNCUnJ+P222/HtddeiwsvvBBz5szBiBEjsHDhQmzduhUmkwmLFi3CfffdhwsuuADff/897rrrLk1i/du729Dk9OJXF3MRvlCkpA+FZf7DkK2Rt1YAEfUOLHlB1E0Wkx5ZKbEoOFiDyL3Bj4iIqOe01FG2oiBS6ygDkE0xMOUtgOqoB4QAOtlH1+pXAUmGMe+KIEWoLUmSYTzjUsjWNLi+ex2qox46U88sJqY21cDx0V+hHjkI44TLoR8xKyJ/B6lr8vPzkZ+f3+q5F1980f/vkSNH4q233urpsFpRVQFFJ+O3V45FHy7CF5IkvQm6+D5ah0FE1GVMKBMFwJAsG1Z+XwSHywuzkX9WRERE3ZWTacMPBRUor3EgJT6y6igfox98VpeOUx318FXuh2HMXMjR8QGOKrToB02Ckj0Wkt4E4XXDV7kfSurgoLWn1legefmjEB4nzDN/DSVzVNDaIgoWWZZwxxWjw75+ZyTzHFgPX8kOGCdezS+siCgsseQFUQDkZtrgUwV2HarVOhQiIqKIkHusjnIEl70AACEEXOvegeuHjs9olM2xiLrsTzAMnxnEyEKHpDcBANyb3oPjvcfg3rqqS2VCOtRWdDx0fYbCMu9eJpOJKGh8Zbvg2fkNk8lEFLaYUCYKgAHpcVB0Mgoi/EMvERFRT0mymWGNNqCwKLLHVkmSIJrr4N78AXzVxafd33NgA9TmWkgGMyRd77oryjByNpTM0XCteRWur/8L4QvMYn1CqHCtXwbfkQOQZAXmqQuhi+fie0QURO5mSMbIvPuGiHoHJpSJAsCg12FgnzguzEdERBQgkiQhJ9OGwqLaoM1GDRWGM+YDBvNpF+hT6yvh/PRvnZrNHEkkvQmm6b+EYdQceAq/hOODJ7q9WJ/wuOD85Hm41y+Fd+8PAYqUiOjUhNsByWDWOgwioi4LakJ5xYoVmD17NmbMmIHFixe32f7JJ59g3rx5mDt3Lm655RbU1dUBAJYuXYrJkydj3rx5mDdvHp566qlghkkUELmZNhRXNqK+ya11KERERBEhJ8OG+iY3yqqatQ4lqGRTDIzj58NXthPevd+ddD/XmqML8Y27uAejCy0ti/XNh2naT+Gr2AvX+ne7fC61sRrNKx6Fd/96GPMuh+GMSwMXKBHRKQi3AzBwhjIRha+g3SdXXl6Op556Cu+88w4MBgMWLFiACRMmYMCAAQCAxsZG/PGPf8Tbb7+N5ORk/PWvf8Wzzz6L++67D9u2bcNdd92FOXPmBCs8ooDLzbIBXwFLv96HBecMhNGg0zokIiKisJaTebSOclEN0hKjNI4muPQ5Z8Oz8yu4vnsDSsaoNjPXvAc3wXtwI4wTLov4hfg6Qj9wImRrGmRrKoDOz/bzVeyD46O/QnhdMM/6NZSMUUGKlIioLeFuhmSK0ToMIqIuC9oM5dWrVyMvLw9WqxUWiwUzZ87EypUr/ds9Hg/uv/9+JCcnAwAGDx6MsrIyAMDWrVuxdOlS5Ofn43e/+51/5jJRKMtOjcW00en4clMp7vvnd9i0+4jWIREREYU1e5wJ8bHGiF+YDwAkWYZp0jXQJfWD8La+20l43XCuXgzZmgb9sBkaRRh6dPYsSHoj1PoKNL1+J9xbP+pweRS14QigGGCZ9wcmk4moxxlGXQDD0HO1DoOIqMuCllCuqKiA3W73P05KSkJ5ebn/sc1mw/Tp0wEATqcT//jHP3DeeecBAOx2O2655RYsX74cqampePDBB4MVJlHAyJKEa2YOxl1XjYHRoOCZt7fguXe2orreqXVoREREYUmSJORktNRRViO8jjIA6JL6wTzjVsiWuFbP+8oKIRqrYJx0da9biK8jJHMcdCmD4FrzGlxf/+eki/UJocJ7cBMAQN//DERd+gh08ek9GCkRUQt99jgoGSO1DoOIqMuC9o5UVVVIkuR/LIRo9fiYhoYG/OIXv0BOTg4uuugiAMCiRYv822+66SZ/4rmjEhKiuxh1W3Z75NyGEil9CfV+2O0xOGNEOt79cg9e/3gX/vCv73HVrFzMmZQNnU5us28kiJR+AJHTl0jpBxBZfSGizsvJsGH1tsMoPdKEPvbAvccLZd7ibfDsWQPT2TcBAJS+IxC14HHIMYkaRxaaJL0Rpum/gHvdUrg3roBaVw7T9F9CPu52cuFxwfn5P+A9sB7mC+6Ekj4EkmLQMGoi6q2EEPDuXg05MYtfahFR2ApaQjklJQXr1q3zP66srERSUlKrfSoqKnDjjTciLy8P99xzD4CWBPPbb7+N66+/HkDLi61O17latFVVjVDV7s9isdtjUFnZ0O3zhIJI6Us49WPqiFQMzbDilVW78M9l27DquwO4blYOslNjAYRXX04lUvoBRE5fIqUfQPj3RZalgH7JSdQb5WRYAQCFB2t6TUJZbTgC765v4U0fiqa6BIjYgUwmn4YkyTCOvwSyLQ3OL/+F5mWPIGr+Q5B0eqiNVXB89AzU6iIY866ALi1X63CJqDfzeeD84kUYxs9nQpmIwlbQSl5MnDgRa9asQXV1NRwOB1atWoUpU6b4t/t8Ptx88804//zzce+99/pnL1ssFvzzn//E5s2bAQCvvPJKp2coE4UKu9WM2y4dgVsuHIa6JjcefmkdXlm1E83O9m/FJCIiotYSrWYkxplQWFSrdSg9Rj94CmR7Npzf/A/lS/4Ez66vtQ4pbOgHnAlL/t0wjroAkk4PX8VeNC99AGp9Ocwzb4NhxMx275okIuopwt0MAJ1aSJSIKNQEbYZycnIybr/9dlx77bXweDyYP38+RowYgYULF+LWW2/F4cOHsWPHDvh8Pnz00UcAgGHDhuGRRx7B008/jT/+8Y9wOp3IysrC448/HqwwiYJOkiSMy0nC0Ox4vPPVPny2vhjrd1XiZxeNwOC0GH6oISIiOo2cDBs27q6EKgTkXjBuHlugr/ndh6BP7AP9wElahxRWdEn9oUvqDwBw7/gcUIywzPk9dDbOBCSiEOB2AAAko0XjQIiIui6oq3rk5+cjPz+/1XMvvvgiAGD48OEoLCxs97hx48Zh6dKlwQyNqMeZjQqumj4IE4el4H8rd+Lxl9dhWL94XD1jMJKs/HaaiIjoZHIyrfhmaxmKKxqRkdw76qrrkvrBPOs2JPYbgFovF+LrCiFU6JL6w5h3eat6ykREWuIMZSKKBEEreUFE7ctOjcUfrhuHhRcOw57iOvzhn9/jvdUH4PWpWodGREQUknIybADQq8peAICSMRJ6W4rWYYQtSZJhGDKNyWQiCini6AxlGKK0DYSIqBuYUCbSgCxLmHtWfzyyMA8j+ifgna/24Y//WYtdh2q1Do2IiCjkxMeakGQ1o/BgjdahEBERdYtkioYyIA9ylFXrUIiIuowJZSIN2WKM+MVFw/Hr+SPgcvvw2OIN+Pf7BWhodmsdGhERUUjJybRi56EaHDzcoHUoREREXaZLzIL5nJshx9i1DoWIqMuYUCYKASMHJOLhmybg/LwMrNl+GPe++D2+2VIGIYTWoREREYWEaaP7QK/o8OBLa/H6p7vhdHu1DomIiKjThLMRalMNP+sRUVhjQpkoRBgNOlw6dQDuv348UuIt+PcHBfjzqxtRXtOsdWgURD5Vhco3k0REp5WZEoNHFk7A2SPTsGrtIdz3z++xcXel1mERERF1invrR2h69Tdah0FE1C1MKBOFmD5J0bjr6jG4/vwclFQ24pH/rcfe0jqtwwpLQgiUHmkK2YTtrkO1+P3f1+D/Xt8Ej9endThERCEvyqTHtbNycM/VY2E2Knj27a147p2tqK53ah0aERFRhwh3M6A3Q5IkrUMhIuoyJpSJQpAsSZgyMg33XTcOZqMOT7y2EVv2HtE6rLAihMAbn+3Bff/8Hk++thFH6hxah+SnqgIrvt2PP7+6AUIABQdr8I8VO6CqoZn4JiIKNQP6xOH+68dj/tT+2LavCvf+83t8vO4QX0eJiCjkCbcDktGidRhERN3ChDJRCEu2WXDPNeOQGh+FZ97aim+2lGkdUljwqSr+/UEBVq09hNEDE7H/cAPu//cPWLPtsOa1yuoaXfi/NzZh6df7cUZuMh6+aQIWnDsQ63dWYvEnuzSPj4goXCg6GbPzMvHgTRMwsE8cXvtkNx763zocOFyvdWhEREQnJVzNkAxmrcMgIuoWResAiOjU4qIMuPPK0Vi0dCv+/UEB6ppcmJ2XyVukTsLj9eHvy7Zj4+4jmDc5G3MnZaGyzol/vrcDL763A5v2HME1Mwcj2qzv8di276/Giyu2w+n24frzc3DWiFRIkoQZ4/uirtGFD78vgjXaiPyJWT0eGxFRuEqymnH7pSOxtrCiJan80jrkn1WNmWP7wGzkW10iIgoxHgckA2coE1F447tsojBgNiq47dKR+Nf7BXj7y32oa3RjwXkDITOp3IrD5cWzb29BYVEtrjxvIM4b1xdAS7LhrivH4MPvD+Ldr/djd3EtbpwzBEOz4nskLp+q4t2v9+ODNQeRmhiFO64YinR7dKt9LpnaH7WNbiz9ah/iogyYMjKtR2IjIooEkiThjNxkDMuOx9tf7sOKr/fh640luGr6IIwZZNc6PCIiIj/JYAFY8oKIwhwTykRhQtHJWJg/BLEWAz5edwh1TW7cNGcI9Aor1wBAfbMbTy3ZjEPljViYPwRnDk1ptV2WJVxwZhaGZSfgHyu24/9e34TzxvXB/LP7w6DXBS2u6non/r58O/YU12HKyFRccd4gGNtpT5Yk/GR2Dhqa3XhpZSFiLQaMGpgYtLiIiCKRxaTHNTMHY/ZZ/fDX1zbiuXe2YvTARFw1fRDiY01ah0dERATzzF9rHQIRUbcxE0UURmRJwoJzB+DSaf2xtrACT7+5GQ6XV+uwNFdd78Rjr2xA6ZEm/OqS4W2SycfLTInB/dePx7lj++CTdcV48KV1OHi4IShxbdxdifv//QMOVTTip3OH4Przc9tNJh+j6GTcctEwZKXE4O/LtmFPSV1Q4iIiinQ5mfH4f9ePw6XT+mP7/mrc++L3WLX2EHyqqnVoRERERERhjwllojAjSRLOn5CJm+bkYtehWvx58QbUNbq0DkszZVVNePSV9ahrcuG3l4/CyAGnn9Vr0Otw1fRB+M3lI9Hk9ODh/63D+2sOwKcGZkE8j1fFq5/swrNvb0VinBl//Ml45A05eZL7eCaDgl9fOhK2GCP++uZmlB5pCkhMRES9jaKTcf6ETDx80wQMzrDi9U934+GX1mN/GRftIyIibQihonHx7XBvXaV1KERE3cKEMlGYmjgsFbfOH4HDNc145OX1KK9u1jqkHnfgcD3+9MoGeL0qfn/lGAzqa+3U8cOyE/DQjRMwepAdb3+5D/c8/w0qax3diqmiphmPvrIen6wrxnlj++Cea8Yi2da5GmmxFgN+c/koKDoZf1myCTUNvfcLAyKi7kq0mvHr+SNwy4XDUNvkwsP/W4dXP97FO3yIiKjHCbcToqkGED6tQyEi6hYmlInC2PB+CbjzijFwun145OXeNeuq8GANHn91I4x6He6+eiwykmO6dJ5osx4/nzcUN83JxYGyetz/7x/wzZYyCNH52crf7yjHH/+zFkdqHfjlxcNx5fRBXa5xbbeacdulI9Hs9OIvSzahyenp0nmIiKjl7p5xOUl45KY8TBudjk/XF+O+f36P9TsrtQ6NiIh6EdV1dBKQgYvyEVF4Y0KZKMz1S4vFPdeMhcmgw+OvbsS2fVVahxR0G3dV4i9LNiM+1tQyAzi+e2/IJEnCxGGpePa305CRHIN/f1CA55duQ0Ozu0PHuzw+/PfDQrywfDv62KPxx5+cgTGD7N2KCWip9/yri4fjcFUznn1rC9wezmQgIuoOi0nB1TMG495rxyHarMeipVvxwXcHtQ6LiIh6CdXZklCWDGaNIyEi6h4mlIkiQEq8BfdcMxZJNjP++tYWrNl2WOuQgubbrWVYtHQbMpKjcddVY2CLMQbs3EnxFtx5xWhcOq0/Nu05gv/3rx+w9TQJ+pIjTXj4pXX4anMpZudl4s4rRyMhzhSwmHKz4rEwfwh2F9fhHyt2QA1QnWciot6sX1os/t/14zBhSDLe+mIvPll3SOuQiIioF1BdLeujSJyhTERhjglloghhjTbi91eOwcA+cXjxvR1Y+X2R1iEF3KofivCv9wuQk2nF7xaMQrRZH/A2ZLll0cM/XNcye+2pJZvx8qqdcJ0wO1gIga83l+Kh/65FfbMbv7lsJOZP7Q9FF/iX1TNyk7HgvIHYsKsSr3y8q0vlOIiIqDWdLOPGC3IxZpAdr36yG19tLtU6JCIiinA/zlBmQpmIwpuidQBEFDgWk4LbLxuFF9/bgSWf70FtowuXnTMAsiRpHVq3CCGw9Ot9eG/1QYwbbMfC/KFdrk3cURnJMfh/14/D21/uw6q1h1BwoAYL84cgOzUWDpcXL6/aie+2lyM304aF+UNgjQ7cTOn2TB/XF7WNLnz4XRGs0QbMnZQd1PaIiHoDRSfjZ3OH4rl3tuKlDwuhV2ScOTRF67CIiChCmfuNQNSVf4Fk7tr6L0REoYIJZaIIo1dk3Dx3KF6zGLBq7SHUN7lxwwW5QZk52xNUVeCVj3fhi40lmDIyDdfOHAxZ7pkEuV7RYcG5AzGifwL+9X4BHn15PaaP74uNuypRUevAhWdlY86ZWT0Wz/yz+6O+0Y13v96PuCgDzh6V3iPtEhFFMr0i4xcXDcPTb27Gv94rgF4nY1xOktZhERFRBJJ0esjR8VqHQUTUbeGZYSKiU5JlCVdOH4iLp/TDdzvK8dc3N8Ph8modVqd5fSr+sWI7vthYgtl5mbhuVs8lk483JCseD954BsYOtmPl90VweXy484rRmDspu0fjkSQJ152fg+H9EvC/j3Zi467KHmubiCiSGfQ63Dp/BPqlxeKF5duxec8RrUMiIqII1FiwBo7PXoBQudg2EYU3JpSJIpQkSZgzMQs/mZ2DgoO1ePy1jahrcmsdVoe53D4889YW/FBQgUun9cf8qf0haVi6I8qkx83zhuGuq8bgwRsnYHCGTZM4FJ2MWy4chqyUWPx9+XbsLq7VJA4iokhjMii47dKR6JMUjUVLt2HHgWqtQyIiogjjKtsD7761kGSd1qEQEXULE8pEEe6sEWn45SXDUXakCX96eT2KyhtCflG3JqcHT76xEdsPVOP683Nw/oRMrUPyG9TXGpTFADvDaNDhtktHID7WhGfe2oKSykZN4yEiihQWk4LfXj4KKfFmPPP2Fuw6VKt1SEREFEFUZzMkIxfkI6Lwx4QyUS8wakAifnfFaDQ5Pfjjf9bitme/wTNvbcF7qw+g4GANnO7QKYdR2+jCY4s34ODhBtxy4TBMGZmmdUghKcZiwG8uGwlFJ+MvSzajut6pdUhERBEh2qzHbxeMRnyMCU+/uRn7y+q1DomIiCKE6moCDGatwyAi6jYuykfUSwxIj8ODN07A5j1HsLe0DntL6rHpaI1ISQL62KPRPy0W/dPj0C8tFinxlh4pMeF0e1FR40BlrQMVNQ58vrEEDc0e3HbpSAzJ4oIVp2K3mnH7ZSPx51c34C9LNuPuq8cgyqTt7GkiokgQF2XAHVeMxmOL1+Mvb2zCHVeMRkZyjNZhERFRmFOdzZAMnKFMROGPCWWiXsQWY8TU0emYOjodANDo8GBfaT32ldZhb0kdvi8oxxebSgEAUSbFn1zunx6HfqmxMBu79pLR6PCgosaBitrmlv/XOFBxNIFcf0Jd58Q4E+64YjT6pcV2r7O9REZyDH558Qg8tWQTnnlrC357+SitQyIiigi2GCPuWDAaf1q8AU++vgm/v2oM0hOjtA6LiIjCmOpqYkKZiCICE8pEvVi0WY8R/RMwon8CAEAVAmVHmrC3tB57S+qwr7QeW/dWQQCQAKQlRqF/eiz6pcWhf3ocUhNa3gwJIVDb6EZlrQPlNc3+2cbH/mt2tS6pYYsxIslqxsj+CUiymZFksyDJaobdaobFxJelzsrNtGFh/lD8/d1teGH5dty/8EytQyIiigiJVjPuvGI0Hlu8AU++vhF3XTUGyTYmAoiIqGviz74CtSxVR0QRgJkbIvKTJQnp9mik26P9tYubnV7sL6v3l8lYv7MSX20uAwCYjQoSrWaUVzfB7VFbnScxzgS7zYwJabFIsppbEsdHk8YGPVc1DrTxOUmoO28gXv1kN/7wwhqkxpsRF21AXJQBcVFGxEUZEBttQLRZD7kHSpkQEUWK5HgLfnfFaPx58QY8+dpG/P6qMUiMY/1Ll8eHHwrKUVPvQt6wFCRZ+TMhIjodc/YINFY2aB0GEVG3MaFMRKdkMSkYmh2Podkt9YyFEDhc3Yx9R2cxOzwqcjOs/oRxks2M+FgTFB3X/Oxp543rC49XxVdbyrDzYDXcXrXNPjpZQmyUAbFRx5LNhqOJZ+Nx/255bDQw8U9EBADpiVH47eWj8MRrG/Hkay3lL2wxRq3D0kR5TTM+31CCb7eWocnZcgfSsm/2Y1i/BJwzJh3D+yVAlvnFJRFRe+rWfQifOQ26pH5ah0JE1C1MKBNRp0iShNSEKKQmRGHS8FTY7TGo5LfsIeP8vExcmz8MFRX1cLp9qG9yo7bRhbomN+qa3KhvcqOuseXftY0uHCxvQH2TG0K0PZfJoENclAF2mxnjBydh7OAkliQhol4rMyUGt18+Ek++vglPvr4Rv79yDGKjDFqH1SNUVWDL3ip8tqEY2/ZXQydLGDPIjnPGpCPJZsGXm0rw5eZS/PWtLUiMM2Ha6HRMHpGKGEvv+PkQEXWEUL2o+uifMIy9iAllIgp7zAwQEUUgSZJgNiowGxUkx5+63qeqCjQ4PKhrdLUknI/91+hGXZMLBw434D8fFuLlVbswamAizhyajOH9EjgLnYh6nf5pcbht/gg8tWQz/u+NTbjjitGINuu1Dito6pvd+HpzKb7YWIqqeies0QZcODkbZ41MazVD+8Kz+mHOxCxs3H0En60vxptf7MXSr/fjjNwkTBuTjn6pXGiXiAjultrJkpG1+Iko/DGhTETUy8my5C9/0R4hBPaXNWDN9sP4oaAc6worEG3WY3xuEs4cmoL+abGQWJeZiHqJwRk2/OqSEfjrW5vx1JJN+N2C0TAbI+cttRACe0vr8fmGYqwtrIDXJ5CTYcXl5wzAqIGJJ/0yUdHJGJ+ThPE5SSipbMRnG0uwetthrN52GJkpMZg3pT9y+8bByHUUiKiXEu5mAIBkYM15Igp/kfPul4iIgkKSJPRLi0W/tFhcfs4A7DhQjTXby/HtljJ8vqEEdqsJZw5NQd7QFKScZjY0EVEkGJodj1suHI5FS7fi6Tc34zeXjQr7uvMujw/f7yjHZxuKUVTeCJNBh7NHpmPqmHSkJ0Z16lzp9mhcM2Mw5p/dH2u2H8ZnG0rwzJJNiDIpmDQ8FdPGpCPZxvGCiHqXYwllGPj6R0ThjwllIiLqMEUnY0T/RIzonwiHy4sNuyqxZvthrPj2AJZ/ewDZqbE4c2gyzshN7jW1RYmodxo1MBE/nTsUf1+2Dc+8vQW3XToCeiX8ksrl1c34fGMJvtlShmaXF+n2KFwzczDyhiR3e+a12ajgnDF9MG10Osob3Hjns934dH0xVq09hGHZ8ThnTB+M6M9F/IiodxBuBwDOUCaiyMCEMhERdYnZ2DLTbNLwVNQ0uPD9jnJ8t/0wXv1kN17/dA+G9YtH3tBkjB5o5y3ORBSRxuckwePNxb/eK8Cipdvwy4uHh0V9eVUV2LznCD7bWILtRxfZGzvYjnPG9MHAPnEBL2MkSRKG909ESqwRNQ0ufLW5FF9uKsEzb29BQqwJU0en4ayRaYjlIn5EFMEkcyxix86CLyZR61CIiLqNCWUiIuo2W4wRsyZkYNaEDBRXNuK77eX4bsdh/GN5FYwGHcYOsuPMYSnIzbBxJhoRRZSJw1Lh9qr438qdeGH5dszOywzo+WscXtTWNgfkXKoQKDhQgy83laCq3gVbjBEXnpWNKSPTYI02nv4EAWCLMWLe5GxccGYmNu0+gs82FOPtL/dh2Tf7MT4nCROHpcJiCu2PKKaonvlZEVFk0dnSkThrISorG7QOhYio20L73RoREYWdPvZozJ8ajYvP7oddRbVYs/0w1u2swOpthxEXbcC4QUmIjdJDr+ig6CToFRl6RYaik/3/1utkKIqMBreKxgaH//Hx22QuBEhEIWLqqHS4PSpe/3Q31u+s1Dqc08rNtGHBuQMxamAidLI2M6oVnYxxOUkYl5OEkiNN+HxDMVZvO4w128s1iaezkqxmZKXGIDs1FtmpschMjgn7OtpEFFxqcy3clbUQIhaSFPp3sxARnQoTykREFBSyJCEn04acTBuunjEIm/dUYc32w/hycwm8PtHt8+tkCYoiw6jXYeLQFMyZmAmLSR+AyImIOm/G+L4Y2CcO9U3ugJ43Ls6MujpHwM6XHG8JuQVU0xOjcPWMwbjk7P7YU1IHVe3+GBEsqhCod/qwbXcl9pTU4YeCCgCAJLX0Iys1Fv2OJpnT7VFhUQKFiHqGp+ALFK9/F9E3/QvgvAgiCnNMKBMRUdDpFZ1/JpoQAj5VwOtT4fG2/Of/t0+F1yvg8frg8amwRBlxpLrp6D7i6P4+/7+9PhVV9U589EMRvtlahnmTs3H2qDR+gCciTWSnxgb8nHZ7TK+5PdpsVDC8X4LWYZyW3R6Ds4enAADqGl3YX9aA/WX12H+4Hpt2H8E3W8oAtMzCzkiOPjqLuWU2c3K8hXfYEPVSwu2AZDBBknk3AxGFPyaUiYioR0mSBEUnQdHJMJ1m/aWOJlKKyhvwxmd7sPjjXfh0fTEundYfowYkBnxhKSIiouPFRRsxaqARowa2LLIlhEBlnRMHyupbksxlDfhmSxk+XV8MADAbdchKiW0pl5ESi35psbDGBLYmswRw/CMKQcLVDNkYpXUYREQBwYQyERGFvYzkGPxuwShs3lOFJZ/vwbNvb0VOhhWXnzMQmSkxWodHRES9hCRJSLKakWQ144zcZACAqgqUVjX5E8z7y+qx6odD8AWptIfZqCArJabVzGhbjJFJZiKtuZshm0Kr5BARUVcxoUxERBFBkiSMGpiIYf3i8eWmUiz7Zj8e/O9aTByegoun9IctwDPAiIiIOkKWJfSxR6OPPRpnjWh5zuP14VBFS5K5yeEJaHu1TW7sL6vHRz8U+ZPWsVEG9EuNbbWQoD2grRLR6QiPAzojE8pEFBmYUCYiooii6GScO7YPzhyajPfWHMQn6w5hbWEFZp2RgVkTMmAycOgjIiJt6RUd+qW1lLwIFo/Xh6KKRhw4VuO5rB6b9xzBsXnRKQkWZCRFI+to6Y3M5BgYDaztShQsUpQNBotZ6zCIiAKCn6qJiCgiWUx6XDZtAKaNTsfbX+7F8m8P4MvNpbj4rH6YNDwVssxbf4mIKHLpFR36p8Whf1qc/zmHy4sDhxtwoKweJdXN2HmgGj8UVAAAJAlIS4xCdkosstNaymX0sUdzoVuiADFPXdirFlolosjGhDIREUU0u9WMm+cNw3nj6vDGp7vxnw8L8fG6Ylx+7gAMzYrXOjwiIqIeYzYqyM20ITfT5k9s1R0tkXHgaI3nTXuO4JutZQBa7vrpmxTdqlxGSoIFMusxExER9WpBTSivWLECf/vb3+D1enHdddfhqquuarW9oKAA9957L5qamjBu3Dg88MADUBQFpaWluOOOO1BVVYXs7Gw8+eSTiIriaqhERNR1A9LjcM81Y7G2sAJvfbEX//f6Jozon4DLpg1AWmLkjDFdHXuJiKh3iosyYNSARIwakAgAEELgSJ3zaJK5AfvK6vHN1jJ8uqEYAGA26pCZ/GMt5uzUWMTHctE/olMRQqDxpVugnHkhMHim1uEQEXVb0D5BlpeX46mnnsI777wDg8GABQsWYMKECRgwYIB/nzvuuAMPP/wwRo0ahXvuuQdLlizBlVdeiQceeABXXnklLrjgAixatAjPP/887rjjjmCFSkREvYQkSTgjNxmjBybik/XFeG/1Afy/f/2As0enYd7kbMRaDFqH2C3dGXuJiIiAlrHSbjXDbjXjjNxkAICqCpRVNWH/cfWYV6099OOifxa9P7mcldpSLiMmzMdUooDyuQG3A5LMEjJEFBmCllBevXo18vLyYLVaAQAzZ87EypUr8ctf/hIAUFJSAqfTiVGjRgEALr74YjzzzDO49NJLsXbtWixatMj//NVXX82EMhERBYxe0eH8CZmYNDwVy7/Zjy82luK77Ycx58wsnDeuD/RKeC5K1NWxlwllIiI6FVmWkG6PRro9GpNHpAIAPF4VxZWN2Fd6tFzG4QZs2VvlX/QvMc503CzmGGSmxHBhXOq1hNsBAJCNFo0jISIKjKCN6BUVFbDb7f7HSUlJ2LJly0m32+12lJeXo6amBtHR0f7bb489T0REFGixFgOunjEY547tgzc/34s3v9iLzzaU4JcXD0dmSozW4XVaV8deIiKiztIrsj9hfIzD5cXBww3Yf7jeP5t5beFxi/4lRCEn04bLpvUP2y9vw4WvYi8qf1gDp9Pd6nnZ3g+G3KkQria4vn+j7YEGC0x5CwAArrVvQzjq2u4y7mLIFis8u76F7/DONtuVgZOgpA6Gr2IvPIVfttne2RgqhaNNP3o6hu7+HNxbPmpp1xQ5ZdaIqHcLWkJZVdVWdbSEEK0en2z7ifsB6HQ9roSE6C5G3ZbdHn4JhZOJlL5ESj+AyOlLpPQDiJy+REo/gJ7pi90egxE5Kdi8uxJvfroLDp8Iy59hV8fezuI421ak9AOInL5ESj+AyOlLpPQDiJy+BKMfGX1sOOu4x3WNLuw+VIvdRTXYdagWRRWNiLVGIdqsD3jb9CO1qRauPRugqmqr5xW5JQUgfB54i7a0OU4yx/n/7SsthNpQ2WYfw6g5Lduri9s9hy41xx9De9s7G0NzU1WbfvR0DN39OfgO74IUmwxDcjYcos2uRERhJ2gJ5ZSUFKxbt87/uLKyEklJSa22V1b++KJ85MgRJCUlIT4+Hg0NDfD5fNDpdG2O64iqqkaoavdfpY+tfBwJIqUvkdIPIHL6Ein9ACKnL5HSD6Dn+5JmNeHXl4wAgIC0K8tSQJOvp9PVsbezOM62Fin9ACKnL5HSDyBy+hIp/QAipy892Y/MRAsyEy04b0w6AMDR6ISj0dnt8/b0OBtO9NljkXbG1JNeY9liRfTVT5/yHJZ5955yuynvciDv8lPGoM8ee9LtHY3hVL+rPRXDqXQmBkNiDBABrx9EREGrCD9x4kSsWbMG1dXVcDgcWLVqFaZMmeLfnp6eDqPRiPXr1wMAli1bhilTpkCv12PcuHH44IMPAADvvvtuq+OIiIiofV0de4mIiIiIiIg6KmgJ5eTkZNx+++249tprceGFF2LOnDkYMWIEFi5ciK1btwIAnnzySfzpT3/CrFmz0NzcjGuvvRYAcP/992PJkiWYPXs21q1bh9tuuy1YYRIREUWM7oy9RERERERERB0R1GV28/PzkZ+f3+q5F1980f/vnJwcvPXWW22OS09Px8svvxzM0IiIiCJSV8deIiIiIiIioo4I2gxlIiIiIiIiIiIiIoosTCgTERERERERERERUYcwoUxEREREREREREREHcKEMhERERERERERERF1CBPKRERERERERERERNQhTCgTERERERERERERUYcwoUxEREREREREREREHcKEMhERERERERERERF1CBPKRERERERERB2wYsUKzJ49GzNmzMDixYvbbH/uuecwbdo0zJs3D/PmzWt3HyIionCnaB0AERERERERUagrLy/HU089hXfeeQcGgwELFizAhAkTMGDAAP8+27Ztw1/+8heMHj1aw0iJiIiCizOUiYiIiIiIiE5j9erVyMvLg9VqhcViwcyZM7Fy5cpW+2zbtg0vvPAC8vPz8eCDD8LlcmkULRERUfAwoUxERERERER0GhUVFbDb7f7HSUlJKC8v9z9uampCbm4u7rjjDixduhT19fV4/vnntQiViIgoqFjygoiIiIiIiOg0VFWFJEn+x0KIVo+joqLw4osv+h/fcMMNuOeee3D77bd3uI2EhOjABHuU3R4T0PNpJVL6AUROX9iP0BMpfYmUfgCR1ZcTMaFMREREREREdBopKSlYt26d/3FlZSWSkpL8j0tLS7F69WrMnz8fQEvCWVE695G7qqoRqioCEq/dHoPKyoaAnEtLkdIPIHL6wn6EnkjpS6T0Awj/vsiydMovOSMyoSzL0ul30uBcWouUvkRKP4DI6Uuk9AOInL5ESj+A8O5LOMd+Khxn24qUfgCR05dI6QcQOX2JlH4AkdOXcO9HT8c/ceJEPPvss6iurobZbMaqVavw0EMP+bebTCY88cQTmDBhAvr06YPFixdj+vTpnWoj0H0K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FOzduxcLFizARRddhF/84hdttjc0NOC///2v/7EQAjqdrgcj7JidO3fio48+8j9u73coXK4JAHz66aeYPXt2u9vC5ZpQaxxnQ08kjbMcY0P39TwSxtlIG2MBjrORJpLGWCAyxtlIGmMBjrOh+poeCWMsEHnjbG8bY3t9QnnixIlYs2YNqqur4XA4sGrVKkyZMsW/PT09HUajEevXrwcALFu2rNX2UFFWVoZf/OIXePLJJ3HBBRe02W4ymfDEE0/g0KFDEEJg8eLFmD59ugaRnl5DQwMef/xxuFwuNDY2YunSpa1iDZdrcszOnTuRlZUFi8XSZls4XRcAGDlyJPbv34+DBw/C5/Phvffea/Oz1+v1GDduHD744AMAwLvvvhty16exsRE33ngjfv3rX+OGG25odx+LxYJ//vOf/lWZX3nllZC8NkIIPProo6irq4PH48Ebb7zRJs5wuCZAyy1bTqcTffv2bXd7uFwTao3jbOiJpHGWY2xovp5HyjgbSWMswHE2EkXKGAtEzjgbSWMswHE2FF/TI2WMBSJrnO2VY2xQlvoLM8uXLxcXXHCBmDFjhvjHP/4hhBDipptuElu2bBFCCFFQUCAuueQSMXPmTPGb3/xGuFwuLcNt10MPPSRGjRol5s6d6//v1VdfbdWPlStX+vt51113hWQ/jnnqqafErFmzxIwZM8R///tfIUT4XZNj3n//fXHbbbe1ei7crsu0adP8q5euXr1a5OfnixkzZohHHnlEqKoqhBDinnvuEZ988okQQoji4mJx9dVXi/PPP1/ccMMNora2VrPYj3esH//5z3/E0KFDW/29PP3000KI1v1Yu3atuPDCC8WsWbPEzTffLOrr67UMv5Xjr8krr7wizj//fDF9+nTxxBNP+PcJp2sihBCbN28Wl156aZt9wuWa0MlxnA09kTLOcowNnddzISJnnI2UMVYIjrO9QSSMsUJE1jgbKWOsEBxnQ+k1PVLGWCEiZ5zt7WOsJIQQWie1iYiIiIiIiIiIiCj09fqSF0RERERERERERETUMUwoExEREREREREREVGHMKFMRERERERERERERB3ChDIRERERERERERERdQgTykRERERERERERETUIYrWARBRcAwePBiDBg2CLLf+3mjRokXo06dPwNtas2YN4uPjA3peIiKiUMVxloiIKDg4xhKFPiaUiSLYSy+9xIGRiIgoSDjOEhERBQfHWKLQxoQyUS/0/fff48knn0RaWhr27dsHk8mExx57DP3790dDQwMeeOABFBYWQpIknHXWWfjNb34DRVGwefNmPPzww3A4HNDr9bjzzjtx5plnAgCeffZZbN68GbW1tbjxxhtx1VVXadxLIiIibXCcJSIiCg6OsUShgQllogh23XXXtbpNqE+fPli0aBEAYNu2bfj973+PcePG4bXXXsMdd9yBd955Bw8//DCsVitWrFgBj8eDn//85/j3v/+Nn/zkJ/jFL36Bhx9+GFOnTsW2bdtw9913Y9myZQCAvn374v7778eOHTtw+eWX47LLLoNer9ek30RERD2B4ywREVFwcIwlCm1MKBNFsFPdJpSTk4Nx48YBAC655BI8+OCDqKmpwVdffYXXXnsNkiTBYDBgwYIFeOmllzBp0iTIsoypU6cCAIYNG4YVK1b4zzdnzhwAQG5uLtxuNxobG2Gz2YLbQSIiIg1xnCUiIgoOjrFEoU0+/S5EFIl0Ol27z6mqCkmS/M+pqgqv1wudTtfqeQDYtWsXvF4vAEBRWr6fOraPECJYoRMREYU8jrNERETBwTGWSHtMKBP1UoWFhSgsLAQAvPHGGxg9ejRiY2MxefJkvPLKKxBCwO12Y8mSJZg4cSL69esHSZLw7bffAgC2b9+O6667DqqqatkNIiKikMRxloiIKDg4xhJpjyUviCLYiXWnAOA3v/kNTCYTEhMT8fTTT6OkpATx8fF4/PHHAQD33XcfHn74YeTn58Pj8eCss87CzTffDIPBgGeffRaPPvooHn/8cej1ejz77LMwGAxadI2IiEhzHGeJiIiCg2MsUWiTBOfyE/U633//PR566CG89957WodCREQUcTjOEhERBQfHWKLQwJIXRERERERERERERNQhnKFMRERERERERERERB3CGcpERERERERERERE1CFMKBMRERERERERERFRhzChTEREREREREREREQdwoQyEREREREREREREXUIE8pERERERERERERE1CFMKBMRERERERERERFRh/x/Dt6XOVWyQ8QAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plot_performance(loss=losses, error=errors, accuracy=accuracies, log_file=f'{log_dir}/hopfield_pooling.pdf')"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.8.8"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/modules/__init__.py b/src/mhnfs/hopfield/examples/mnist_bags/modules/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c11713739acb1aca3b32cca53acf0c3faf1fa9f6
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/modules/__init__.py
@@ -0,0 +1,898 @@
+import torch
+import torch.nn as nn
+
+from math import sqrt
+from torch import Tensor
+from torch.nn import Module, Parameter
+from typing import Optional, Tuple, Union
+
+from .activation import HopfieldCore
+
+
+class Hopfield(Module):
+ """
+ Module with underlying Hopfield association.
+ """
+
+ def __init__(self,
+ input_size: Optional[int] = None,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False
+ ):
+ """
+ Initialise new instance of a Hopfield module.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ """
+ super(Hopfield, self).__init__()
+ assert type(batch_first) == bool, f'"batch_first" needs to be a boolean, not {type(batch_first)}.'
+ assert (association_activation is None) or (type(association_activation) == str)
+
+ # Initialise Hopfield association module.
+ self.association_core = HopfieldCore(
+ embed_dim=input_size, num_heads=num_heads, dropout=dropout, bias=input_bias,
+ add_bias_kv=concat_bias_pattern, add_zero_attn=add_zero_association, kdim=stored_pattern_size,
+ vdim=pattern_projection_size, head_dim=hidden_size, pattern_dim=pattern_size, out_dim=output_size,
+ disable_out_projection=disable_out_projection, key_as_static=stored_pattern_as_static,
+ query_as_static=state_pattern_as_static, value_as_static=pattern_projection_as_static,
+ value_as_connected=pattern_projection_as_connected, normalize_pattern=normalize_hopfield_space,
+ normalize_pattern_affine=normalize_hopfield_space_affine)
+ self.association_activation = None
+ if association_activation is not None:
+ self.association_activation = getattr(torch, association_activation, None)
+
+ # Initialise stored pattern normalization.
+ self.norm_stored_pattern = None
+ if normalize_stored_pattern_affine:
+ assert normalize_stored_pattern, "affine normalization without normalization has no effect."
+ if normalize_stored_pattern:
+ normalized_shape = input_size if stored_pattern_size is None else stored_pattern_size
+ assert normalized_shape is not None, "stored pattern size required for setting up normalisation"
+ self.norm_stored_pattern = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_stored_pattern_affine)
+
+ # Initialise state pattern normalization.
+ self.norm_state_pattern = None
+ if normalize_state_pattern_affine:
+ assert normalize_state_pattern, "affine normalization without normalization has no effect."
+ if normalize_state_pattern:
+ assert input_size is not None, "input size required for setting up normalisation"
+ self.norm_state_pattern = nn.LayerNorm(
+ normalized_shape=input_size, elementwise_affine=normalize_state_pattern_affine)
+
+ # Initialise pattern projection normalization.
+ self.norm_pattern_projection = None
+ if normalize_pattern_projection_affine:
+ assert normalize_pattern_projection, "affine normalization without normalization has no effect."
+ if normalize_pattern_projection:
+ normalized_shape = input_size if pattern_projection_size is None else pattern_projection_size
+ assert normalized_shape is not None, "pattern projection size required for setting up normalisation"
+ self.norm_pattern_projection = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_pattern_projection_affine)
+
+ # Initialise remaining auxiliary properties.
+ if self.association_core.static_execution:
+ self.__scaling = 1.0 if scaling is None else scaling
+ else:
+ assert self.association_core.head_dim > 0, f'invalid hidden dimension encountered.'
+ self.__scaling = (1.0 / sqrt(self.association_core.head_dim)) if scaling is None else scaling
+ self.__batch_first = batch_first
+ self.__update_steps_max = update_steps_max
+ self.__update_steps_eps = update_steps_eps
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset Hopfield association.
+
+ :return: None
+ """
+ for module in (self.association_core, self.norm_stored_pattern,
+ self.norm_state_pattern, self.norm_pattern_projection):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def _maybe_transpose(self, *args: Tuple[Tensor, ...]) -> Union[Tensor, Tuple[Tensor, ...]]:
+ """
+ Eventually transpose specified data.
+
+ :param args: tensors to eventually transpose (dependent on the state of "batch_first")
+ :return: eventually transposed tensors
+ """
+ transposed_result = tuple(_.transpose(0, 1) for _ in args) if self.__batch_first else args
+ return transposed_result[0] if len(transposed_result) == 1 else transposed_result
+
+ def _associate(self, data: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ return_raw_associations: bool = False, return_projected_patterns: bool = False,
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tuple[Optional[Tensor], ...]:
+ """
+ Apply Hopfield association module on specified data.
+
+ :param data: data to be processed by Hopfield core module
+ :param return_raw_associations: return raw association (softmax) values, unmodified
+ :param return_projected_patterns: return pattern projection values, unmodified
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ assert (type(data) == Tensor) or ((type(data) == tuple) and (len(data) == 3)), \
+ r'either one tensor to be used as "stored pattern", "state pattern" and' \
+ r' "pattern_projection" must be provided, or three separate ones.'
+ if type(data) == Tensor:
+ stored_pattern, state_pattern, pattern_projection = data, data, data
+ else:
+ stored_pattern, state_pattern, pattern_projection = data
+
+ # Optionally transpose data.
+ stored_pattern, state_pattern, pattern_projection = self._maybe_transpose(
+ stored_pattern, state_pattern, pattern_projection)
+
+ # Optionally apply stored pattern normalization.
+ if self.norm_stored_pattern is not None:
+ stored_pattern = self.norm_stored_pattern(input=stored_pattern.reshape(
+ shape=(-1, stored_pattern.shape[2]))).reshape(shape=stored_pattern.shape)
+
+ # Optionally apply state pattern normalization.
+ if self.norm_state_pattern is not None:
+ state_pattern = self.norm_state_pattern(input=state_pattern.reshape(
+ shape=(-1, state_pattern.shape[2]))).reshape(shape=state_pattern.shape)
+
+ # Optionally apply pattern projection normalization.
+ if self.norm_pattern_projection is not None:
+ pattern_projection = self.norm_pattern_projection(input=pattern_projection.reshape(
+ shape=(-1, pattern_projection.shape[2]))).reshape(shape=pattern_projection.shape)
+
+ # Apply Hopfield association and optional activation function.
+ return self.association_core(
+ query=state_pattern, key=stored_pattern, value=pattern_projection,
+ key_padding_mask=stored_pattern_padding_mask, need_weights=False, attn_mask=association_mask,
+ scaling=self.__scaling, update_steps_max=self.__update_steps_max, update_steps_eps=self.__update_steps_eps,
+ return_raw_associations=return_raw_associations, return_pattern_projections=return_projected_patterns)
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield association on specified data.
+
+ :param input: data to be processed by Hopfield association module
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ association_output = self._maybe_transpose(self._associate(
+ data=input, return_raw_associations=False,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[0])
+ if self.association_activation is not None:
+ association_output = self.association_activation(association_output)
+ return association_output
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_raw_associations=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[2]
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_projected_patterns=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[3]
+
+ @property
+ def batch_first(self) -> bool:
+ return self.__batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.__scaling.clone() if type(self.__scaling) == Tensor else self.__scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.association_core.kdim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.association_core.embed_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.association_core.vdim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.state_pattern_dim
+
+ @property
+ def hidden_size(self) -> Optional[int]:
+ return self.association_core.head_dim
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.association_core.out_dim
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.association_core.pattern_dim
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.__update_steps_max.clone() if type(self.__update_steps_max) == Tensor else self.__update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.__update_steps_eps.clone() if type(self.__update_steps_eps) == Tensor else self.__update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.association_core.key_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.association_core.query_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.association_core.value_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.norm_stored_pattern is not None
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.normalize_stored_pattern and self.norm_stored_pattern.elementwise_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.norm_state_pattern is not None
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.normalize_state_pattern and self.norm_state_pattern.elementwise_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.norm_pattern_projection is not None
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.normalize_pattern_projection and self.norm_pattern_projection.elementwise_affine
+
+ @property
+ def normalize_hopfield_space(self) -> bool:
+ return self.hopfield.normalize_hopfield_space
+
+ @property
+ def normalize_hopfield_space_affine(self) -> bool:
+ return self.hopfield.normalize_hopfield_space_affine
+
+
+class HopfieldPooling(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed state pattern and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based pooling layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of state patterns
+ :param trainable: state pattern used for pooling is trainable
+ """
+ super(HopfieldPooling, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ pooling_weight_size = self.hopfield.hidden_size if state_pattern_as_static else self.hopfield.input_size
+ self.pooling_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if pooling_weight_size is None else pooling_weight_size)), requires_grad=trainable)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset pooling weights and underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise pooling weights.
+ nn.init.normal_(self.pooling_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Union[Tensor, Tuple[Tensor, Tensor]]) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ assert (type(input) == Tensor) or ((type(input) == tuple) and (len(input) == 2)), \
+ r'either one tensor to be used as "stored pattern" and' \
+ r' "pattern_projection" must be provided, or two separate ones.'
+ if type(input) == Tensor:
+ stored_pattern, pattern_projection = input, input
+ else:
+ stored_pattern, pattern_projection = input
+
+ batch_size = stored_pattern.shape[0 if self.batch_first else 1]
+ return stored_pattern, self.pooling_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.pooling_weights.shape[2])), pattern_projection
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor]], stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based pooling on specified data.
+
+ :param input: data to be pooled
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-pooled input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask).flatten(start_dim=1)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for pooling gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
+
+
+class HopfieldLayer(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed stored pattern, pattern projection and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+ lookup_weights_as_separated: bool = False,
+ lookup_targets_as_trainable: bool = True,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based lookup layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param lookup_weights_as_separated: separate lookup weights from lookup target weights
+ :param lookup_targets_as_trainable: employ trainable lookup target weights (used as pattern projection input)
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of stored patterns
+ :param trainable: stored pattern used for lookup is trainable
+ """
+ super(HopfieldLayer, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ lookup_weight_size = self.hopfield.hidden_size if stored_pattern_as_static else self.hopfield.stored_pattern_dim
+ self.lookup_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if lookup_weight_size is None else lookup_weight_size)), requires_grad=trainable)
+
+ if lookup_weights_as_separated:
+ target_weight_size = self.lookup_weights.shape[
+ 2] if pattern_projection_size is None else pattern_projection_size
+ self.target_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), target_weight_size)), requires_grad=lookup_targets_as_trainable)
+ else:
+ self.register_parameter(name=r'target_weights', param=None)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset lookup and lookup target weights, including underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise lookup and target weights.
+ nn.init.normal_(self.lookup_weights, mean=0.0, std=0.02)
+ if self.target_weights is not None:
+ nn.init.normal_(self.target_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Tensor) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ batch_size = input.shape[0 if self.batch_first else 1]
+ stored_pattern = self.lookup_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.lookup_weights.shape[2]))
+ if self.target_weights is None:
+ pattern_projection = stored_pattern
+ else:
+ pattern_projection = self.target_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.target_weights.shape[2]))
+
+ return stored_pattern, input, pattern_projection
+
+ def forward(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based lookup on specified data.
+
+ :param input: data to used in lookup
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: result of Hopfield-based lookup on input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_association_matrix(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for lookup gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/modules/activation.py b/src/mhnfs/hopfield/examples/mnist_bags/modules/activation.py
new file mode 100644
index 0000000000000000000000000000000000000000..6dcd6e56cddb954cf6b049687bdf5e7783aa2bc9
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/modules/activation.py
@@ -0,0 +1,337 @@
+import torch
+import torch.nn as nn
+
+from torch import Tensor
+from torch.nn import Linear, Module, Parameter
+from typing import Optional
+
+from .functional import hopfield_core_forward
+
+try:
+ from torch.nn.modules.linear import _LinearWithBias
+except ImportError:
+ _LinearWithBias = None
+
+
+class HopfieldCore(Module):
+ r"""Allows the model to jointly attend to information
+ from different representation subspaces.
+ See references: "Hopfield Networks is All You Need" and
+ "Attention Is All You Need" (on which this implementation is partly based on).
+
+ .. math::
+ \text{HopfieldHead}(Q, K, V) = \text{Concat}(head_1,\dots,head_h)W^O
+ \text{where} head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
+
+ Args:
+ embed_dim: total dimension of the model.
+ num_heads: parallel attention heads.
+ dropout: a Dropout layer on attn_output_weights. Default: 0.0.
+ bias: add bias as module parameter. Default: True.
+ add_bias_kv: add bias to the key and value sequences at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ kdim: total number of features in key. Default: None.
+ vdim: total number of features in value. Default: None.
+
+ Note: if kdim and vdim are None, they will be set to embed_dim such that
+ query, key, and value have the same number of features.
+
+ Examples::
+
+ >>> hopfield_attn = HopfieldCore(embed_dim, num_heads)
+ >>> attn_output, attn_output_weights, attn_matrix = hopfield_attn(query, key, value)
+ """
+ __annotations__ = {
+ 'bias_k': torch._jit_internal.Optional[torch.Tensor],
+ 'bias_v': torch._jit_internal.Optional[torch.Tensor],
+ }
+
+ def __init__(self,
+ embed_dim=None, # type: Optional[int]
+ num_heads=1, # type: int
+ dropout=0.0, # type: float
+ bias=True, # type: bool
+ add_bias_kv=False, # type: bool
+ add_zero_attn=False, # type: bool
+ kdim=None, # type: Optional[int]
+ vdim=None, # type: Optional[int]
+
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ out_dim=None, # type: Optional[int]
+ disable_out_projection=False, # type: bool
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ normalize_pattern_affine=False # type: bool
+ ):
+ super(HopfieldCore, self).__init__()
+
+ assert (type(key_as_static) == bool) and (type(query_as_static) == bool) and (type(value_as_static) == bool)
+ self.key_as_static, self.query_as_static, self.value_as_static = key_as_static, query_as_static, value_as_static
+ num_non_static = 3 - (self.key_as_static + self.query_as_static + self.value_as_static)
+ assert 0 <= num_non_static < 4
+
+ self.value_as_connected = value_as_connected
+ self.normalize_pattern, self.normalize_pattern_affine = normalize_pattern, normalize_pattern_affine
+ self.disable_out_projection = disable_out_projection
+
+ # In case of a static-only executions, check corresponding projections and normalizations.
+ self.static_execution = self._check_execution_mode()
+ if self.static_execution:
+ embed_dim, kdim, vdim = None, None, None
+ if embed_dim is None:
+ assert self.static_execution, r'static-only execution requires all projections to be deactivated.'
+
+ # Check and set all other properties, conditioned on .
+ self.embed_dim = embed_dim
+ self.kdim = kdim if kdim is not None else embed_dim
+ self.vdim = vdim if vdim is not None else embed_dim
+ self._qkv_same_embed_dim = all((
+ self.kdim == embed_dim, self.vdim == embed_dim, pattern_dim is None, not self.value_as_connected))
+ assert (not self.value_as_connected) or (self.kdim == self.vdim), r'key and value need to be of same dimension.'
+
+ self.num_heads = num_heads
+ self.dropout = dropout
+ self.head_dim = None
+ self.pattern_dim = pattern_dim
+ self.virtual_hopfield_dim = None
+ self.virtual_pattern_dim = None
+ if not self.static_execution:
+ if head_dim is None:
+ self.head_dim = embed_dim // num_heads
+ assert self.head_dim * num_heads == self.embed_dim, "embed_dim must be divisible by num_heads."
+ else:
+ assert head_dim > 0, "dimension of the association space has to be positive."
+ self.head_dim = head_dim
+ if self.pattern_dim is None:
+ self.pattern_dim = self.head_dim
+ self.virtual_hopfield_dim = self.num_heads * self.head_dim
+ self.virtual_pattern_dim = self.num_heads * self.pattern_dim
+
+ self.out_dim = embed_dim if out_dim is None else out_dim
+ assert disable_out_projection or (self.out_dim > 0), "output projection dimension has to be positive."
+
+ if normalize_pattern_affine:
+ assert normalize_pattern, "affine pattern normalization without pattern normalization has no effect."
+ self.p_norm_weight = Parameter(torch.Tensor(head_dim))
+ self.p_norm_bias = Parameter(torch.Tensor(head_dim))
+ else:
+ self.register_parameter('p_norm_weight', None)
+ self.register_parameter('p_norm_bias', None)
+
+ if self._qkv_same_embed_dim is False:
+ if query_as_static:
+ self.register_parameter('q_proj_weight', None)
+ else:
+ self.q_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, embed_dim))
+ if key_as_static:
+ self.register_parameter('k_proj_weight', None)
+ else:
+ self.k_proj_weight = Parameter(torch.Tensor(self.virtual_hopfield_dim, self.kdim))
+ if value_as_static:
+ self.register_parameter('v_proj_weight', None)
+ else:
+ self.v_proj_weight = Parameter(torch.Tensor(
+ self.virtual_pattern_dim,
+ self.virtual_hopfield_dim if (value_as_connected and not key_as_static) else self.vdim))
+ self.register_parameter('in_proj_weight', None)
+ else:
+ if num_non_static > 0:
+ self.in_proj_weight = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim +
+ (not value_as_static) * self.virtual_pattern_dim, embed_dim))
+ else:
+ self.register_parameter('in_proj_weight', None)
+ self.register_parameter('q_proj_weight', None)
+ self.register_parameter('k_proj_weight', None)
+ self.register_parameter('v_proj_weight', None)
+
+ if bias and (num_non_static > 0):
+ self.in_proj_bias = Parameter(torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim +
+ (not key_as_static) * self.virtual_hopfield_dim + self.virtual_pattern_dim))
+ else:
+ self.register_parameter('in_proj_bias', None)
+ if disable_out_projection:
+ self.register_parameter('out_proj', None)
+ else:
+ if bias and _LinearWithBias is not None:
+ self.out_proj = _LinearWithBias(self.virtual_pattern_dim, self.out_dim)
+ else:
+ self.out_proj = Linear(self.virtual_pattern_dim, self.out_dim, bias=bias)
+
+ self.bias_k, self.bias_v = None, None
+ if add_bias_kv:
+ if not key_as_static:
+ self.bias_k = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ if not value_as_static:
+ self.bias_v = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ assert not (self.bias_k is None and self.bias_v is None), r'cannot set key/value bias if both are static.'
+
+ self.add_zero_attn = add_zero_attn
+ self.reset_parameters()
+
+ def _check_execution_mode(self) -> bool:
+ return all((
+ self.key_as_static, self.query_as_static, self.value_as_static, not self.value_as_connected,
+ not self.normalize_pattern, not self.normalize_pattern_affine, self.disable_out_projection
+ ))
+
+ def reset_parameters(self):
+ if self.p_norm_weight is not None:
+ nn.init.ones_(self.p_norm_weight)
+ nn.init.zeros_(self.p_norm_bias)
+
+ if self._qkv_same_embed_dim and (self.in_proj_weight is not None):
+ nn.init.normal_(self.in_proj_weight, mean=0.0, std=0.02)
+ else:
+ if self.q_proj_weight is not None:
+ nn.init.normal_(self.q_proj_weight, mean=0.0, std=0.02)
+ if self.k_proj_weight is not None:
+ nn.init.normal_(self.k_proj_weight, mean=0.0, std=0.02)
+ if self.v_proj_weight is not None:
+ nn.init.normal_(self.v_proj_weight, mean=0.0, std=0.02)
+
+ if self.in_proj_bias is not None:
+ nn.init.constant_(self.in_proj_bias, 0.0)
+ if not self.disable_out_projection:
+ nn.init.normal_(self.out_proj.weight, mean=0.0, std=0.02)
+ if self.out_proj.bias is not None:
+ nn.init.constant_(self.out_proj.bias, 0.0)
+ if self.bias_k is not None:
+ nn.init.normal_(self.bias_k, mean=0.0, std=0.02)
+ if self.bias_v is not None:
+ nn.init.normal_(self.bias_v, mean=0.0, std=0.02)
+
+ def __setstate__(self, state):
+ super(HopfieldCore, self).__setstate__(state)
+
+ def forward(self,
+ query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+
+ scaling=None, # type: Optional[Tensor]
+ update_steps_max=0, # type: Optional[int]
+ update_steps_eps=1e-4, # type: float
+ return_raw_associations=False, # type: bool
+ return_pattern_projections=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. When given a binary mask and a value is True,
+ the corresponding value on the attention layer will be ignored. When given
+ a byte mask and a value is non-zero, the corresponding value on the attention
+ layer will be ignored.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_pattern_projections: return pattern projection values, unmodified.
+
+ Shape:
+ - Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the position
+ with the zero positions will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensure that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ is not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ - Outputs:
+ - attn_output: :math:`(L, N, E)` where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)` where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if self.query_as_static and self.key_as_static:
+ assert query.shape[2] == key.shape[2], \
+ f'query shape[2] of {query.shape[2]} and key shape[2] of {key.shape[2]} need to be equal'
+ head_dim, embed_dim_to_check = query.shape[2], query.shape[2]
+ else:
+ assert self.query_as_static or (query.shape[2] == self.embed_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.embed_dim}.'
+ assert (not self.query_as_static) or (self.query_as_static and query.shape[2] == self.head_dim), \
+ f'query shape[2] of {query.shape[2]} invalid, needs to be {self.head_dim}'
+
+ assert self.key_as_static or (key.shape[2] == self.kdim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.kdim}.'
+ assert (not self.key_as_static) or (self.key_as_static and key.shape[2] == self.head_dim), \
+ f'key shape[2] of {key.shape[2]} invalid, needs to be {self.head_dim}'
+ head_dim, embed_dim_to_check = self.head_dim, self.head_dim if self.query_as_static else self.embed_dim
+
+ assert self.value_as_static or (value.shape[2] == self.vdim), \
+ f'value shape[2] of {value.shape[2]} invalid, needs to be {self.vdim}.'
+ assert any((
+ not self.value_as_static, self.value_as_static and value.shape[2] == self.pattern_dim,
+ self.disable_out_projection)
+ ), f'value shape[2] of {value.shape[2]} invalid, needs to be {self.pattern_dim}'
+
+ out_weights, out_bias = None, None
+ if not self.disable_out_projection:
+ out_weights, out_bias = self.out_proj.weight, self.out_proj.bias
+
+ if not self._qkv_same_embed_dim:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=True, q_proj_weight=self.q_proj_weight, k_proj_weight=self.k_proj_weight,
+ v_proj_weight=self.v_proj_weight,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
+ else:
+ return hopfield_core_forward(
+ query=query, key=key, value=value, embed_dim_to_check=embed_dim_to_check, num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight, in_proj_bias=self.in_proj_bias, bias_k=self.bias_k,
+ bias_v=self.bias_v, add_zero_attn=self.add_zero_attn, dropout_p=self.dropout,
+ out_proj_weight=out_weights, out_proj_bias=out_bias, training=self.training,
+ key_padding_mask=key_padding_mask, need_weights=need_weights, attn_mask=attn_mask,
+
+ key_as_static=self.key_as_static, query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static, value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight, p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim, pattern_dim=self.pattern_dim, scaling=scaling,
+ update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations, return_projected_patterns=return_pattern_projections)
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/modules/functional.py b/src/mhnfs/hopfield/examples/mnist_bags/modules/functional.py
new file mode 100644
index 0000000000000000000000000000000000000000..2619c45fd87dc5f0348db393aa9b305611b4dd32
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/modules/functional.py
@@ -0,0 +1,450 @@
+import torch
+import torch.nn as nn
+
+from torch.tensor import Tensor
+from typing import Optional, Tuple, Union
+
+
+def hopfield_core_forward(query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ embed_dim_to_check, # type: int
+ num_heads, # type: int
+ in_proj_weight, # type: Optional[Tensor]
+ in_proj_bias, # type: Optional[Tensor]
+ bias_k, # type: Optional[Tensor]
+ bias_v, # type: Optional[Tensor]
+ add_zero_attn, # type: bool
+ dropout_p, # type: float
+ out_proj_weight, # type: Tensor
+ out_proj_bias, # type: Tensor
+ training=True, # type: bool
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+ use_separate_proj_weight=False, # type: bool
+ q_proj_weight=None, # type: Optional[Tensor]
+ k_proj_weight=None, # type: Optional[Tensor]
+ v_proj_weight=None, # type: Optional[Tensor]
+ static_k=None, # type: Optional[Tensor]
+ static_v=None, # type: Optional[Tensor]
+
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ p_norm_weight=None, # type: Optional[Tensor]
+ p_norm_bias=None, # type: Optional[Tensor]
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ scaling=None, # type: Optional[Union[float, Tensor]]
+ update_steps_max=0, # type: Optional[Union[int, Tensor]]
+ update_steps_eps=1e-4, # type: Union[float, Tensor]
+ return_raw_associations=False, # type: bool
+ return_projected_patterns=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ embed_dim_to_check: total dimension of the model (in case of default head dimension).
+ num_heads: parallel attention heads.
+ in_proj_weight, in_proj_bias: input projection weight and bias.
+ bias_k, bias_v: bias of the key and value sequences to be added at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ dropout_p: probability of an element to be zeroed.
+ out_proj_weight, out_proj_bias: the output projection weight and bias.
+ training: apply dropout if is ``True``.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. This is an binary mask. When the value is True,
+ the corresponding value on the attention layer will be filled with -inf.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+ use_separate_proj_weight: the function accept the proj. weights for query, key,
+ and value in different forms. If false, in_proj_weight will be used, which is
+ a combination of q_proj_weight, k_proj_weight, v_proj_weight.
+ q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias: input projection weight and bias.
+ static_k, static_v: static key and value used for attention operators.
+
+ key_as_static: interpret specified key as being static.
+ query_as_static: interpret specified key as being static.
+ value_as_static: interpret specified key as being static.
+ value_as_connected: connect value projection with key projection.
+ normalize_pattern: enable normalization of patterns.
+ p_norm_weight, p_norm_bias: pattern normalization weight and bias.
+ head_dim: dimensionality of each head.
+ pattern_dim: dimensionality of each projected value input.
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_projected_patterns: return pattern projection values, unmodified.
+
+ Shape:
+ Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the zero positions
+ will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensures that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ are not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+ - static_k: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+ - static_v: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ Outputs:
+ - attn_output: :math:`(L, N, E)`, where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if not torch.jit.is_scripting():
+ tens_ops = (query, key, value, in_proj_weight, in_proj_bias, bias_k, bias_v,
+ out_proj_weight, out_proj_bias)
+ if any([type(t) is not Tensor for t in tens_ops]) and nn.functional.has_torch_function(tens_ops):
+ return nn.functional.handle_torch_function(
+ hopfield_core_forward, tens_ops, query, key, value,
+ embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias,
+ bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight,
+ out_proj_bias, training=training, key_padding_mask=key_padding_mask,
+ need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=use_separate_proj_weight,
+ q_proj_weight=q_proj_weight, k_proj_weight=k_proj_weight,
+ v_proj_weight=v_proj_weight, static_k=static_k, static_v=static_v,
+ key_as_static=key_as_static, query_as_static=query_as_static,
+ value_as_static=value_as_static, value_as_connected=value_as_connected,
+ normalize_pattern=normalize_pattern, p_norm_weight=p_norm_weight, p_norm_bias=p_norm_bias,
+ head_dim=head_dim, pattern_dim=pattern_dim, scaling=scaling, update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps, return_raw_associations=return_raw_associations)
+ tgt_len, bsz, embed_dim = query.shape[0], value.shape[1], query.shape[2]
+ assert embed_dim == embed_dim_to_check
+ # allow MHA to have different sizes for the feature dimension
+ assert key.size(0) == value.size(0) and key.size(1) == value.size(1)
+
+ assert (scaling is None) or (type(scaling) in (float, torch.Tensor))
+ if type(scaling) == torch.Tensor:
+ assert scaling.ndimension() == 1 and scaling.shape[0] == num_heads, "only one entry per head."
+
+ assert (update_steps_max is None) or (type(update_steps_max) in (int, torch.Tensor))
+ if type(update_steps_max) == torch.Tensor:
+ assert update_steps_max.ndimension() == 1 and update_steps_max.shape[0] == num_heads, "only one entry per head."
+ elif type(update_steps_max) == int:
+ update_steps_max = torch.tensor([update_steps_max] * num_heads, dtype=torch.int32, device=query.device)
+ elif update_steps_max is None:
+ update_steps_max = -torch.ones(size=(num_heads,), dtype=torch.int32, device=query.device)
+
+ assert type(update_steps_eps) in (float, torch.Tensor)
+ if type(update_steps_eps) == torch.Tensor:
+ assert update_steps_eps.ndimension() == 1 and update_steps_eps.shape[0] == num_heads, "only one entry per head."
+ assert (update_steps_eps <= 0.0).sum() == 0, "only positive thresholds allowed."
+ update_steps_eps = update_steps_eps.to(device=query.device)
+ elif type(update_steps_eps) == float:
+ assert update_steps_eps > 0, "only positive thresholds allowed."
+ update_steps_eps = torch.tensor([update_steps_eps] * num_heads, dtype=query.dtype, device=query.device)
+
+ # Adapt dimensionality of each each.
+ if head_dim is None:
+ head_dim = embed_dim // num_heads
+ assert head_dim * num_heads == embed_dim, r'embed_dim must be divisible by num_heads.'
+ hopfield_dim = num_heads * head_dim
+
+ # Adapt dimensionality of each value projection.
+ if pattern_dim is None:
+ pattern_dim = head_dim
+ assert (not value_as_connected) or (pattern_dim == head_dim)
+
+ q, k, v, xi, src_len = None, None, None, None, 0
+ update_step, xi_old, xi_difference_norm = 0, None, float(r'+inf')
+ update_active_heads = torch.tensor([[[True]]] * num_heads * bsz, device=query.device)
+ assert update_active_heads.any(), "at least one head needs to be active."
+
+ ####################################################################################################################
+ # BEGIN HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ while update_active_heads.any():
+
+ # The query is already projected into the "Hopfield" space at "update_step" equals 0.
+ # No more projection necessary if "update_step" greater than 0.
+ if update_step == 0:
+ if not use_separate_proj_weight:
+
+ if torch.equal(query, key) and torch.equal(key, value) and not (
+ key_as_static or query_as_static or value_as_static):
+ # self-attention
+ q, k, v = nn.functional.linear(query, in_proj_weight, in_proj_bias).chunk(3, dim=-1)
+
+ elif torch.equal(key, value) and not (key_as_static or value_as_static):
+ # encoder-decoder attention
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start = hopfield_dim
+ _end = None
+
+ if key is None:
+ assert value is None
+ k = None
+ v = None
+ else:
+
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k, v = nn.functional.linear(key, _w, _b).chunk(2, dim=-1)
+
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k = nn.functional.linear(key, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if value_as_static:
+ v = value.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ v = nn.functional.linear(value, _w, _b)
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ q_proj_weight_non_opt = torch.jit._unwrap_optional(q_proj_weight)
+ len1, len2 = q_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == query.size(-1)
+ if in_proj_bias is not None:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias[_start:_end])
+ _start += hopfield_dim
+ _end += hopfield_dim
+ else:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias)
+
+ v = value
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ k_proj_weight_non_opt = torch.jit._unwrap_optional(k_proj_weight)
+ len1, len2 = k_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == key.size(-1)
+
+ _bias = None if in_proj_bias is None else in_proj_bias[_start:_end]
+ k = nn.functional.linear(key, k_proj_weight_non_opt, _bias)
+ if value_as_connected:
+ v = nn.functional.linear(v, k_proj_weight_non_opt, _bias)
+ _start += hopfield_dim
+ _end += num_heads * pattern_dim
+
+ if value_as_static:
+ if not (value_as_connected or key_as_static):
+ v = v.repeat(1, num_heads, 1)
+ else:
+ v_proj_weight_non_opt = torch.jit._unwrap_optional(v_proj_weight)
+ len1, len2 = v_proj_weight_non_opt.size()
+ assert len1 == (num_heads * pattern_dim) and len2 == v.size(-1)
+ if in_proj_bias is not None:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias[_start:])
+ else:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias)
+
+ if attn_mask is not None:
+ assert attn_mask.dtype == torch.float32 or attn_mask.dtype == torch.float64 or \
+ attn_mask.dtype == torch.float16 or attn_mask.dtype == torch.uint8 or \
+ attn_mask.dtype == torch.bool, \
+ 'Only float, byte, and bool types are supported for attn_mask, not {}'.format(attn_mask.dtype)
+ if attn_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for attn_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ attn_mask = attn_mask.to(torch.bool)
+
+ if attn_mask.dim() == 2:
+ attn_mask = attn_mask.unsqueeze(0)
+ if list(attn_mask.size()) != [1, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 2D attn_mask is not correct.')
+ elif attn_mask.dim() == 3:
+ if list(attn_mask.size()) != [bsz * num_heads, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 3D attn_mask is not correct.')
+ else:
+ raise RuntimeError("attn_mask's dimension {} is not supported".format(attn_mask.dim()))
+ # attn_mask's dim is 3 now.
+
+ # Optionally normalize patterns.
+ if normalize_pattern:
+ q = torch.nn.functional.layer_norm(
+ input=q.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=q.shape)
+ k = torch.nn.functional.layer_norm(
+ input=k.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=k.shape)
+
+ else:
+ active_xi = xi.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:]))
+ active_k = k.masked_select(mask=update_active_heads).view(size=(-1, *k.shape[1:]))
+ q = torch.masked_scatter(input=q, mask=update_active_heads, source=torch.bmm(active_xi, active_k))
+
+ # Optionally scale association heads (each head separately).
+ if type(scaling) == float:
+ q = q * scaling
+ elif type(scaling) == torch.Tensor:
+ q = q * scaling.view(1, 1, -1).repeat(repeats=(1, 1, q.shape[2] // scaling.shape[0]))
+
+ if update_step == 0:
+ # convert ByteTensor key_padding_mask to bool
+ if key_padding_mask is not None and key_padding_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for key_padding_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ key_padding_mask = key_padding_mask.to(torch.bool)
+
+ if bias_k is not None and bias_v is not None:
+ if static_k is None and static_v is None and key_as_static is None and value_as_static is None:
+ k = torch.cat([k, bias_k.repeat(1, bsz, 1)])
+ v = torch.cat([v, bias_v.repeat(1, bsz, 1)])
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+ else:
+ assert static_k is None, "bias cannot be added to static key."
+ assert static_v is None, "bias cannot be added to static value."
+ assert not key_as_static, "bias cannot be added to static key."
+ assert not value_as_static, "bias cannot be added to static value."
+ else:
+ assert bias_k is None
+ assert bias_v is None
+
+ q = q.contiguous().view(tgt_len, -1, head_dim).transpose(0, 1)
+ if k is not None:
+ k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
+ if v is not None:
+ v = v.contiguous().view(v.shape[0], bsz * num_heads, -1).transpose(0, 1)
+
+ if static_k is not None:
+ assert static_k.size(0) == bsz * num_heads
+ assert static_k.size(2) == head_dim
+ k = static_k
+
+ if static_v is not None:
+ assert static_v.size(0) == bsz * num_heads
+ assert static_v.size(2) == pattern_dim
+ v = static_v
+
+ src_len = k.size(1)
+
+ if key_padding_mask is not None:
+ assert key_padding_mask.size(0) == bsz
+ assert key_padding_mask.size(1) == src_len
+
+ if add_zero_attn:
+ src_len += 1
+ k = torch.cat([k, torch.zeros((k.size(0), 1) + k.size()[2:], dtype=k.dtype, device=k.device)], dim=1)
+ v = torch.cat([v, torch.zeros((v.size(0), 1) + v.size()[2:], dtype=v.dtype, device=v.device)], dim=1)
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+
+ attn_output_weights = torch.bmm(q, k.transpose(1, 2))
+ assert list(attn_output_weights.size()) == [bsz * num_heads, tgt_len, src_len]
+
+ if attn_mask is not None:
+ if attn_mask.dtype == torch.bool:
+ attn_output_weights.masked_fill_(attn_mask, float('-inf'))
+ else:
+ attn_output_weights += attn_mask
+
+ if key_padding_mask is not None:
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ attn_output_weights = attn_output_weights.masked_fill(
+ key_padding_mask.unsqueeze(1).unsqueeze(2),
+ float('-inf'),
+ )
+ attn_output_weights = attn_output_weights.view(bsz * num_heads, tgt_len, src_len)
+
+ # Compute new xi for Hopfield retrieve iterations.
+ if xi is None:
+ xi = nn.functional.softmax(attn_output_weights, dim=-1)
+ else:
+ xi = torch.masked_scatter(input=xi, mask=update_active_heads, source=nn.functional.softmax(
+ attn_output_weights.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:])), dim=-1))
+
+ # Compute threshold-based stopping criterion for Hopfield retrieve iterations.
+ with torch.no_grad():
+ xi_active = xi.view(size=(bsz, num_heads, tgt_len, src_len))
+ update_active_heads = (update_step < update_steps_max) | (update_steps_max < 0)
+ if xi_old is not None:
+ update_active_heads &= ((xi_old - xi_active).norm(p=2, dim=(2, 3)).max(axis=0)[0]) > update_steps_eps
+ update_active_heads = update_active_heads.unsqueeze(dim=1).unsqueeze(dim=2).repeat(repeats=(bsz, 1, 1))
+ xi_old = xi_active
+ update_step += 1
+
+ ####################################################################################################################
+ # END HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ attn_output_weights = nn.functional.dropout(xi, p=dropout_p, training=training)
+ attn_output = torch.bmm(attn_output_weights, v)
+ assert list(attn_output.shape[:2]) == [bsz * num_heads, tgt_len]
+ attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len, bsz, -1)
+ if out_proj_weight is not None:
+ assert attn_output.shape[2] == num_heads * pattern_dim
+ attn_output = nn.functional.linear(attn_output, out_proj_weight, out_proj_bias)
+
+ xi = xi.view(bsz, num_heads, tgt_len, src_len) if return_raw_associations else None
+ v = v.view(bsz, num_heads, src_len, -1) if return_projected_patterns else None
+ if need_weights:
+ # average attention weights over heads
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ return attn_output, attn_output_weights.sum(dim=1) / num_heads, xi, v
+ else:
+ return attn_output, None, xi, v
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/modules/transformer.py b/src/mhnfs/hopfield/examples/mnist_bags/modules/transformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..884e0cb4b57610cf1daf8147f2c3d59f17824750
--- /dev/null
+++ b/src/mhnfs/hopfield/examples/mnist_bags/modules/transformer.py
@@ -0,0 +1,209 @@
+import torch
+import torch.nn as nn
+
+from copy import deepcopy
+from torch import Tensor
+from torch.nn.modules import Module
+from typing import Optional, Tuple, Union
+
+from . import Hopfield
+
+
+class HopfieldEncoderLayer(Module):
+ """
+ Module with underlying Hopfield association to be used as an encoder in transformer-like architectures.
+ """
+
+ def __init__(self,
+ hopfield_association: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association: instance of Hopfield association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ :param dropout: dropout probability to be applied internally
+ """
+ super(HopfieldEncoderLayer, self).__init__()
+ self.hopfield_association = deepcopy(hopfield_association)
+
+ self.linear_residual = nn.Linear(self.hopfield_association.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association.state_pattern_dim)
+
+ self.norm_residual = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.dropout_hopfield_association = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association, self.linear_residual,
+ self.linear_output, self.norm_residual, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, src: Tensor, src_mask: Optional[Tensor] = None,
+ src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield encoding on specified data.
+
+ :param src: data to be processed by Hopfield encoder module
+ :param src_mask: mask to be applied on association matrix
+ :param src_key_padding_mask: mask to be applied on stored patterns
+ :return: Hopfield-encoded input data
+ """
+ data_associated = self.hopfield_association(
+ input=src, stored_pattern_padding_mask=src_key_padding_mask, association_mask=src_mask)
+ src = src + self.dropout_hopfield_association(input=data_associated)
+ src = self.norm_residual(input=src)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=src))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ src = src + self.dropout_output(input=data_associated)
+
+ return self.norm_output(input=src)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output.out_features
+
+
+class HopfieldDecoderLayer(Module):
+
+ def __init__(self,
+ hopfield_association_self: Hopfield,
+ hopfield_association_cross: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association_self: instance of Hopfield self-association module
+ :param hopfield_association_cross: instance of Hopfield cross-association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param dropout: dropout probability to be applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ """
+ super(HopfieldDecoderLayer, self).__init__()
+ self.hopfield_association_self = deepcopy(hopfield_association_self)
+ self.hopfield_association_cross = deepcopy(hopfield_association_cross)
+
+ self.linear_residual = nn.Linear(self.hopfield_association_self.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association_self.state_pattern_dim)
+
+ self.norm_residual_self = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_residual_cross = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.dropout_hopfield_association_self = nn.Dropout(dropout)
+ self.dropout_hopfield_association_cross = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association_self, self.hopfield_association_cross,
+ self.linear_residual, self.linear_output, self.norm_residual_self,
+ self.norm_residual_cross, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None,
+ memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None,
+ memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield decoding on specified data.
+
+ :param tgt: data to be processed by Hopfield decoder module (self-association)
+ :param memory: data to be processed by Hopfield encoder module (cross-association)
+ :param tgt_mask: mask to be applied on self-association matrix
+ :param memory_mask: mask to be applied on cross-association matrix
+ :param tgt_key_padding_mask: mask to be applied on stored patterns
+ :param memory_key_padding_mask: mask to be applied on state patterns as well as pattern projection
+ :return: Hopfield-decoded input
+ """
+ data_associated = self.hopfield_association_self(
+ input=tgt, stored_pattern_padding_mask=tgt_key_padding_mask,
+ association_mask=tgt_mask)
+ tgt = tgt + self.dropout_hopfield_association_self(input=data_associated)
+ tgt = self.norm_residual_self(input=tgt)
+
+ data_associated = self.hopfield_association_cross(
+ input=(memory, tgt, memory), stored_pattern_padding_mask=memory_key_padding_mask,
+ association_mask=memory_mask)
+ tgt = tgt + self.dropout_hopfield_association_cross(input=data_associated)
+ tgt = self.norm_residual_cross(input=tgt)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=tgt))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ tgt = tgt + self.dropout_output(input=data_associated)
+ return self.norm_output(input=tgt)
+
+ def get_association_matrix_self(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield self-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_self.get_association_matrix(input=input)
+
+ def get_association_matrix_cross(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield cross-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_cross.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association_self.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association_self.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output_self.out_features
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/resources/attention_base.pdf b/src/mhnfs/hopfield/examples/mnist_bags/resources/attention_base.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..9bda3dcc2e08778205dc34f009e1ae59efdf4ac4
Binary files /dev/null and b/src/mhnfs/hopfield/examples/mnist_bags/resources/attention_base.pdf differ
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/resources/gated_attention_base.pdf b/src/mhnfs/hopfield/examples/mnist_bags/resources/gated_attention_base.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f810c2f8e6d8f277e4f0073c3d1c9312e986caa4
Binary files /dev/null and b/src/mhnfs/hopfield/examples/mnist_bags/resources/gated_attention_base.pdf differ
diff --git a/src/mhnfs/hopfield/examples/mnist_bags/resources/hopfield_pooling.pdf b/src/mhnfs/hopfield/examples/mnist_bags/resources/hopfield_pooling.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..998d74eea9f281277cfb49cb05f25fd6dc8fbd2d
Binary files /dev/null and b/src/mhnfs/hopfield/examples/mnist_bags/resources/hopfield_pooling.pdf differ
diff --git a/src/mhnfs/hopfield/modules/__init__.py b/src/mhnfs/hopfield/modules/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..c11713739acb1aca3b32cca53acf0c3faf1fa9f6
--- /dev/null
+++ b/src/mhnfs/hopfield/modules/__init__.py
@@ -0,0 +1,898 @@
+import torch
+import torch.nn as nn
+
+from math import sqrt
+from torch import Tensor
+from torch.nn import Module, Parameter
+from typing import Optional, Tuple, Union
+
+from .activation import HopfieldCore
+
+
+class Hopfield(Module):
+ """
+ Module with underlying Hopfield association.
+ """
+
+ def __init__(self,
+ input_size: Optional[int] = None,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False
+ ):
+ """
+ Initialise new instance of a Hopfield module.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ """
+ super(Hopfield, self).__init__()
+ assert type(batch_first) == bool, f'"batch_first" needs to be a boolean, not {type(batch_first)}.'
+ assert (association_activation is None) or (type(association_activation) == str)
+
+ # Initialise Hopfield association module.
+ self.association_core = HopfieldCore(
+ embed_dim=input_size, num_heads=num_heads, dropout=dropout, bias=input_bias,
+ add_bias_kv=concat_bias_pattern, add_zero_attn=add_zero_association, kdim=stored_pattern_size,
+ vdim=pattern_projection_size, head_dim=hidden_size, pattern_dim=pattern_size, out_dim=output_size,
+ disable_out_projection=disable_out_projection, key_as_static=stored_pattern_as_static,
+ query_as_static=state_pattern_as_static, value_as_static=pattern_projection_as_static,
+ value_as_connected=pattern_projection_as_connected, normalize_pattern=normalize_hopfield_space,
+ normalize_pattern_affine=normalize_hopfield_space_affine)
+ self.association_activation = None
+ if association_activation is not None:
+ self.association_activation = getattr(torch, association_activation, None)
+
+ # Initialise stored pattern normalization.
+ self.norm_stored_pattern = None
+ if normalize_stored_pattern_affine:
+ assert normalize_stored_pattern, "affine normalization without normalization has no effect."
+ if normalize_stored_pattern:
+ normalized_shape = input_size if stored_pattern_size is None else stored_pattern_size
+ assert normalized_shape is not None, "stored pattern size required for setting up normalisation"
+ self.norm_stored_pattern = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_stored_pattern_affine)
+
+ # Initialise state pattern normalization.
+ self.norm_state_pattern = None
+ if normalize_state_pattern_affine:
+ assert normalize_state_pattern, "affine normalization without normalization has no effect."
+ if normalize_state_pattern:
+ assert input_size is not None, "input size required for setting up normalisation"
+ self.norm_state_pattern = nn.LayerNorm(
+ normalized_shape=input_size, elementwise_affine=normalize_state_pattern_affine)
+
+ # Initialise pattern projection normalization.
+ self.norm_pattern_projection = None
+ if normalize_pattern_projection_affine:
+ assert normalize_pattern_projection, "affine normalization without normalization has no effect."
+ if normalize_pattern_projection:
+ normalized_shape = input_size if pattern_projection_size is None else pattern_projection_size
+ assert normalized_shape is not None, "pattern projection size required for setting up normalisation"
+ self.norm_pattern_projection = nn.LayerNorm(
+ normalized_shape=normalized_shape, elementwise_affine=normalize_pattern_projection_affine)
+
+ # Initialise remaining auxiliary properties.
+ if self.association_core.static_execution:
+ self.__scaling = 1.0 if scaling is None else scaling
+ else:
+ assert self.association_core.head_dim > 0, f'invalid hidden dimension encountered.'
+ self.__scaling = (1.0 / sqrt(self.association_core.head_dim)) if scaling is None else scaling
+ self.__batch_first = batch_first
+ self.__update_steps_max = update_steps_max
+ self.__update_steps_eps = update_steps_eps
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset Hopfield association.
+
+ :return: None
+ """
+ for module in (self.association_core, self.norm_stored_pattern,
+ self.norm_state_pattern, self.norm_pattern_projection):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def _maybe_transpose(self, *args: Tuple[Tensor, ...]) -> Union[Tensor, Tuple[Tensor, ...]]:
+ """
+ Eventually transpose specified data.
+
+ :param args: tensors to eventually transpose (dependent on the state of "batch_first")
+ :return: eventually transposed tensors
+ """
+ transposed_result = tuple(_.transpose(0, 1) for _ in args) if self.__batch_first else args
+ return transposed_result[0] if len(transposed_result) == 1 else transposed_result
+
+ def _associate(self, data: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ return_raw_associations: bool = False, return_projected_patterns: bool = False,
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tuple[Optional[Tensor], ...]:
+ """
+ Apply Hopfield association module on specified data.
+
+ :param data: data to be processed by Hopfield core module
+ :param return_raw_associations: return raw association (softmax) values, unmodified
+ :param return_projected_patterns: return pattern projection values, unmodified
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ assert (type(data) == Tensor) or ((type(data) == tuple) and (len(data) == 3)), \
+ r'either one tensor to be used as "stored pattern", "state pattern" and' \
+ r' "pattern_projection" must be provided, or three separate ones.'
+ if type(data) == Tensor:
+ stored_pattern, state_pattern, pattern_projection = data, data, data
+ else:
+ stored_pattern, state_pattern, pattern_projection = data
+
+ # Optionally transpose data.
+ stored_pattern, state_pattern, pattern_projection = self._maybe_transpose(
+ stored_pattern, state_pattern, pattern_projection)
+
+ # Optionally apply stored pattern normalization.
+ if self.norm_stored_pattern is not None:
+ stored_pattern = self.norm_stored_pattern(input=stored_pattern.reshape(
+ shape=(-1, stored_pattern.shape[2]))).reshape(shape=stored_pattern.shape)
+
+ # Optionally apply state pattern normalization.
+ if self.norm_state_pattern is not None:
+ state_pattern = self.norm_state_pattern(input=state_pattern.reshape(
+ shape=(-1, state_pattern.shape[2]))).reshape(shape=state_pattern.shape)
+
+ # Optionally apply pattern projection normalization.
+ if self.norm_pattern_projection is not None:
+ pattern_projection = self.norm_pattern_projection(input=pattern_projection.reshape(
+ shape=(-1, pattern_projection.shape[2]))).reshape(shape=pattern_projection.shape)
+
+ # Apply Hopfield association and optional activation function.
+ return self.association_core(
+ query=state_pattern, key=stored_pattern, value=pattern_projection,
+ key_padding_mask=stored_pattern_padding_mask, need_weights=False, attn_mask=association_mask,
+ scaling=self.__scaling, update_steps_max=self.__update_steps_max, update_steps_eps=self.__update_steps_eps,
+ return_raw_associations=return_raw_associations, return_pattern_projections=return_projected_patterns)
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield association on specified data.
+
+ :param input: data to be processed by Hopfield association module
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-processed input data
+ """
+ association_output = self._maybe_transpose(self._associate(
+ data=input, return_raw_associations=False,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[0])
+ if self.association_activation is not None:
+ association_output = self.association_activation(association_output)
+ return association_output
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_raw_associations=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[2]
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self._associate(
+ data=input, return_projected_patterns=True,
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)[3]
+
+ @property
+ def batch_first(self) -> bool:
+ return self.__batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.__scaling.clone() if type(self.__scaling) == Tensor else self.__scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.association_core.kdim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.association_core.embed_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.association_core.vdim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.state_pattern_dim
+
+ @property
+ def hidden_size(self) -> Optional[int]:
+ return self.association_core.head_dim
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.association_core.out_dim
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.association_core.pattern_dim
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.__update_steps_max.clone() if type(self.__update_steps_max) == Tensor else self.__update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.__update_steps_eps.clone() if type(self.__update_steps_eps) == Tensor else self.__update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.association_core.key_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.association_core.query_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.association_core.value_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.norm_stored_pattern is not None
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.normalize_stored_pattern and self.norm_stored_pattern.elementwise_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.norm_state_pattern is not None
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.normalize_state_pattern and self.norm_state_pattern.elementwise_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.norm_pattern_projection is not None
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.normalize_pattern_projection and self.norm_pattern_projection.elementwise_affine
+
+ @property
+ def normalize_hopfield_space(self) -> bool:
+ return self.hopfield.normalize_hopfield_space
+
+ @property
+ def normalize_hopfield_space_affine(self) -> bool:
+ return self.hopfield.normalize_hopfield_space_affine
+
+
+class HopfieldPooling(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed state pattern and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based pooling layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of state patterns
+ :param trainable: state pattern used for pooling is trainable
+ """
+ super(HopfieldPooling, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ pooling_weight_size = self.hopfield.hidden_size if state_pattern_as_static else self.hopfield.input_size
+ self.pooling_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if pooling_weight_size is None else pooling_weight_size)), requires_grad=trainable)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset pooling weights and underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise pooling weights.
+ nn.init.normal_(self.pooling_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Union[Tensor, Tuple[Tensor, Tensor]]) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ assert (type(input) == Tensor) or ((type(input) == tuple) and (len(input) == 2)), \
+ r'either one tensor to be used as "stored pattern" and' \
+ r' "pattern_projection" must be provided, or two separate ones.'
+ if type(input) == Tensor:
+ stored_pattern, pattern_projection = input, input
+ else:
+ stored_pattern, pattern_projection = input
+
+ batch_size = stored_pattern.shape[0 if self.batch_first else 1]
+ return stored_pattern, self.pooling_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.pooling_weights.shape[2])), pattern_projection
+
+ def forward(self, input: Union[Tensor, Tuple[Tensor, Tensor]], stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based pooling on specified data.
+
+ :param input: data to be pooled
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: Hopfield-pooled input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask).flatten(start_dim=1)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for pooling gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
+
+
+class HopfieldLayer(Module):
+ """
+ Wrapper class encapsulating a trainable but fixed stored pattern, pattern projection and "Hopfield" in
+ one combined module to be used as a Hopfield-based pooling layer.
+ """
+
+ def __init__(self,
+ input_size: int,
+ hidden_size: Optional[int] = None,
+ output_size: Optional[int] = None,
+ pattern_size: Optional[int] = None,
+ num_heads: int = 1,
+ scaling: Optional[Union[float, Tensor]] = None,
+ update_steps_max: Optional[Union[int, Tensor]] = 0,
+ update_steps_eps: Union[float, Tensor] = 1e-4,
+ lookup_weights_as_separated: bool = False,
+ lookup_targets_as_trainable: bool = True,
+
+ normalize_stored_pattern: bool = True,
+ normalize_stored_pattern_affine: bool = True,
+ normalize_state_pattern: bool = True,
+ normalize_state_pattern_affine: bool = True,
+ normalize_pattern_projection: bool = True,
+ normalize_pattern_projection_affine: bool = True,
+ normalize_hopfield_space: bool = False,
+ normalize_hopfield_space_affine: bool = False,
+ stored_pattern_as_static: bool = False,
+ state_pattern_as_static: bool = False,
+ pattern_projection_as_static: bool = False,
+ pattern_projection_as_connected: bool = False,
+ stored_pattern_size: Optional[int] = None,
+ pattern_projection_size: Optional[int] = None,
+
+ batch_first: bool = True,
+ association_activation: Optional[str] = None,
+ dropout: float = 0.0,
+ input_bias: bool = True,
+ concat_bias_pattern: bool = False,
+ add_zero_association: bool = False,
+ disable_out_projection: bool = False,
+ quantity: int = 1,
+ trainable: bool = True
+ ):
+ """
+ Initialise a new instance of a Hopfield-based lookup layer.
+
+ :param input_size: depth of the input (state pattern)
+ :param hidden_size: depth of the association space
+ :param output_size: depth of the output projection
+ :param pattern_size: depth of patterns to be selected
+ :param num_heads: amount of parallel association heads
+ :param scaling: scaling of association heads, often represented as beta (one entry per head)
+ :param update_steps_max: maximum count of association update steps (None equals to infinity)
+ :param update_steps_eps: minimum difference threshold between two consecutive association update steps
+ :param lookup_weights_as_separated: separate lookup weights from lookup target weights
+ :param lookup_targets_as_trainable: employ trainable lookup target weights (used as pattern projection input)
+ :param normalize_stored_pattern: apply normalization on stored patterns
+ :param normalize_stored_pattern_affine: additionally enable affine normalization of stored patterns
+ :param normalize_state_pattern: apply normalization on state patterns
+ :param normalize_state_pattern_affine: additionally enable affine normalization of state patterns
+ :param normalize_pattern_projection: apply normalization on the pattern projection
+ :param normalize_pattern_projection_affine: additionally enable affine normalization of pattern projection
+ :param normalize_hopfield_space: enable normalization of patterns in the Hopfield space
+ :param normalize_hopfield_space_affine: additionally enable affine normalization of patterns in Hopfield space
+ :param stored_pattern_as_static: interpret specified stored patterns as being static
+ :param state_pattern_as_static: interpret specified state patterns as being static
+ :param pattern_projection_as_static: interpret specified pattern projections as being static
+ :param pattern_projection_as_connected: connect pattern projection with stored pattern
+ :param stored_pattern_size: depth of input (stored pattern)
+ :param pattern_projection_size: depth of input (pattern projection)
+ :param batch_first: flag for specifying if the first dimension of data fed to "forward" reflects the batch size
+ :param association_activation: additional activation to be applied on the result of the Hopfield association
+ :param dropout: dropout probability applied on the association matrix
+ :param input_bias: bias to be added to input (state and stored pattern as well as pattern projection)
+ :param concat_bias_pattern: bias to be concatenated to stored pattern as well as pattern projection
+ :param add_zero_association: add a new batch of zeros to stored pattern as well as pattern projection
+ :param disable_out_projection: disable output projection
+ :param quantity: amount of stored patterns
+ :param trainable: stored pattern used for lookup is trainable
+ """
+ super(HopfieldLayer, self).__init__()
+ self.hopfield = Hopfield(
+ input_size=input_size, hidden_size=hidden_size, output_size=output_size, pattern_size=pattern_size,
+ num_heads=num_heads, scaling=scaling, update_steps_max=update_steps_max, update_steps_eps=update_steps_eps,
+ normalize_stored_pattern=normalize_stored_pattern,
+ normalize_stored_pattern_affine=normalize_stored_pattern_affine,
+ normalize_state_pattern=normalize_state_pattern,
+ normalize_state_pattern_affine=normalize_state_pattern_affine,
+ normalize_pattern_projection=normalize_pattern_projection,
+ normalize_pattern_projection_affine=normalize_pattern_projection_affine,
+ normalize_hopfield_space=normalize_hopfield_space,
+ normalize_hopfield_space_affine=normalize_hopfield_space_affine,
+ stored_pattern_as_static=stored_pattern_as_static, state_pattern_as_static=state_pattern_as_static,
+ pattern_projection_as_static=pattern_projection_as_static,
+ pattern_projection_as_connected=pattern_projection_as_connected, stored_pattern_size=stored_pattern_size,
+ pattern_projection_size=pattern_projection_size, batch_first=batch_first,
+ association_activation=association_activation, dropout=dropout, input_bias=input_bias,
+ concat_bias_pattern=concat_bias_pattern, add_zero_association=add_zero_association,
+ disable_out_projection=disable_out_projection)
+ self._quantity = quantity
+ lookup_weight_size = self.hopfield.hidden_size if stored_pattern_as_static else self.hopfield.stored_pattern_dim
+ self.lookup_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), input_size if lookup_weight_size is None else lookup_weight_size)), requires_grad=trainable)
+
+ if lookup_weights_as_separated:
+ target_weight_size = self.lookup_weights.shape[
+ 2] if pattern_projection_size is None else pattern_projection_size
+ self.target_weights = nn.Parameter(torch.empty(size=(*(
+ (1, quantity) if batch_first else (quantity, 1)
+ ), target_weight_size)), requires_grad=lookup_targets_as_trainable)
+ else:
+ self.register_parameter(name=r'target_weights', param=None)
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset lookup and lookup target weights, including underlying Hopfield association.
+
+ :return: None
+ """
+ if hasattr(self.hopfield, r'reset_parameters'):
+ self.hopfield.reset_parameters()
+
+ # Explicitly initialise lookup and target weights.
+ nn.init.normal_(self.lookup_weights, mean=0.0, std=0.02)
+ if self.target_weights is not None:
+ nn.init.normal_(self.target_weights, mean=0.0, std=0.02)
+
+ def _prepare_input(self, input: Tensor) -> Tuple[Tensor, Tensor, Tensor]:
+ """
+ Prepare input for Hopfield association.
+
+ :param input: data to be prepared
+ :return: stored pattern, expanded state pattern as well as pattern projection
+ """
+ batch_size = input.shape[0 if self.batch_first else 1]
+ stored_pattern = self.lookup_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.lookup_weights.shape[2]))
+ if self.target_weights is None:
+ pattern_projection = stored_pattern
+ else:
+ pattern_projection = self.target_weights.expand(size=(*(
+ (batch_size, self.quantity) if self.batch_first else (self.quantity, batch_size)
+ ), self.target_weights.shape[2]))
+
+ return stored_pattern, input, pattern_projection
+
+ def forward(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Compute Hopfield-based lookup on specified data.
+
+ :param input: data to used in lookup
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: result of Hopfield-based lookup on input data
+ """
+ return self.hopfield(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_association_matrix(self, input: Tensor, stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield association matrix used for lookup gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: association matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_association_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ def get_projected_pattern_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor]],
+ stored_pattern_padding_mask: Optional[Tensor] = None,
+ association_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Fetch Hopfield projected pattern matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :param stored_pattern_padding_mask: mask to be applied on stored patterns
+ :param association_mask: mask to be applied on inner association matrix
+ :return: pattern projection matrix as computed by the Hopfield core module
+ """
+ with torch.no_grad():
+ return self.hopfield.get_projected_pattern_matrix(
+ input=self._prepare_input(input=input),
+ stored_pattern_padding_mask=stored_pattern_padding_mask,
+ association_mask=association_mask)
+
+ @property
+ def batch_first(self) -> bool:
+ return self.hopfield.batch_first
+
+ @property
+ def scaling(self) -> Union[float, Tensor]:
+ return self.hopfield.scaling
+
+ @property
+ def stored_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.stored_pattern_dim
+
+ @property
+ def state_pattern_dim(self) -> Optional[int]:
+ return self.hopfield.state_pattern_dim
+
+ @property
+ def pattern_projection_dim(self) -> Optional[int]:
+ return self.hopfield.pattern_projection_dim
+
+ @property
+ def input_size(self) -> Optional[int]:
+ return self.hopfield.input_size
+
+ @property
+ def hidden_size(self) -> int:
+ return self.hopfield.hidden_size
+
+ @property
+ def output_size(self) -> Optional[int]:
+ return self.hopfield.output_size
+
+ @property
+ def pattern_size(self) -> Optional[int]:
+ return self.hopfield.pattern_size
+
+ @property
+ def quantity(self) -> int:
+ return self._quantity
+
+ @property
+ def update_steps_max(self) -> Optional[Union[int, Tensor]]:
+ return self.hopfield.update_steps_max
+
+ @property
+ def update_steps_eps(self) -> Optional[Union[float, Tensor]]:
+ return self.hopfield.update_steps_eps
+
+ @property
+ def stored_pattern_as_static(self) -> bool:
+ return self.hopfield.stored_pattern_as_static
+
+ @property
+ def state_pattern_as_static(self) -> bool:
+ return self.hopfield.state_pattern_as_static
+
+ @property
+ def pattern_projection_as_static(self) -> bool:
+ return self.hopfield.pattern_projection_as_static
+
+ @property
+ def normalize_stored_pattern(self) -> bool:
+ return self.hopfield.normalize_stored_pattern
+
+ @property
+ def normalize_stored_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_stored_pattern_affine
+
+ @property
+ def normalize_state_pattern(self) -> bool:
+ return self.hopfield.normalize_state_pattern
+
+ @property
+ def normalize_state_pattern_affine(self) -> bool:
+ return self.hopfield.normalize_state_pattern_affine
+
+ @property
+ def normalize_pattern_projection(self) -> bool:
+ return self.hopfield.normalize_pattern_projection
+
+ @property
+ def normalize_pattern_projection_affine(self) -> bool:
+ return self.hopfield.normalize_pattern_projection_affine
diff --git a/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-37.pyc b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fbd9b3c90d8ce62bd7a17c050da6cff3fd01e226
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-38.pyc b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..95278bbf7a3923658822391d5b1433e5b750c165
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-38.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-39.pyc b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dadf35bb102978b133cf39fc9c256dd53730aecf
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/__init__.cpython-39.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-37.pyc b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..30ba1f5f8709e4c6910d179dbbba71bc629b944e
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-37.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-38.pyc b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..546029f7a27cdd97a69876aeb23f5e28942e5dc4
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-38.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-39.pyc b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bb910f32c6ced43766d7117d2afe7d9b84114ed3
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/activation.cpython-39.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-37.pyc b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6924f592598e3b8e995d8cdd7144a4680c4e4265
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-37.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-38.pyc b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-38.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..4a7bd2c4087f0d9f0208d51fe8fa0f65639d4fe1
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-38.pyc differ
diff --git a/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-39.pyc b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ef4132b40a9aacc1917b88569c6fe57bd96ed805
Binary files /dev/null and b/src/mhnfs/hopfield/modules/__pycache__/functional.cpython-39.pyc differ
diff --git a/src/mhnfs/hopfield/modules/activation.py b/src/mhnfs/hopfield/modules/activation.py
new file mode 100644
index 0000000000000000000000000000000000000000..a84b44154be6f4fbbcf275166d5e470a1e2c0f90
--- /dev/null
+++ b/src/mhnfs/hopfield/modules/activation.py
@@ -0,0 +1,449 @@
+import torch
+import torch.nn as nn
+
+from torch import Tensor
+from torch.nn import Linear, Module, Parameter
+from typing import Optional
+
+from .functional import hopfield_core_forward
+
+try:
+ from torch.nn.modules.linear import _LinearWithBias
+except ImportError:
+ _LinearWithBias = None
+
+
+class HopfieldCore(Module):
+ """Allows the model to jointly attend to information
+ from different representation subspaces.
+ See references: "Hopfield Networks is All You Need" and
+ "Attention Is All You Need" (on which this implementation is partly based on).
+
+ .. math::
+ \text{HopfieldHead}(Q, K, V) = \text{Concat}(head_1,\dots,head_h)W^O
+ \text{where} head_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)
+
+ Args:
+ embed_dim: total dimension of the model.
+ num_heads: parallel attention heads.
+ dropout: a Dropout layer on attn_output_weights. Default: 0.0.
+ bias: add bias as module parameter. Default: True.
+ add_bias_kv: add bias to the key and value sequences at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ kdim: total number of features in key. Default: None.
+ vdim: total number of features in value. Default: None.
+
+ Note: if kdim and vdim are None, they will be set to embed_dim such that
+ query, key, and value have the same number of features.
+
+ Examples::
+
+ >>> hopfield_attn = HopfieldCore(embed_dim, num_heads)
+ >>> attn_output, attn_output_weights, attn_matrix = hopfield_attn(query, key, value)
+ """
+
+ __annotations__ = {
+ "bias_k": torch._jit_internal.Optional[torch.Tensor],
+ "bias_v": torch._jit_internal.Optional[torch.Tensor],
+ }
+
+ def __init__(
+ self,
+ embed_dim=None, # type: Optional[int]
+ num_heads=1, # type: int
+ dropout=0.0, # type: float
+ bias=True, # type: bool
+ add_bias_kv=False, # type: bool
+ add_zero_attn=False, # type: bool
+ kdim=None, # type: Optional[int]
+ vdim=None, # type: Optional[int]
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ out_dim=None, # type: Optional[int]
+ disable_out_projection=False, # type: bool
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ normalize_pattern_affine=False, # type: bool
+ ):
+ super(HopfieldCore, self).__init__()
+
+ assert (
+ (type(key_as_static) == bool)
+ and (type(query_as_static) == bool)
+ and (type(value_as_static) == bool)
+ )
+ self.key_as_static, self.query_as_static, self.value_as_static = (
+ key_as_static,
+ query_as_static,
+ value_as_static,
+ )
+ num_non_static = 3 - (
+ self.key_as_static + self.query_as_static + self.value_as_static
+ )
+ assert 0 <= num_non_static < 4
+
+ self.value_as_connected = value_as_connected
+ self.normalize_pattern, self.normalize_pattern_affine = (
+ normalize_pattern,
+ normalize_pattern_affine,
+ )
+ self.disable_out_projection = disable_out_projection
+
+ # In case of a static-only executions, check corresponding projections and normalizations.
+ self.static_execution = self._check_execution_mode()
+ if self.static_execution:
+ embed_dim, kdim, vdim = None, None, None
+ if embed_dim is None:
+ assert (
+ self.static_execution
+ ), r"static-only execution requires all projections to be deactivated."
+
+ # Check and set all other properties, conditioned on .
+ self.embed_dim = embed_dim
+ self.kdim = kdim if kdim is not None else embed_dim
+ self.vdim = vdim if vdim is not None else embed_dim
+ self._qkv_same_embed_dim = all(
+ (
+ self.kdim == embed_dim,
+ self.vdim == embed_dim,
+ pattern_dim is None,
+ not self.value_as_connected,
+ )
+ )
+ assert (not self.value_as_connected) or (
+ self.kdim == self.vdim
+ ), r"key and value need to be of same dimension."
+
+ self.num_heads = num_heads
+ self.dropout = dropout
+ self.head_dim = None
+ self.pattern_dim = pattern_dim
+ self.virtual_hopfield_dim = None
+ self.virtual_pattern_dim = None
+ if not self.static_execution:
+ if head_dim is None:
+ self.head_dim = embed_dim // num_heads
+ assert (
+ self.head_dim * num_heads == self.embed_dim
+ ), "embed_dim must be divisible by num_heads."
+ else:
+ assert (
+ head_dim > 0
+ ), "dimension of the association space has to be positive."
+ self.head_dim = head_dim
+ if self.pattern_dim is None:
+ self.pattern_dim = self.head_dim
+ self.virtual_hopfield_dim = self.num_heads * self.head_dim
+ self.virtual_pattern_dim = self.num_heads * self.pattern_dim
+
+ self.out_dim = embed_dim if out_dim is None else out_dim
+ assert disable_out_projection or (
+ self.out_dim > 0
+ ), "output projection dimension has to be positive."
+
+ if normalize_pattern_affine:
+ assert (
+ normalize_pattern
+ ), "affine pattern normalization without pattern normalization has no effect."
+ self.p_norm_weight = Parameter(torch.Tensor(head_dim))
+ self.p_norm_bias = Parameter(torch.Tensor(head_dim))
+ else:
+ self.register_parameter("p_norm_weight", None)
+ self.register_parameter("p_norm_bias", None)
+
+ if self._qkv_same_embed_dim is False:
+ if query_as_static:
+ self.register_parameter("q_proj_weight", None)
+ else:
+ self.q_proj_weight = Parameter(
+ torch.Tensor(self.virtual_hopfield_dim, embed_dim)
+ )
+ if key_as_static:
+ self.register_parameter("k_proj_weight", None)
+ else:
+ self.k_proj_weight = Parameter(
+ torch.Tensor(self.virtual_hopfield_dim, self.kdim)
+ )
+ if value_as_static:
+ self.register_parameter("v_proj_weight", None)
+ else:
+ self.v_proj_weight = Parameter(
+ torch.Tensor(
+ self.virtual_pattern_dim,
+ self.virtual_hopfield_dim
+ if (value_as_connected and not key_as_static)
+ else self.vdim,
+ )
+ )
+ self.register_parameter("in_proj_weight", None)
+ else:
+ if num_non_static > 0:
+ self.in_proj_weight = Parameter(
+ torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim
+ + (not key_as_static) * self.virtual_hopfield_dim
+ + (not value_as_static) * self.virtual_pattern_dim,
+ embed_dim,
+ )
+ )
+ else:
+ self.register_parameter("in_proj_weight", None)
+ self.register_parameter("q_proj_weight", None)
+ self.register_parameter("k_proj_weight", None)
+ self.register_parameter("v_proj_weight", None)
+
+ if bias and (num_non_static > 0):
+ self.in_proj_bias = Parameter(
+ torch.empty(
+ (not query_as_static) * self.virtual_hopfield_dim
+ + (not key_as_static) * self.virtual_hopfield_dim
+ + self.virtual_pattern_dim
+ )
+ )
+ else:
+ self.register_parameter("in_proj_bias", None)
+ if disable_out_projection:
+ self.register_parameter("out_proj", None)
+ else:
+ if bias and _LinearWithBias is not None:
+ self.out_proj = _LinearWithBias(self.virtual_pattern_dim, self.out_dim)
+ else:
+ self.out_proj = Linear(
+ self.virtual_pattern_dim, self.out_dim, bias=bias
+ )
+
+ self.bias_k, self.bias_v = None, None
+ if add_bias_kv:
+ if not key_as_static:
+ self.bias_k = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ if not value_as_static:
+ self.bias_v = Parameter(torch.empty(1, 1, self.virtual_hopfield_dim))
+ assert not (
+ self.bias_k is None and self.bias_v is None
+ ), r"cannot set key/value bias if both are static."
+
+ self.add_zero_attn = add_zero_attn
+ self.reset_parameters()
+
+ def _check_execution_mode(self) -> bool:
+ return all(
+ (
+ self.key_as_static,
+ self.query_as_static,
+ self.value_as_static,
+ not self.value_as_connected,
+ not self.normalize_pattern,
+ not self.normalize_pattern_affine,
+ self.disable_out_projection,
+ )
+ )
+
+ def reset_parameters(self):
+ if self.p_norm_weight is not None:
+ nn.init.ones_(self.p_norm_weight)
+ nn.init.zeros_(self.p_norm_bias)
+
+ if self._qkv_same_embed_dim and (self.in_proj_weight is not None):
+ nn.init.normal_(self.in_proj_weight, mean=0.0, std=0.02)
+ else:
+ if self.q_proj_weight is not None:
+ nn.init.normal_(self.q_proj_weight, mean=0.0, std=0.02)
+ if self.k_proj_weight is not None:
+ nn.init.normal_(self.k_proj_weight, mean=0.0, std=0.02)
+ if self.v_proj_weight is not None:
+ nn.init.normal_(self.v_proj_weight, mean=0.0, std=0.02)
+
+ if self.in_proj_bias is not None:
+ nn.init.constant_(self.in_proj_bias, 0.0)
+ if not self.disable_out_projection:
+ nn.init.normal_(self.out_proj.weight, mean=0.0, std=0.02)
+ if self.out_proj.bias is not None:
+ nn.init.constant_(self.out_proj.bias, 0.0)
+ if self.bias_k is not None:
+ nn.init.normal_(self.bias_k, mean=0.0, std=0.02)
+ if self.bias_v is not None:
+ nn.init.normal_(self.bias_v, mean=0.0, std=0.02)
+
+ def __setstate__(self, state):
+ super(HopfieldCore, self).__setstate__(state)
+
+ def forward(
+ self,
+ query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+ scaling=None, # type: Optional[Tensor]
+ update_steps_max=0, # type: Optional[int]
+ update_steps_eps=1e-4, # type: float
+ return_raw_associations=False, # type: bool
+ return_pattern_projections=False, # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor], Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. When given a binary mask and a value is True,
+ the corresponding value on the attention layer will be ignored. When given
+ a byte mask and a value is non-zero, the corresponding value on the attention
+ layer will be ignored.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_pattern_projections: return pattern projection values, unmodified.
+
+ Shape:
+ - Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the position
+ with the zero positions will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensure that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ is not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ - Outputs:
+ - attn_output: :math:`(L, N, E)` where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)` where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if self.query_as_static and self.key_as_static:
+ assert (
+ query.shape[2] == key.shape[2]
+ ), f"query shape[2] of {query.shape[2]} and key shape[2] of {key.shape[2]} need to be equal"
+ head_dim, embed_dim_to_check = query.shape[2], query.shape[2]
+ else:
+ assert self.query_as_static or (
+ query.shape[2] == self.embed_dim
+ ), f"query shape[2] of {query.shape[2]} invalid, needs to be {self.embed_dim}."
+ assert (not self.query_as_static) or (
+ self.query_as_static and query.shape[2] == self.head_dim
+ ), f"query shape[2] of {query.shape[2]} invalid, needs to be {self.head_dim}"
+
+ assert self.key_as_static or (
+ key.shape[2] == self.kdim
+ ), f"key shape[2] of {key.shape[2]} invalid, needs to be {self.kdim}."
+ assert (not self.key_as_static) or (
+ self.key_as_static and key.shape[2] == self.head_dim
+ ), f"key shape[2] of {key.shape[2]} invalid, needs to be {self.head_dim}"
+ head_dim, embed_dim_to_check = (
+ self.head_dim,
+ self.head_dim if self.query_as_static else self.embed_dim,
+ )
+
+ assert self.value_as_static or (
+ value.shape[2] == self.vdim
+ ), f"value shape[2] of {value.shape[2]} invalid, needs to be {self.vdim}."
+ assert any(
+ (
+ not self.value_as_static,
+ self.value_as_static and value.shape[2] == self.pattern_dim,
+ self.disable_out_projection,
+ )
+ ), f"value shape[2] of {value.shape[2]} invalid, needs to be {self.pattern_dim}"
+
+ out_weights, out_bias = None, None
+ if not self.disable_out_projection:
+ out_weights, out_bias = self.out_proj.weight, self.out_proj.bias
+
+ if not self._qkv_same_embed_dim:
+ return hopfield_core_forward(
+ query=query,
+ key=key,
+ value=value,
+ embed_dim_to_check=embed_dim_to_check,
+ num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight,
+ in_proj_bias=self.in_proj_bias,
+ bias_k=self.bias_k,
+ bias_v=self.bias_v,
+ add_zero_attn=self.add_zero_attn,
+ dropout_p=self.dropout,
+ out_proj_weight=out_weights,
+ out_proj_bias=out_bias,
+ training=self.training,
+ key_padding_mask=key_padding_mask,
+ need_weights=need_weights,
+ attn_mask=attn_mask,
+ use_separate_proj_weight=True,
+ q_proj_weight=self.q_proj_weight,
+ k_proj_weight=self.k_proj_weight,
+ v_proj_weight=self.v_proj_weight,
+ key_as_static=self.key_as_static,
+ query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static,
+ value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight,
+ p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim,
+ pattern_dim=self.pattern_dim,
+ scaling=scaling,
+ update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations,
+ return_projected_patterns=return_pattern_projections,
+ )
+ else:
+ return hopfield_core_forward(
+ query=query,
+ key=key,
+ value=value,
+ embed_dim_to_check=embed_dim_to_check,
+ num_heads=self.num_heads,
+ in_proj_weight=self.in_proj_weight,
+ in_proj_bias=self.in_proj_bias,
+ bias_k=self.bias_k,
+ bias_v=self.bias_v,
+ add_zero_attn=self.add_zero_attn,
+ dropout_p=self.dropout,
+ out_proj_weight=out_weights,
+ out_proj_bias=out_bias,
+ training=self.training,
+ key_padding_mask=key_padding_mask,
+ need_weights=need_weights,
+ attn_mask=attn_mask,
+ key_as_static=self.key_as_static,
+ query_as_static=self.query_as_static,
+ value_as_static=self.value_as_static,
+ value_as_connected=self.value_as_connected,
+ normalize_pattern=self.normalize_pattern,
+ p_norm_weight=self.p_norm_weight,
+ p_norm_bias=self.p_norm_bias,
+ head_dim=head_dim,
+ pattern_dim=self.pattern_dim,
+ scaling=scaling,
+ update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps,
+ return_raw_associations=return_raw_associations,
+ return_projected_patterns=return_pattern_projections,
+ )
diff --git a/src/mhnfs/hopfield/modules/functional.py b/src/mhnfs/hopfield/modules/functional.py
new file mode 100644
index 0000000000000000000000000000000000000000..b3d429c272d3c06c0d96d72b084d7756a119de6c
--- /dev/null
+++ b/src/mhnfs/hopfield/modules/functional.py
@@ -0,0 +1,450 @@
+import torch
+import torch.nn as nn
+
+from torch import Tensor
+from typing import Optional, Tuple, Union
+
+
+def hopfield_core_forward(query, # type: Tensor
+ key, # type: Tensor
+ value, # type: Tensor
+ embed_dim_to_check, # type: int
+ num_heads, # type: int
+ in_proj_weight, # type: Optional[Tensor]
+ in_proj_bias, # type: Optional[Tensor]
+ bias_k, # type: Optional[Tensor]
+ bias_v, # type: Optional[Tensor]
+ add_zero_attn, # type: bool
+ dropout_p, # type: float
+ out_proj_weight, # type: Tensor
+ out_proj_bias, # type: Tensor
+ training=True, # type: bool
+ key_padding_mask=None, # type: Optional[Tensor]
+ need_weights=True, # type: bool
+ attn_mask=None, # type: Optional[Tensor]
+ use_separate_proj_weight=False, # type: bool
+ q_proj_weight=None, # type: Optional[Tensor]
+ k_proj_weight=None, # type: Optional[Tensor]
+ v_proj_weight=None, # type: Optional[Tensor]
+ static_k=None, # type: Optional[Tensor]
+ static_v=None, # type: Optional[Tensor]
+
+ key_as_static=False, # type: bool
+ query_as_static=False, # type: bool
+ value_as_static=False, # type: bool
+ value_as_connected=False, # type: bool
+ normalize_pattern=False, # type: bool
+ p_norm_weight=None, # type: Optional[Tensor]
+ p_norm_bias=None, # type: Optional[Tensor]
+ head_dim=None, # type: Optional[int]
+ pattern_dim=None, # type: Optional[int]
+ scaling=None, # type: Optional[Union[float, Tensor]]
+ update_steps_max=0, # type: Optional[Union[int, Tensor]]
+ update_steps_eps=1e-4, # type: Union[float, Tensor]
+ return_raw_associations=False, # type: bool
+ return_projected_patterns=False # type: bool
+ ):
+ # type: (...) -> Tuple[Tensor, Optional[Tensor]]
+ r"""
+ Args:
+ query, key, value: map a query and a set of key-value pairs to an output.
+ See "Attention Is All You Need" for more details.
+ See "Hopfield Networks is All You Need" for more details in the setting of Hopfield networks.
+ embed_dim_to_check: total dimension of the model (in case of default head dimension).
+ num_heads: parallel attention heads.
+ in_proj_weight, in_proj_bias: input projection weight and bias.
+ bias_k, bias_v: bias of the key and value sequences to be added at dim=0.
+ add_zero_attn: add a new batch of zeros to the key and
+ value sequences at dim=1.
+ dropout_p: probability of an element to be zeroed.
+ out_proj_weight, out_proj_bias: the output projection weight and bias.
+ training: apply dropout if is ``True``.
+ key_padding_mask: if provided, specified padding elements in the key will
+ be ignored by the attention. This is an binary mask. When the value is True,
+ the corresponding value on the attention layer will be filled with -inf.
+ need_weights: output attn_output_weights.
+ attn_mask: 2D or 3D mask that prevents attention to certain positions. A 2D mask will be broadcasted for all
+ the batches while a 3D mask allows to specify a different mask for the entries of each batch.
+ use_separate_proj_weight: the function accept the proj. weights for query, key,
+ and value in different forms. If false, in_proj_weight will be used, which is
+ a combination of q_proj_weight, k_proj_weight, v_proj_weight.
+ q_proj_weight, k_proj_weight, v_proj_weight, in_proj_bias: input projection weight and bias.
+ static_k, static_v: static key and value used for attention operators.
+
+ key_as_static: interpret specified key as being static.
+ query_as_static: interpret specified key as being static.
+ value_as_static: interpret specified key as being static.
+ value_as_connected: connect value projection with key projection.
+ normalize_pattern: enable normalization of patterns.
+ p_norm_weight, p_norm_bias: pattern normalization weight and bias.
+ head_dim: dimensionality of each head.
+ pattern_dim: dimensionality of each projected value input.
+ scaling: scaling of association heads, often represented as beta (one entry per head).
+ update_steps_max: maximum count of association update steps (None equals to infinity).
+ update_steps_eps: minimum difference threshold between two consecutive association update steps.
+ return_raw_associations: return raw association (softmax) values, unmodified.
+ return_projected_patterns: return pattern projection values, unmodified.
+
+ Shape:
+ Inputs:
+ - query: :math:`(L, N, E)` where L is the target sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key: :math:`(S, N, E)`, where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - value: :math:`(S, N, E)` where S is the source sequence length, N is the batch size, E is
+ the embedding dimension.
+ - key_padding_mask: :math:`(N, S)` where N is the batch size, S is the source sequence length.
+ If a ByteTensor is provided, the non-zero positions will be ignored while the zero positions
+ will be unchanged. If a BoolTensor is provided, the positions with the
+ value of ``True`` will be ignored while the position with the value of ``False`` will be unchanged.
+ - attn_mask: 2D mask :math:`(L, S)` where L is the target sequence length, S is the source sequence length.
+ 3D mask :math:`(N*num_heads, L, S)` where N is the batch size, L is the target sequence length,
+ S is the source sequence length. attn_mask ensures that position i is allowed to attend the unmasked
+ positions. If a ByteTensor is provided, the non-zero positions are not allowed to attend
+ while the zero positions will be unchanged. If a BoolTensor is provided, positions with ``True``
+ are not allowed to attend while ``False`` values will be unchanged. If a FloatTensor
+ is provided, it will be added to the attention weight.
+ - static_k: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+ - static_v: :math:`(N*num_heads, S, head_dim)`, where S is the source sequence length, N is the batch size.
+
+ - scaling: :math:`(num_heads,)`, where num_heads is the amount of heads.
+
+ Outputs:
+ - attn_output: :math:`(L, N, E)`, where L is the target sequence length, N is the batch size,
+ E is the embedding dimension.
+ - attn_output_weights: :math:`(N, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ - attn_raw: :math:``(N, num_heads, L, S)`, where N is the batch size,
+ L is the target sequence length, S is the source sequence length.
+ """
+ if not torch.jit.is_scripting():
+ tens_ops = (query, key, value, in_proj_weight, in_proj_bias, bias_k, bias_v,
+ out_proj_weight, out_proj_bias)
+ if any([type(t) is not Tensor for t in tens_ops]) and nn.functional.has_torch_function(tens_ops):
+ return nn.functional.handle_torch_function(
+ hopfield_core_forward, tens_ops, query, key, value,
+ embed_dim_to_check, num_heads, in_proj_weight, in_proj_bias,
+ bias_k, bias_v, add_zero_attn, dropout_p, out_proj_weight,
+ out_proj_bias, training=training, key_padding_mask=key_padding_mask,
+ need_weights=need_weights, attn_mask=attn_mask,
+ use_separate_proj_weight=use_separate_proj_weight,
+ q_proj_weight=q_proj_weight, k_proj_weight=k_proj_weight,
+ v_proj_weight=v_proj_weight, static_k=static_k, static_v=static_v,
+ key_as_static=key_as_static, query_as_static=query_as_static,
+ value_as_static=value_as_static, value_as_connected=value_as_connected,
+ normalize_pattern=normalize_pattern, p_norm_weight=p_norm_weight, p_norm_bias=p_norm_bias,
+ head_dim=head_dim, pattern_dim=pattern_dim, scaling=scaling, update_steps_max=update_steps_max,
+ update_steps_eps=update_steps_eps, return_raw_associations=return_raw_associations)
+ tgt_len, bsz, embed_dim = query.shape[0], value.shape[1], query.shape[2]
+ assert embed_dim == embed_dim_to_check
+ # allow MHA to have different sizes for the feature dimension
+ assert key.size(0) == value.size(0) and key.size(1) == value.size(1)
+
+ assert (scaling is None) or (type(scaling) in (float, torch.Tensor))
+ if type(scaling) == torch.Tensor:
+ assert scaling.ndimension() == 1 and scaling.shape[0] == num_heads, "only one entry per head."
+
+ assert (update_steps_max is None) or (type(update_steps_max) in (int, torch.Tensor))
+ if type(update_steps_max) == torch.Tensor:
+ assert update_steps_max.ndimension() == 1 and update_steps_max.shape[0] == num_heads, "only one entry per head."
+ elif type(update_steps_max) == int:
+ update_steps_max = torch.tensor([update_steps_max] * num_heads, dtype=torch.int32, device=query.device)
+ elif update_steps_max is None:
+ update_steps_max = -torch.ones(size=(num_heads,), dtype=torch.int32, device=query.device)
+
+ assert type(update_steps_eps) in (float, torch.Tensor)
+ if type(update_steps_eps) == torch.Tensor:
+ assert update_steps_eps.ndimension() == 1 and update_steps_eps.shape[0] == num_heads, "only one entry per head."
+ assert (update_steps_eps <= 0.0).sum() == 0, "only positive thresholds allowed."
+ update_steps_eps = update_steps_eps.to(device=query.device)
+ elif type(update_steps_eps) == float:
+ assert update_steps_eps > 0, "only positive thresholds allowed."
+ update_steps_eps = torch.tensor([update_steps_eps] * num_heads, dtype=query.dtype, device=query.device)
+
+ # Adapt dimensionality of each each.
+ if head_dim is None:
+ head_dim = embed_dim // num_heads
+ assert head_dim * num_heads == embed_dim, r'embed_dim must be divisible by num_heads.'
+ hopfield_dim = num_heads * head_dim
+
+ # Adapt dimensionality of each value projection.
+ if pattern_dim is None:
+ pattern_dim = head_dim
+ assert (not value_as_connected) or (pattern_dim == head_dim)
+
+ q, k, v, xi, src_len = None, None, None, None, 0
+ update_step, xi_old, xi_difference_norm = 0, None, float(r'+inf')
+ update_active_heads = torch.tensor([[[True]]] * num_heads * bsz, device=query.device)
+ assert update_active_heads.any(), "at least one head needs to be active."
+
+ ####################################################################################################################
+ # BEGIN HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ while update_active_heads.any():
+
+ # The query is already projected into the "Hopfield" space at "update_step" equals 0.
+ # No more projection necessary if "update_step" greater than 0.
+ if update_step == 0:
+ if not use_separate_proj_weight:
+
+ if torch.equal(query, key) and torch.equal(key, value) and not (
+ key_as_static or query_as_static or value_as_static):
+ # self-attention
+ q, k, v = nn.functional.linear(query, in_proj_weight, in_proj_bias).chunk(3, dim=-1)
+
+ elif torch.equal(key, value) and not (key_as_static or value_as_static):
+ # encoder-decoder attention
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start = hopfield_dim
+ _end = None
+
+ if key is None:
+ assert value is None
+ k = None
+ v = None
+ else:
+
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k, v = nn.functional.linear(key, _w, _b).chunk(2, dim=-1)
+
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ q = nn.functional.linear(query, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ k = nn.functional.linear(key, _w, _b)
+ _start += hopfield_dim
+ _end += hopfield_dim
+
+ if value_as_static:
+ v = value.repeat(1, num_heads, 1)
+ else:
+ # This is inline in_proj function with in_proj_weight and in_proj_bias
+ _b = in_proj_bias
+ _w = in_proj_weight[_start:_end, :]
+ if _b is not None:
+ _b = _b[_start:_end]
+ v = nn.functional.linear(value, _w, _b)
+ else:
+ _start, _end = 0, hopfield_dim
+ if query_as_static:
+ q = query.repeat(1, num_heads, 1)
+ else:
+ q_proj_weight_non_opt = torch.jit._unwrap_optional(q_proj_weight)
+ len1, len2 = q_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == query.size(-1)
+ if in_proj_bias is not None:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias[_start:_end])
+ _start += hopfield_dim
+ _end += hopfield_dim
+ else:
+ q = nn.functional.linear(query, q_proj_weight_non_opt, in_proj_bias)
+
+ v = value
+ if key_as_static:
+ k = key.repeat(1, num_heads, 1)
+ else:
+ k_proj_weight_non_opt = torch.jit._unwrap_optional(k_proj_weight)
+ len1, len2 = k_proj_weight_non_opt.size()
+ assert len1 == hopfield_dim and len2 == key.size(-1)
+
+ _bias = None if in_proj_bias is None else in_proj_bias[_start:_end]
+ k = nn.functional.linear(key, k_proj_weight_non_opt, _bias)
+ if value_as_connected:
+ v = nn.functional.linear(v, k_proj_weight_non_opt, _bias)
+ _start += hopfield_dim
+ _end += num_heads * pattern_dim
+
+ if value_as_static:
+ if not (value_as_connected or key_as_static):
+ v = v.repeat(1, num_heads, 1)
+ else:
+ v_proj_weight_non_opt = torch.jit._unwrap_optional(v_proj_weight)
+ len1, len2 = v_proj_weight_non_opt.size()
+ assert len1 == (num_heads * pattern_dim) and len2 == v.size(-1)
+ if in_proj_bias is not None:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias[_start:])
+ else:
+ v = nn.functional.linear(v, v_proj_weight_non_opt, in_proj_bias)
+
+ if attn_mask is not None:
+ assert attn_mask.dtype == torch.float32 or attn_mask.dtype == torch.float64 or \
+ attn_mask.dtype == torch.float16 or attn_mask.dtype == torch.uint8 or \
+ attn_mask.dtype == torch.bool, \
+ 'Only float, byte, and bool types are supported for attn_mask, not {}'.format(attn_mask.dtype)
+ if attn_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for attn_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ attn_mask = attn_mask.to(torch.bool)
+
+ if attn_mask.dim() == 2:
+ attn_mask = attn_mask.unsqueeze(0)
+ if list(attn_mask.size()) != [1, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 2D attn_mask is not correct.')
+ elif attn_mask.dim() == 3:
+ if list(attn_mask.size()) != [bsz * num_heads, query.size(0), key.size(0)]:
+ raise RuntimeError('The size of the 3D attn_mask is not correct.')
+ else:
+ raise RuntimeError("attn_mask's dimension {} is not supported".format(attn_mask.dim()))
+ # attn_mask's dim is 3 now.
+
+ # Optionally normalize patterns.
+ if normalize_pattern:
+ q = torch.nn.functional.layer_norm(
+ input=q.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=q.shape)
+ k = torch.nn.functional.layer_norm(
+ input=k.reshape(shape=(-1, head_dim)), normalized_shape=(head_dim,),
+ weight=p_norm_weight, bias=p_norm_bias).reshape(shape=k.shape)
+
+ else:
+ active_xi = xi.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:]))
+ active_k = k.masked_select(mask=update_active_heads).view(size=(-1, *k.shape[1:]))
+ q = torch.masked_scatter(input=q, mask=update_active_heads, source=torch.bmm(active_xi, active_k))
+
+ # Optionally scale association heads (each head separately).
+ if type(scaling) == float:
+ q = q * scaling
+ elif type(scaling) == torch.Tensor:
+ q = q * scaling.view(1, 1, -1).repeat(repeats=(1, 1, q.shape[2] // scaling.shape[0]))
+
+ if update_step == 0:
+ # convert ByteTensor key_padding_mask to bool
+ if key_padding_mask is not None and key_padding_mask.dtype == torch.uint8:
+ warnings.warn(
+ "Byte tensor for key_padding_mask in nn.HopfieldCore is deprecated. Use bool tensor instead.")
+ key_padding_mask = key_padding_mask.to(torch.bool)
+
+ if bias_k is not None and bias_v is not None:
+ if static_k is None and static_v is None and key_as_static is None and value_as_static is None:
+ k = torch.cat([k, bias_k.repeat(1, bsz, 1)])
+ v = torch.cat([v, bias_v.repeat(1, bsz, 1)])
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+ else:
+ assert static_k is None, "bias cannot be added to static key."
+ assert static_v is None, "bias cannot be added to static value."
+ assert not key_as_static, "bias cannot be added to static key."
+ assert not value_as_static, "bias cannot be added to static value."
+ else:
+ assert bias_k is None
+ assert bias_v is None
+
+ q = q.contiguous().view(tgt_len, -1, head_dim).transpose(0, 1)
+ if k is not None:
+ k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1)
+ if v is not None:
+ v = v.contiguous().view(v.shape[0], bsz * num_heads, -1).transpose(0, 1)
+
+ if static_k is not None:
+ assert static_k.size(0) == bsz * num_heads
+ assert static_k.size(2) == head_dim
+ k = static_k
+
+ if static_v is not None:
+ assert static_v.size(0) == bsz * num_heads
+ assert static_v.size(2) == pattern_dim
+ v = static_v
+
+ src_len = k.size(1)
+
+ if key_padding_mask is not None:
+ assert key_padding_mask.size(0) == bsz
+ assert key_padding_mask.size(1) == src_len
+
+ if add_zero_attn:
+ src_len += 1
+ k = torch.cat([k, torch.zeros((k.size(0), 1) + k.size()[2:], dtype=k.dtype, device=k.device)], dim=1)
+ v = torch.cat([v, torch.zeros((v.size(0), 1) + v.size()[2:], dtype=v.dtype, device=v.device)], dim=1)
+ if attn_mask is not None:
+ attn_mask = nn.functional.pad(attn_mask, [0, 1])
+ if key_padding_mask is not None:
+ key_padding_mask = nn.functional.pad(key_padding_mask, [0, 1])
+
+ attn_output_weights = torch.bmm(q, k.transpose(1, 2))
+ assert list(attn_output_weights.size()) == [bsz * num_heads, tgt_len, src_len]
+
+ if attn_mask is not None:
+ if attn_mask.dtype == torch.bool:
+ attn_output_weights.masked_fill_(attn_mask, float('-inf'))
+ else:
+ attn_output_weights += attn_mask
+
+ if key_padding_mask is not None:
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ attn_output_weights = attn_output_weights.masked_fill(
+ key_padding_mask.unsqueeze(1).unsqueeze(2),
+ float('-inf'),
+ )
+ attn_output_weights = attn_output_weights.view(bsz * num_heads, tgt_len, src_len)
+
+ # Compute new xi for Hopfield retrieve iterations.
+ if xi is None:
+ xi = nn.functional.softmax(attn_output_weights, dim=-1)
+ else:
+ xi = torch.masked_scatter(input=xi, mask=update_active_heads, source=nn.functional.softmax(
+ attn_output_weights.masked_select(mask=update_active_heads).view(size=(-1, *xi.shape[1:])), dim=-1))
+
+ # Compute threshold-based stopping criterion for Hopfield retrieve iterations.
+ with torch.no_grad():
+ xi_active = xi.view(size=(bsz, num_heads, tgt_len, src_len))
+ update_active_heads = (update_step < update_steps_max) | (update_steps_max < 0)
+ if xi_old is not None:
+ update_active_heads &= ((xi_old - xi_active).norm(p=2, dim=(2, 3)).max(axis=0)[0]) > update_steps_eps
+ update_active_heads = update_active_heads.unsqueeze(dim=1).unsqueeze(dim=2).repeat(repeats=(bsz, 1, 1))
+ xi_old = xi_active
+ update_step += 1
+
+ ####################################################################################################################
+ # END HOPFIELD UPDATE ITERATION #
+ ####################################################################################################################
+
+ attn_output_weights = nn.functional.dropout(xi, p=dropout_p, training=training)
+ attn_output = torch.bmm(attn_output_weights, v)
+ assert list(attn_output.shape[:2]) == [bsz * num_heads, tgt_len]
+ attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len, bsz, -1)
+ if out_proj_weight is not None:
+ assert attn_output.shape[2] == num_heads * pattern_dim
+ attn_output = nn.functional.linear(attn_output, out_proj_weight, out_proj_bias)
+
+ xi = xi.view(bsz, num_heads, tgt_len, src_len) if return_raw_associations else None
+ v = v.view(bsz, num_heads, src_len, -1) if return_projected_patterns else None
+ if need_weights:
+ # average attention weights over heads
+ attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)
+ return attn_output, attn_output_weights.sum(dim=1) / num_heads, xi, v
+ else:
+ return attn_output, None, xi, v
diff --git a/src/mhnfs/hopfield/modules/transformer.py b/src/mhnfs/hopfield/modules/transformer.py
new file mode 100644
index 0000000000000000000000000000000000000000..884e0cb4b57610cf1daf8147f2c3d59f17824750
--- /dev/null
+++ b/src/mhnfs/hopfield/modules/transformer.py
@@ -0,0 +1,209 @@
+import torch
+import torch.nn as nn
+
+from copy import deepcopy
+from torch import Tensor
+from torch.nn.modules import Module
+from typing import Optional, Tuple, Union
+
+from . import Hopfield
+
+
+class HopfieldEncoderLayer(Module):
+ """
+ Module with underlying Hopfield association to be used as an encoder in transformer-like architectures.
+ """
+
+ def __init__(self,
+ hopfield_association: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association: instance of Hopfield association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ :param dropout: dropout probability to be applied internally
+ """
+ super(HopfieldEncoderLayer, self).__init__()
+ self.hopfield_association = deepcopy(hopfield_association)
+
+ self.linear_residual = nn.Linear(self.hopfield_association.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association.state_pattern_dim)
+
+ self.norm_residual = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association.state_pattern_dim)
+ self.dropout_hopfield_association = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association, self.linear_residual,
+ self.linear_output, self.norm_residual, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, src: Tensor, src_mask: Optional[Tensor] = None,
+ src_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield encoding on specified data.
+
+ :param src: data to be processed by Hopfield encoder module
+ :param src_mask: mask to be applied on association matrix
+ :param src_key_padding_mask: mask to be applied on stored patterns
+ :return: Hopfield-encoded input data
+ """
+ data_associated = self.hopfield_association(
+ input=src, stored_pattern_padding_mask=src_key_padding_mask, association_mask=src_mask)
+ src = src + self.dropout_hopfield_association(input=data_associated)
+ src = self.norm_residual(input=src)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=src))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ src = src + self.dropout_output(input=data_associated)
+
+ return self.norm_output(input=src)
+
+ def get_association_matrix(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output.out_features
+
+
+class HopfieldDecoderLayer(Module):
+
+ def __init__(self,
+ hopfield_association_self: Hopfield,
+ hopfield_association_cross: Hopfield,
+ dim_feedforward: int = 2048,
+ dropout: float = 0.1,
+ activation: str = r'relu'
+ ):
+ """
+ Initialise a new instance of a Hopfield association-based encoder module.
+
+ :param hopfield_association_self: instance of Hopfield self-association module
+ :param hopfield_association_cross: instance of Hopfield cross-association module
+ :param dim_feedforward: depth of the linear projections applied internally
+ :param dropout: dropout probability to be applied internally
+ :param activation: activation to be applied on the result of the internal linear projections
+ """
+ super(HopfieldDecoderLayer, self).__init__()
+ self.hopfield_association_self = deepcopy(hopfield_association_self)
+ self.hopfield_association_cross = deepcopy(hopfield_association_cross)
+
+ self.linear_residual = nn.Linear(self.hopfield_association_self.state_pattern_dim, dim_feedforward)
+ self.dropout_residual = nn.Dropout(dropout)
+ self.linear_output = nn.Linear(dim_feedforward, self.hopfield_association_self.state_pattern_dim)
+
+ self.norm_residual_self = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_residual_cross = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.norm_output = nn.LayerNorm(self.hopfield_association_self.state_pattern_dim)
+ self.dropout_hopfield_association_self = nn.Dropout(dropout)
+ self.dropout_hopfield_association_cross = nn.Dropout(dropout)
+ self.dropout_output = nn.Dropout(dropout)
+
+ self.activation_residual = getattr(torch, activation, None)
+ assert self.activation_residual is not None, r'invalid activation function supplied.'
+ self.reset_parameters()
+
+ def reset_parameters(self) -> None:
+ """
+ Reset parameters, including Hopfield association.
+
+ :return: None
+ """
+ for module in (self.hopfield_association_self, self.hopfield_association_cross,
+ self.linear_residual, self.linear_output, self.norm_residual_self,
+ self.norm_residual_cross, self.norm_output):
+ if hasattr(module, r'reset_parameters'):
+ module.reset_parameters()
+
+ def forward(self, tgt: Tensor, memory: Tensor, tgt_mask: Optional[Tensor] = None,
+ memory_mask: Optional[Tensor] = None, tgt_key_padding_mask: Optional[Tensor] = None,
+ memory_key_padding_mask: Optional[Tensor] = None) -> Tensor:
+ """
+ Apply Hopfield decoding on specified data.
+
+ :param tgt: data to be processed by Hopfield decoder module (self-association)
+ :param memory: data to be processed by Hopfield encoder module (cross-association)
+ :param tgt_mask: mask to be applied on self-association matrix
+ :param memory_mask: mask to be applied on cross-association matrix
+ :param tgt_key_padding_mask: mask to be applied on stored patterns
+ :param memory_key_padding_mask: mask to be applied on state patterns as well as pattern projection
+ :return: Hopfield-decoded input
+ """
+ data_associated = self.hopfield_association_self(
+ input=tgt, stored_pattern_padding_mask=tgt_key_padding_mask,
+ association_mask=tgt_mask)
+ tgt = tgt + self.dropout_hopfield_association_self(input=data_associated)
+ tgt = self.norm_residual_self(input=tgt)
+
+ data_associated = self.hopfield_association_cross(
+ input=(memory, tgt, memory), stored_pattern_padding_mask=memory_key_padding_mask,
+ association_mask=memory_mask)
+ tgt = tgt + self.dropout_hopfield_association_cross(input=data_associated)
+ tgt = self.norm_residual_cross(input=tgt)
+
+ result_residual_inner = self.activation_residual(input=self.linear_residual(input=tgt))
+ data_associated = self.linear_output(input=self.dropout_residual(input=result_residual_inner))
+ tgt = tgt + self.dropout_output(input=data_associated)
+ return self.norm_output(input=tgt)
+
+ def get_association_matrix_self(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield self-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_self.get_association_matrix(input=input)
+
+ def get_association_matrix_cross(self, input: Union[Tensor, Tuple[Tensor, Tensor, Tensor]]) -> Tensor:
+ """
+ Fetch Hopfield cross-association matrix gathered by passing through the specified data.
+
+ :param input: data to be passed through the Hopfield association
+ :return: association matrix as computed by the Hopfield core module
+ """
+ return self.hopfield_association_cross.get_association_matrix(input=input)
+
+ @property
+ def batch_first(self) -> int:
+ return self.hopfield_association_self.batch_first
+
+ @property
+ def input_size(self) -> int:
+ return self.hopfield_association_self.input_size
+
+ @property
+ def output_size(self) -> int:
+ return self.linear_output_self.out_features
diff --git a/src/mhnfs/initialization.py b/src/mhnfs/initialization.py
new file mode 100644
index 0000000000000000000000000000000000000000..103f29553a76a21b97bb1f4824c62dbfaad0221a
--- /dev/null
+++ b/src/mhnfs/initialization.py
@@ -0,0 +1,29 @@
+from torch import nn
+import torch
+
+
+def init_lecun(m):
+ nn.init.normal_(
+ m.weight,
+ mean=0.0,
+ std=torch.sqrt(torch.tensor([1.0]) / m.in_features).numpy()[0],
+ )
+ nn.init.zeros_(m.bias)
+
+
+def init_kaiming(m, nonlinearity):
+ nn.init.kaiming_normal_(m.weight, mode="fan_in", nonlinearity=nonlinearity)
+ nn.init.zeros_(m.bias)
+
+
+@torch.no_grad()
+def init_weights(m, activation_function="linear"):
+ if activation_function == "relu":
+ if type(m) == nn.Linear:
+ init_kaiming(m, nonlinearity="relu")
+ elif activation_function == "selu":
+ if type(m) == nn.Linear:
+ init_lecun(m)
+ elif activation_function == "linear":
+ if type(m) == nn.Linear:
+ init_lecun(m)
diff --git a/src/mhnfs/model.py b/src/mhnfs/model.py
new file mode 100644
index 0000000000000000000000000000000000000000..0fd46def671434367cb939bf69494a46177fc070
--- /dev/null
+++ b/src/mhnfs/model.py
@@ -0,0 +1,199 @@
+import pytorch_lightning as pl
+import numpy as np
+import torch
+
+from src.mhnfs.modules import (
+ EncoderBlock,
+ ContextModule,
+ LayerNormalizingBlock,
+ CrossAttentionModule,
+ SimilarityModule,
+)
+
+class MHNfs(pl.LightningModule):
+ """
+ The MHNfs is a few-shot drug-discovery model for activity prediction.
+
+ For a requested query molecule, MHNfs predicts activity, while known knowledge from
+ the support set is used.
+
+ MHNfs can be seen as an embedding-based few-shot method since the prediction is
+ based on similarities of molecule representations in a learned "representation
+ space". Being able to build rich, expressive molecule representations is the key for
+ a predictive model.
+
+ MHNfs consists of
+ three consecutive modules:
+ - the context module,
+ - the cross attention module, and
+ - the similarity module.
+
+ The context module associates the query and support set molecules with context -
+ i.e., a large set of training molecules.
+
+ The cross-attention module allows for information sharing between query and support
+ set molecules.
+
+ The similirity modules computes pair-wise similarity values between query and sup-
+ port set molecules and uses these similarity values to build a prediction from a
+ weighted sum over the support set labels.
+ """
+
+ def __init__(self, cfg):
+ super(MHNfs, self).__init__()
+
+ # Config
+ self.cfg = cfg
+
+ # Load context set
+ current_loc = __file__.rsplit("/",3)[0]
+ self.context = (
+ torch.unsqueeze(
+ torch.from_numpy(
+ np.load(current_loc + "/assets/mhnfs_data/full_context_set.npy")
+ ),
+ 0,
+ )
+ .float()
+ )
+
+ self.context_embedding = torch.ones(1, 512, 1024)
+
+ self.layerNorm_context = torch.nn.LayerNorm(
+ cfg.model.associationSpace_dim,
+ elementwise_affine=cfg.model.layerNormBlock.affine,
+ )
+
+ # Encoder
+ self.encoder = EncoderBlock(cfg)
+
+ # Context module
+ self.contextModule = ContextModule(self.cfg)
+
+ # Layernormalizing-block
+ self.layerNormBlock = LayerNormalizingBlock(cfg)
+
+ # Cross-attention module
+ self.crossAttentionModule = CrossAttentionModule(self.cfg)
+
+ # Similarity module
+ self.similarity_function = SimilarityModule
+
+ # Output function
+ self.sigmoid = torch.nn.Sigmoid()
+ self.prediction_scaling = cfg.model.prediction_scaling
+
+ def forward(
+ self,
+ query_molecules: torch.Tensor,
+ support_molecules_active: torch.Tensor,
+ support_molecules_inactive: torch.Tensor,
+ support_set_actives_size: torch.Tensor,
+ support_set_inactives_size: torch.Tensor,
+ ) -> torch.Tensor:
+ # Get embeddings from molecule encoder
+ query_embedding = self.encoder(query_molecules)
+ support_actives_embedding = self.encoder(support_molecules_active)
+ support_inactives_embedding = self.encoder(support_molecules_inactive)
+
+ # Retrieve updated representations from the context module
+ # - Layernorm
+ (
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ ) = self.layerNormBlock(
+ query_embedding, support_actives_embedding, support_inactives_embedding
+ )
+
+ # - Expand support set related tensors
+ support_actives_embedding = support_actives_embedding.expand(
+ query_embedding.shape[0], -1, -1)
+ support_inactives_embedding = support_inactives_embedding.expand(
+ query_embedding.shape[0], -1, -1)
+ support_set_actives_size = support_set_actives_size.expand(
+ query_embedding.shape[0])
+ support_set_inactives_size = support_set_inactives_size.expand(
+ query_embedding.shape[0])
+
+ # - Context module
+ (
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ ) = self.contextModule(
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ self.context_embedding,
+ )
+
+ # Allow for information sharing between query and support set
+ # - Layernorm
+ (
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ ) = self.layerNormBlock(
+ query_embedding, support_actives_embedding, support_inactives_embedding
+ )
+
+ # - Cross-attention module
+ (
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ ) = self.crossAttentionModule(
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ )
+
+ # Build predictions from a weighted sum over support set labels
+ # - Layernorm:
+ if self.cfg.model.layerNormBlock.usage:
+ (
+ query_embedding,
+ support_actives_embedding,
+ support_inactives_embedding,
+ ) = self.layerNormBlock(
+ query_embedding, support_actives_embedding, support_inactives_embedding
+ )
+
+ # - Similarity module:
+ predictions_support_actives = self.similarity_function(
+ query_embedding,
+ support_actives_embedding,
+ support_set_actives_size,
+ self.cfg,
+ )
+
+ predictions_support_inactives = self.similarity_function(
+ query_embedding,
+ support_inactives_embedding,
+ support_set_inactives_size,
+ self.cfg,
+ )
+
+ predictions = predictions_support_actives - predictions_support_inactives
+
+ predictions = self.sigmoid(self.prediction_scaling * predictions)
+
+ return predictions
+
+ @torch.no_grad()
+ def _update_context_set_embedding(self):
+ """
+ This function randomly samples the context set as a subset of all available
+ training molecules
+ """
+ max_rows = self.context.shape[1]
+ number_requested_rows = int(
+ np.rint(self.cfg.model.context.ratio_training_molecules * max_rows)
+ )
+
+ sampled_rows = torch.randperm(max_rows)[:number_requested_rows]
+
+ self.context_embedding = self.layerNorm_context(
+ self.encoder(self.context[:, sampled_rows, :])
+ )
diff --git a/src/mhnfs/modules.py b/src/mhnfs/modules.py
new file mode 100644
index 0000000000000000000000000000000000000000..6767205f780c9d6d9f4b471e4171cfd063a1f812
--- /dev/null
+++ b/src/mhnfs/modules.py
@@ -0,0 +1,574 @@
+import torch
+import torch.nn as nn
+#import hydra
+from omegaconf import OmegaConf
+from functools import partial
+import math
+from torch.nn import functional as F
+
+from src.mhnfs.hopfield.modules import Hopfield
+from src.mhnfs.initialization import init_weights
+
+
+# Mappings
+activation_function_mapping = {
+ "relu": nn.ReLU(),
+ "selu": nn.SELU(),
+ "sigmoid": nn.Sigmoid(),
+}
+
+dropout_mapping = {"relu": nn.Dropout, "selu": nn.AlphaDropout}
+
+
+# Modules
+class EncoderBlock(nn.Module):
+ """
+ Fully connected molecule encoder block.
+ - Takes molecular descriptors, e.g., ECFPs and RDKit fps as inputs
+ - returns a molecular representation
+ """
+
+ def __init__(self, cfg: OmegaConf):
+ super(EncoderBlock, self).__init__()
+
+ # Input layer
+ self.dropout = dropout_mapping[cfg.model.encoder.activation](
+ cfg.model.encoder.regularization.input_dropout
+ )
+ self.fc = nn.Linear(
+ cfg.model.encoder.input_dim, cfg.model.encoder.number_hidden_neurons
+ )
+ self.act = activation_function_mapping[cfg.model.encoder.activation]
+
+ # Hidden layer
+ self.hidden_linear_layers = nn.ModuleList([])
+ self.hidden_dropout_layers = nn.ModuleList([])
+ self.hidden_activations = nn.ModuleList([])
+
+ for _ in range(cfg.model.encoder.number_hidden_layers):
+ self.hidden_dropout_layers.append(
+ dropout_mapping[cfg.model.encoder.activation](
+ cfg.model.encoder.regularization.dropout
+ )
+ )
+ self.hidden_linear_layers.append(
+ nn.Linear(
+ cfg.model.encoder.number_hidden_neurons,
+ cfg.model.encoder.number_hidden_neurons,
+ )
+ )
+ self.hidden_activations.append(
+ activation_function_mapping[cfg.model.encoder.activation]
+ )
+
+ # Output layer
+ self.dropout_o = dropout_mapping[cfg.model.encoder.activation](
+ cfg.model.encoder.regularization.dropout
+ )
+ self.fc_o = nn.Linear(
+ cfg.model.encoder.number_hidden_neurons,
+ cfg.model.associationSpace_dim,
+ )
+ self.act_o = activation_function_mapping[cfg.model.encoder.activation]
+
+ # Initialization
+ encoder_initialization = partial(init_weights, cfg.model.encoder.activation)
+ self.apply(encoder_initialization)
+
+ def forward(self, molecule_representation: torch.Tensor) -> torch.Tensor:
+ # Input layer
+ x = self.dropout(molecule_representation)
+ x = self.fc(x)
+ x = self.act(x)
+
+ # Hidden layer
+ for hidden_dropout, hidden_layer, hidden_activation_function in zip(
+ self.hidden_dropout_layers,
+ self.hidden_linear_layers,
+ self.hidden_activations,
+ ):
+ x = hidden_dropout(x)
+ x = hidden_layer(x)
+ x = hidden_activation_function(x)
+
+ # Output layer
+ x = self.dropout_o(x)
+ x = self.fc_o(x)
+ x = self.act_o(x)
+
+ return x
+
+
+class ContextModule(nn.Module):
+ """
+ Allows for mutual information sharing.
+ Enriches the query and support set embeddings with context by associating a query or
+ support set molecule with the context set, i.e., large set of training molecules:
+ - The context set can be seen as an external memory
+ - For a given molecule embedding, a Modern Hopfield Network retrieves a representa-
+ tion from the external memory
+
+ Since we have to retrieve representations for all query and support set molecules we
+ stack all embeddings together and perform a "batch-retrieval".
+ """
+
+ def __init__(self, cfg: OmegaConf):
+ super(ContextModule, self).__init__()
+
+ self.cfg = cfg
+
+ self.hopfield = Hopfield(
+ input_size=self.cfg.model.associationSpace_dim,
+ hidden_size=cfg.model.hopfield.dim_QK,
+ stored_pattern_size=self.cfg.model.associationSpace_dim,
+ pattern_projection_size=self.cfg.model.associationSpace_dim,
+ output_size=self.cfg.model.associationSpace_dim,
+ num_heads=self.cfg.model.hopfield.heads,
+ scaling=self.cfg.model.hopfield.beta,
+ dropout=self.cfg.model.hopfield.dropout,
+ )
+
+ # Initialization
+ hopfield_initialization = partial(init_weights, "linear")
+ self.hopfield.apply(hopfield_initialization)
+
+ def forward(
+ self,
+ query_embedding: torch.Tensor,
+ support_actives_embedding: torch.Tensor,
+ support_inactives_embedding: torch.Tensor,
+ context_set_embedding: torch.Tensor,
+ ) -> tuple:
+ """
+ inputs:
+ - query; torch.tensor;
+ dim: [batch-size, 1, initial-embedding-dimension]
+ * e.g.: [512, 1, 1024]
+ * initial-embedding-dimension: defined by molecule encoder block
+ - active support set molecules; torch.tensor;
+ dim: [batch-size, active-padding-dim, initial-embedding-dimension]
+ * e.g.: [512, 9, 1024]
+ - inactive support set molecules; torch.tensor;
+ dim: [batch-size, inactive-padding-dim, initial-embedding-dimension]
+ * e.g.: [512, 11, 1024]
+ - context set molecules; torch.tensor;
+ dim: [1, number-of-context-molecules, initial-embedding-dimension]
+ * e.g.: [1, 512, 1024]
+
+ return:
+ tuple which includes the updated representations for query, active, and inactive
+ support set molecules:
+ (query, active support set molecules, inactive support set molecules)
+ """
+ # Stack embeddings together to perform a "batch-retrieval"
+ s = torch.cat(
+ (query_embedding, support_actives_embedding, support_inactives_embedding),
+ dim=1,
+ )
+ s_flattend = s.reshape(1, s.shape[0] * s.shape[1], s.shape[2])
+
+ # Retrieval
+ s_h = self.hopfield((context_set_embedding, s_flattend, context_set_embedding))
+
+ # Combine retrieval with skip connection
+ s_updated = s_flattend + s_h
+ s_updated_inputShape = s_updated.reshape(
+ s.shape[0], s.shape[1], s.shape[2]
+ ) # reshape tensor back to input shape
+
+ query_embedding = s_updated_inputShape[:, 0, :]
+ query_embedding = torch.unsqueeze(query_embedding, 1)
+
+ # Split query, active and inactive support set embeddings
+ padding_size_actives = support_actives_embedding.shape[1]
+
+ support_actives_embedding = s_updated_inputShape[
+ :, 1 : (padding_size_actives + 1), :
+ ]
+ support_inactives_embedding = s_updated_inputShape[
+ :, (padding_size_actives + 1) :, :
+ ]
+
+ return query_embedding, support_actives_embedding, support_inactives_embedding
+
+
+class LayerNormalizingBlock(nn.Module):
+ """
+ Layernorm-block which scales/transforms the representations for query, ac-
+ tive, and inactive support set molecules.
+ """
+
+ def __init__(self, cfg: OmegaConf):
+ super(LayerNormalizingBlock, self).__init__()
+
+ self.cfg = cfg
+
+ if cfg.model.layerNormBlock.usage:
+ self.layernorm_query = nn.LayerNorm(
+ cfg.model.associationSpace_dim,
+ elementwise_affine=cfg.model.layerNormBlock.affine,
+ )
+ self.layernorm_support_actives = nn.LayerNorm(
+ cfg.model.associationSpace_dim,
+ elementwise_affine=cfg.model.layerNormBlock.affine,
+ )
+ self.layernorm_support_inactives = nn.LayerNorm(
+ cfg.model.associationSpace_dim,
+ elementwise_affine=cfg.model.layerNormBlock.affine,
+ )
+
+ def forward(
+ self,
+ query_embedding: torch.Tensor,
+ support_actives_embedding: torch.Tensor,
+ support_inactives_embedding: torch.Tensor,
+ ) -> tuple:
+ """
+ inputs:
+ - query; torch.tensor;
+ dim: [batch-size, 1, embedding-dim]
+ * e.g.: [512, 1, 1024]
+ - active support set molecules; torch.tensor;
+ dim: [batch-size, active-padding-dim, embedding-dim]
+ * e.g.: [512, 9, 1024]
+ - inactive support set molecules; torch.tensor;
+ dim: [batch-size, inactive-padding-dim, initial-embedding-dim]
+ * e.g.: [512, 11, 1024]
+
+ return:
+ tuple which includes the updated representations for query, active, and inactive
+ support set molecules:
+ (query, active support set molecules, inactive support set molecules)
+ """
+
+ # Layer normalization
+ # Since the layernorm operations are optional the module just updates represen-
+ # tations if the the referring option is set in the config.
+ if self.cfg.model.layerNormBlock.usage:
+ query_embedding = self.layernorm_query(query_embedding)
+ support_actives_embedding = self.layernorm_support_actives(
+ support_actives_embedding
+ )
+ if support_inactives_embedding is not None:
+ support_inactives_embedding = self.layernorm_support_inactives(
+ support_inactives_embedding
+ )
+ return query_embedding, support_actives_embedding, support_inactives_embedding
+
+
+class CrossAttentionModule(nn.Module):
+ """
+ The cross-attention module allows for information sharing between query and support
+ set molecules.
+
+ Altae-Tran et al. [1] showed that representations can be enriched by making the
+ query molecule aware of the support set molecules and making the support set mole-
+ cules aware of each other and of the query molecule. We enable information sharing
+ with a transformer.
+
+ Overview of the cross-attention module:
+ 1) The query and support set molecules are concatenated such that one joint matrix
+ emerges which includes both query and support set molecules.
+ 2) The joint matrix is fed into a transformer
+ - Self-attention enables information sharing between query and support set mole-
+ cules
+
+ [1] Altae-Tran, H., Ramsundar, B., Pappu, A. S., & Pande, V. (2017). Low data drug
+ discovery with one-shot learning. ACS central science, 3(4), 283-293.
+ """
+
+ def __init__(self, cfg: OmegaConf):
+
+ super(CrossAttentionModule, self).__init__()
+
+ self.cfg = cfg
+
+ cfg_gpt = self.GPTConfig()
+ self.transformer_block = self.TranformerBlock(cfg_gpt)
+
+ # Initialization
+ encoder_initialization = partial(init_weights, 'relu')
+ self.apply(encoder_initialization)
+
+ def forward(
+ self,
+ query_embedding: torch.Tensor,
+ support_actives_embedding: torch.Tensor,
+ support_inactives_embedding: torch.Tensor,
+ ) -> tuple:
+ """
+ inputs:
+ - query; torch.tensor;
+ dim: [batch-size, 1, embedding-dim]
+ * e.g.: [512, 1, 1024]
+ - active support set molecules; torch.tensor;
+ dim: [batch-size, active-padding-dim, embedding-dim]
+ * e.g.: [512, 9, 1024]
+ - inactive support set molecules; torch.tensor;
+ dim: [batch-size, inactive-padding-dim, initial-embedding-dim]
+ * e.g.: [512, 11, 1024]
+ - number of active molecules in support set; torch.tensor;
+ dim: [batch-size]
+ - number of inactive molecules in support set; torch.tensor;
+ dim: [batch-size]
+
+ return:
+ tuple which includes the updated representations for query, active, and inactive
+ support set molecules:
+ (query, active support set molecules, inactive support set molecules)
+ query_embedding, support_actives_embedding, support_inactives_embedding
+ """
+
+ # Embedding dim of query and support set molecules
+ embedding_dim = support_actives_embedding.shape[2]
+
+ # Add activity encoding to representations
+ # Activity encoding:
+ # - active: 1
+ # - inactive: -1
+ # - unknown (query): 0
+ query_embedding = torch.cat(
+ [
+ query_embedding,
+ torch.zeros_like(
+ query_embedding[
+ :, :, : self.cfg.model.transformer.activity_embedding_dim
+ ]
+ ),
+ ],
+ dim=2,
+ )
+
+ support_actives_embedding = torch.cat(
+ [
+ support_actives_embedding,
+ torch.ones_like(
+ support_actives_embedding[
+ :, :, : self.cfg.model.transformer.activity_embedding_dim
+ ]
+ ),
+ ],
+ dim=2,
+ )
+
+ support_inactives_embedding = torch.cat(
+ [
+ support_inactives_embedding,
+ (-1.0)
+ * torch.ones_like(
+ support_inactives_embedding[
+ :, :, : self.cfg.model.transformer.activity_embedding_dim
+ ]
+ ),
+ ],
+ dim=2,
+ )
+
+ # Concatenate query and support set molecules
+ s = torch.cat(
+ [query_embedding, support_actives_embedding, support_inactives_embedding],
+ dim=1,
+ )
+
+ # Run transformer and update representations
+ s_h = self.transformer_block(s)
+ s_updated = s + s_h
+
+ # Split representations into query, active, and inactive support set molecules
+ query_embedding = s_updated[:, 0, :embedding_dim]
+ query_embedding = torch.unsqueeze(query_embedding, 1)
+ support_actives_embedding = s_updated[
+ :, 1 : (support_actives_embedding.shape[1] + 1), :embedding_dim
+ ]
+ support_inactives_embedding = s_updated[
+ :, (support_actives_embedding.shape[1] + 1) :, :embedding_dim
+ ]
+
+ return query_embedding, support_actives_embedding, support_inactives_embedding
+
+ #-----------------------------------------------------------------------------------
+ # Sub-modules
+ class TranformerBlock(nn.Module):
+
+ def __init__(self, config):
+ super().__init__()
+ self.ln_1 = self.LayerNorm(config.n_embd, bias=config.bias)
+ self.attn = self.SelfAttention(config)
+ self.ln_2 = self.LayerNorm(config.n_embd, bias=config.bias)
+ self.mlp = self.MLP(config)
+
+ def forward(self, x):
+ x = x + self.attn(self.ln_1(x))
+ x = x + self.mlp(self.ln_2(x))
+ return x
+
+ class LayerNorm(nn.Module):
+ """
+ LayerNorm but with an optional bias. PyTorch doesn't support simply
+ bias=False
+ """
+
+ def __init__(self, ndim, bias):
+ super().__init__()
+ self.weight = nn.Parameter(torch.ones(ndim))
+ self.bias = nn.Parameter(torch.zeros(ndim)) if bias else None
+
+ def forward(self, input):
+ return F.layer_norm(input, self.weight.shape, self.weight, self.bias,
+ 1e-5)
+
+ class SelfAttention(nn.Module):
+ """
+ Self Attention Block
+ """
+
+ def __init__(self, config):
+ super().__init__()
+
+ self.cfg = config
+
+ # query, key, value projections
+ self.q_proj = nn.Linear(config.n_embd, config.n_qk_proj*config.n_head,
+ bias=config.bias)
+ self.k_proj = nn.Linear(config.n_embd, config.n_qk_proj*config.n_head,
+ bias=config.bias)
+ self.v_proj = nn.Linear(config.n_embd, config.n_v_proj*config.n_head,
+ bias=config.bias)
+
+ # output projection
+ self.c_proj = nn.Linear(config.n_v_proj*config.n_head, config.n_embd,
+ bias=config.bias)
+
+ # regularization
+ self.attn_dropout = nn.Dropout(config.dropout)
+ self.resid_dropout = nn.Dropout(config.dropout)
+ self.n_head = config.n_head
+ self.n_embd = config.n_embd
+ self.dropout = config.dropout
+
+ def forward(self, x):
+ B, T, C = x.size() # batch size, sequence length, embedding dim (n_embd)
+
+ # Calculate queries, keys, and values
+ q = self.q_proj(x).view(B, T, self.n_head, self.cfg.n_qk_proj
+ ).transpose(1, 2) # (B, nh, T, hs)
+ k = self.k_proj(x).view(B, T, self.n_head, self.cfg.n_qk_proj
+ ).transpose(1, 2) # (B, nh, T, hs)
+ v = self.v_proj(x).view(B, T, self.n_head, self.cfg.n_v_proj
+ ).transpose(1, 2) # (B, nh, T, hs)
+
+ # Calculate self-attentions
+ att = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))
+
+ # Activations
+ att = F.softmax(att, dim=-1)
+ att = self.attn_dropout(att)
+ y = att @ v # (B, nh, T, T) x (B, nh, T, hs) -> (B, nh, T, hs)
+
+ # Re-assemble all head outputs side by side
+ y = y.transpose(1, 2).contiguous().view(y.shape[0],
+ y.shape[2],
+ -1)
+
+ # output projection
+ y = self.resid_dropout(self.c_proj(y))
+ return y
+
+ class MLP(nn.Module):
+
+ def __init__(self, config):
+ super().__init__()
+ self.c_fc = nn.Linear(config.n_embd, 567, bias=config.bias)
+ self.relu = nn.ReLU()
+ self.c_proj = nn.Linear(567, config.n_embd, bias=config.bias)
+ self.dropout = nn.Dropout(config.dropout)
+
+ def forward(self, x):
+ x = self.c_fc(x)
+ x = self.relu(x)
+ x = self.c_proj(x)
+ x = self.dropout(x)
+ return x
+
+ class GPTConfig:
+ n_head: int = 8
+ n_embd: int = 1088
+ dropout: float = 0.
+ bias: bool = True
+ n_qk_proj: int = 136
+ n_v_proj: int = 136
+
+
+def SimilarityModule(
+ query_embedding: torch.Tensor,
+ support_set_embeddings: torch.Tensor,
+ support_set_size: torch.Tensor,
+ cfg: OmegaConf,
+) -> torch.Tensor:
+ """
+ The similarity module builds the activity prediction for the query molecule from a
+ weighted sum over the support set labels. Pair-wise similarity values between query
+ and support set molecules are used as weights for the weighted sum.
+
+ Since the similarity module is applied twice within the MHNfs model - once for the
+ active and once for the inactive support set molecules, the support_set_embeddings
+ here mean ether active or inactive support set molecule embeddings.
+
+ inputs:
+ - query; torch.tensor;
+ dim: [batch-size, 1, embedding-dimension]
+ * e.g.: [512, 1, 1024]
+ - support set molecules; torch.tensor;
+ dim: [batch-size, padding-dim, embedding-dimension]
+ * e.g.: [512, 9, 1024]
+ - padding mask; torch.tensor; boolean
+ dim: [batch-size, padding-dim]
+ * e.g.: [512, 9]
+ - support set size; torch.tensor;
+ dim: [batch-size]
+ * e.g.: [512]
+ """
+
+ # Optional L2-norm
+ if cfg.model.similarityModule.l2Norm:
+ query_embedding_div = torch.unsqueeze(
+ query_embedding.pow(2).sum(dim=2).sqrt(), 2
+ )
+ query_embedding_div[query_embedding_div == 0] = 1
+ support_set_embeddings_div = torch.unsqueeze(
+ support_set_embeddings.pow(2).sum(dim=2).sqrt(), 2
+ )
+ support_set_embeddings_div[support_set_embeddings_div == 0] = 1
+
+ query_embedding = query_embedding / query_embedding_div
+ support_set_embeddings = support_set_embeddings / support_set_embeddings_div
+
+ # Compute similarity values
+ similarities = query_embedding @ torch.transpose(support_set_embeddings, 1, 2)
+ # dim:
+ # [batch-size, 1, padding-dim] =
+ # [batch-size, 1, emb-dim] x [batch-size, emb-dim, padding-dim]
+
+ # Compute similarity values
+ similarities[torch.isnan(similarities)] = 0.0
+ similarity_sums = similarities.sum(
+ dim=2
+ ) # For every query molecule: Sum over support set molecules
+
+ # Scaling
+ if cfg.model.similarityModule.scaling == "1/N":
+ stabilizer = torch.tensor(1e-8).float()
+ similarity_sums = (
+ 1 / (2.0 * support_set_size.reshape(-1, 1) + stabilizer) * similarity_sums
+ )
+ if cfg.model.similarityModule.scaling == "1/sqrt(N)":
+ stabilizer = torch.tensor(1e-8).float()
+ similarity_sums = (
+ 1
+ / (2.0 * torch.sqrt(support_set_size.reshape(-1, 1).float()) + stabilizer)
+ * similarity_sums
+ )
+
+ return similarity_sums
+
+# --------------------------------------------------------------------------------------
diff --git a/src/prediction_pipeline.py b/src/prediction_pipeline.py
new file mode 100644
index 0000000000000000000000000000000000000000..30b650213a13e562891f442e3b99d619be0cc7c6
--- /dev/null
+++ b/src/prediction_pipeline.py
@@ -0,0 +1,104 @@
+"""
+This module provides a simple predict function for the MHNfs model.
+It loads the model from the provided checkpoint, creates necessary helper inputs
+and makes predictions for a list of molecules
+"""
+
+#---------------------------------------------------------------------------------------
+# Dependencies
+import pandas as pd
+import pytorch_lightning as pl
+import streamlit as st
+
+from src.data_preprocessing.create_model_inputs import (create_query_input,
+ create_support_set_input)
+from src.mhnfs.model import MHNfs
+
+#---------------------------------------------------------------------------------------
+# Define predictor class
+
+class ActivityPredictor:
+
+ def __init__(self):
+
+ @st.cache_resource # Caching for streamlit
+ def load_model():
+ pl.seed_everything(1234)
+ current_loc = __file__.rsplit("/",2)[0]
+ model = MHNfs.load_from_checkpoint(current_loc +
+ "/assets/mhnfs_data/"
+ "mhnfs_checkpoint.ckpt")
+ model._update_context_set_embedding()
+ model.eval()
+
+ return model
+
+ # Load model
+ self.model = load_model()
+
+ # Initiate query mol storage
+ self.query_molecules = None
+
+ def predict(self, query_smiles, support_activces_smiles, support_inactives_smiles):
+
+ # Create model inputs
+ # Query input
+ self.query_molecules = query_smiles
+ query_input = create_query_input(query_smiles)
+
+ # Active support set input
+ support_actives_input, support_actives_size = create_support_set_input(
+ support_activces_smiles
+ )
+
+ # Inactive support set input
+ support_inactives_input, support_inactives_size = create_support_set_input(
+ support_inactives_smiles
+ )
+
+ # Make predictions
+ predictions = self.model(
+ query_input,
+ support_actives_input,
+ support_inactives_input,
+ support_actives_size,
+ support_inactives_size,
+ )
+
+ preds_numpy = predictions.detach().numpy().flatten()
+
+
+ return preds_numpy
+
+ def _return_query_mols_as_list(self):
+ if isinstance(self.query_molecules, list):
+ return self.query_molecules
+ elif isinstance(self.query_molecules, str):
+ smiles_list = self.query_molecules.split(",")
+ smiles_list_cleaned = [smiles.strip() for smiles in smiles_list]
+ return smiles_list_cleaned
+ elif isinstance(self.query_molecules, pd.DataFrame):
+ return self.query_molecules.smiles.tolist()
+ elif isinstance(self.query_molecules, type(None)):
+ raise ValueError("No query molecules have been stored yet."
+ "Run predict-function first.")
+ else:
+ raise TypeError("Type of query molecules not recognized."
+ "Please check input type.")
+
+#---------------------------------------------------------------------------------------
+if __name__ == "__main__":
+ # Create predictor
+ predictor = ActivityPredictor()
+
+ # Create example inputs
+ query_smiles = ["C1CCCCC1", "C1CCCCC1", "C1CCCCC1", "C1CCCCC1"]
+ support_actives_smiles = ["C1CCCCC1", "C1CCCCC1"]
+ support_inactives_smiles = ["C1CCCCC1", "C1CCCCC1"]
+
+ # Make predictions
+ predictions = predictor.predict(query_smiles,
+ support_actives_smiles,
+ support_inactives_smiles)
+
+ print(predictions)
\ No newline at end of file
diff --git a/src/tests/__init__.py b/src/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/tests/__pycache__/__init__.cpython-36.pyc b/src/tests/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..51b83385d06b9f52ca156bc8bc90a2c89a063e22
Binary files /dev/null and b/src/tests/__pycache__/__init__.cpython-36.pyc differ
diff --git a/src/tests/__pycache__/__init__.cpython-37.pyc b/src/tests/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a365866a2700e17b4118ea7cea62d82526a19960
Binary files /dev/null and b/src/tests/__pycache__/__init__.cpython-37.pyc differ
diff --git a/src/tests/__pycache__/conftest.cpython-36-pytest-7.0.1.pyc b/src/tests/__pycache__/conftest.cpython-36-pytest-7.0.1.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..92991581878b602e1b74053ba7d44f3ef1eb1de6
Binary files /dev/null and b/src/tests/__pycache__/conftest.cpython-36-pytest-7.0.1.pyc differ
diff --git a/src/tests/__pycache__/conftest.cpython-37-pytest-7.1.2.pyc b/src/tests/__pycache__/conftest.cpython-37-pytest-7.1.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f6e2a0fa9c1682595dc7bc00d5f0aecbc34ccc7d
Binary files /dev/null and b/src/tests/__pycache__/conftest.cpython-37-pytest-7.1.2.pyc differ
diff --git a/src/tests/__pycache__/test_data_preprocessing.cpython-36-pytest-7.0.1.pyc b/src/tests/__pycache__/test_data_preprocessing.cpython-36-pytest-7.0.1.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c23c0b8683506876a4c833bbc626b35bce3d644b
Binary files /dev/null and b/src/tests/__pycache__/test_data_preprocessing.cpython-36-pytest-7.0.1.pyc differ
diff --git a/src/tests/__pycache__/test_data_preprocessing.cpython-37-pytest-7.1.2.pyc b/src/tests/__pycache__/test_data_preprocessing.cpython-37-pytest-7.1.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..68e709e1abd86012ba3af7696cd2abc6b68ab942
Binary files /dev/null and b/src/tests/__pycache__/test_data_preprocessing.cpython-37-pytest-7.1.2.pyc differ
diff --git a/src/tests/__pycache__/test_prediction_pipeline_model_preds.cpython-37-pytest-7.1.2.pyc b/src/tests/__pycache__/test_prediction_pipeline_model_preds.cpython-37-pytest-7.1.2.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5ad965de65f1e148f09275382c2d88fe6958c154
Binary files /dev/null and b/src/tests/__pycache__/test_prediction_pipeline_model_preds.cpython-37-pytest-7.1.2.pyc differ
diff --git a/src/tests/conftest.py b/src/tests/conftest.py
new file mode 100644
index 0000000000000000000000000000000000000000..856af48f074ef6ee8d18c9cd7a92c82445680f8d
--- /dev/null
+++ b/src/tests/conftest.py
@@ -0,0 +1,100 @@
+"""
+Needed objects for tests
+"""
+
+#---------------------------------------------------------------------------------------
+# Dependencies
+import pytest
+import pandas as pd
+import pickle
+import numpy as np
+import torch
+
+from data_preprocessing.create_descriptors import create_cleaned_mol_objects
+
+#---------------------------------------------------------------------------------------
+# Define fixtures
+
+#---------------------------------------------------------------------------------------
+# Data preprocessing
+@pytest.fixture(scope="session")
+def input_molecule_formats():
+ class Formats:
+ smiles = "CCO"
+ smiles_coma = "CCO, CCN"
+ smiles_list = ["CCO", "CCN"]
+ smiles_df = pd.DataFrame({"smiLES": ["CCO", "CCN"]})
+ smiles_df_wrong_key = pd.DataFrame({"notSMILES": ["CCO", "CCN"]})
+ return Formats()
+
+@pytest.fixture(scope="session")
+def input_smiles():
+ current_loc = __file__.rsplit("/",3)[0]
+ with open(current_loc + "/assets/test_reference_data/smiles.pkl", "rb") as fl:
+ input_smiles = pickle.load(fl)
+ return input_smiles
+
+@pytest.fixture(scope="session")
+def input_mols_from_smiles():
+ current_loc = __file__.rsplit("/",3)[0]
+ with open(current_loc + "/assets/test_reference_data/smiles.pkl", "rb") as fl:
+ input_smiles = pickle.load(fl)
+
+ input_molecules = create_cleaned_mol_objects(input_smiles)
+ return input_molecules
+
+@pytest.fixture(scope="session")
+def ecfps_from_smiles():
+ current_loc = __file__.rsplit("/",3)[0]
+ ecfps = np.load(current_loc + "/assets/test_reference_data/ecfps.npy")
+ return ecfps
+
+@pytest.fixture(scope="session")
+def rdkit_descrs_from_smiles():
+ current_loc = __file__.rsplit("/",3)[0]
+ rdkit_descrs = np.load(current_loc + "/assets/test_reference_data/rdkit_descrs.npy")
+ return rdkit_descrs
+
+@pytest.fixture(scope="session")
+def rdkit_descr_quantils():
+ current_loc = __file__.rsplit("/",3)[0]
+ rdkit_descr_quantils = np.load(
+ current_loc + "/assets/test_reference_data/rdkit_descr_quantils.npy")
+ return rdkit_descr_quantils
+
+@pytest.fixture(scope="session")
+def preprocessed_features():
+ current_loc = __file__.rsplit("/",3)[0]
+ preprocessed_features = np.load(
+ current_loc + "/assets/test_reference_data/preprocessed_features.npy")
+ return preprocessed_features
+
+#---------------------------------------------------------------------------------------
+# Model
+@pytest.fixture(scope="session")
+def model_input_query():
+ current_loc = __file__.rsplit("/",3)[0]
+ model_input_query = torch.load(
+ current_loc + "/assets/test_reference_data/model_input_query.pt")
+ return model_input_query
+
+@pytest.fixture(scope="session")
+def model_input_support_actives():
+ current_loc = __file__.rsplit("/",3)[0]
+ model_input_support_actives = torch.load(
+ current_loc + "/assets/test_reference_data/model_input_support_actives.pt")
+ return model_input_support_actives
+
+@pytest.fixture(scope="session")
+def model_input_support_inactives():
+ current_loc = __file__.rsplit("/",3)[0]
+ model_input_support_inactives = torch.load(
+ current_loc + "/assets/test_reference_data/model_input_support_inactives.pt")
+ return model_input_support_inactives
+
+@pytest.fixture(scope="session")
+def model_predictions():
+ current_loc = __file__.rsplit("/",3)[0]
+ model_predictions = torch.load(
+ current_loc + "/assets/test_reference_data/model_predictions.pt")
+ return model_predictions
\ No newline at end of file
diff --git a/src/tests/test_data_preprocessing.py b/src/tests/test_data_preprocessing.py
new file mode 100644
index 0000000000000000000000000000000000000000..eaf747764cfb9c7aa4ec4a51f79d5b6d8f000b34
--- /dev/null
+++ b/src/tests/test_data_preprocessing.py
@@ -0,0 +1,113 @@
+"""
+This file includes all tests for the data_preprocessing module.
+"""
+
+import pytest
+import numpy as np
+import pickle
+from data_preprocessing.create_descriptors import (handle_inputs,
+ create_ecfp_fps,
+ create_rdkit_descriptors,
+ create_quantils,
+ preprocess_molecules)
+
+class TestPreprocessMolecules:
+
+ def test_handle_inputs(self, input_molecule_formats):
+ """
+ This functions check whether all 3 possible input formats are correctly
+ transformed into list.
+ """
+
+ # Check 1: Smiles
+ output_smiles = handle_inputs(input_molecule_formats.smiles)
+ assert isinstance(output_smiles, list)
+
+ # Check 2: Smiles coma
+ output_smiles_coma = handle_inputs(input_molecule_formats.smiles_coma)
+ assert isinstance(output_smiles_coma, list)
+ assert output_smiles_coma == input_molecule_formats.smiles_list
+
+ # Check 3: Smiles list
+ output_smiles_list = handle_inputs(input_molecule_formats.smiles_list)
+ assert isinstance(output_smiles_list, list)
+
+ # Check 4.1: Correct DataFrame
+ output_smiles_df = handle_inputs(input_molecule_formats.smiles_df)
+ assert isinstance(output_smiles_df, list)
+
+ # Check 4.2: Wrong DataFrame
+ with pytest.raises(ValueError):
+ handle_inputs(input_molecule_formats.smiles_df_wrong_key)
+
+ def test_create_ecfps_fps(self, input_mols_from_smiles, ecfps_from_smiles):
+ """
+ This function tests whether the ECFP fingerprints are correctly created.
+ """
+
+ # Check 1: Correct output type
+ output_ecfps = create_ecfp_fps(input_mols_from_smiles)
+ assert isinstance(output_ecfps, np.ndarray)
+
+ # Check 2: Correct output shape
+ assert output_ecfps.shape == ecfps_from_smiles.shape
+
+ # Check 3: Correct output values
+ assert np.allclose(output_ecfps, ecfps_from_smiles, 0, 0)
+
+ def test_create_rdkit_descriptors(self, input_mols_from_smiles,
+ rdkit_descrs_from_smiles):
+ """
+ This function tests whether the RDKit descriptors are correctly created.
+ """
+
+ # Check 1: Correct output type
+ output_rdkit_descrs = create_rdkit_descriptors(input_mols_from_smiles)
+ assert isinstance(output_rdkit_descrs, np.ndarray)
+
+ # Check 2: Correct output shape
+ assert output_rdkit_descrs.shape == rdkit_descrs_from_smiles.shape
+
+ # Check 3: Correct output values
+ assert np.allclose(output_rdkit_descrs, rdkit_descrs_from_smiles)
+
+ def test_create_quantils(self, input_mols_from_smiles, rdkit_descr_quantils):
+ """
+ This function tests whether the quantils are correctly created.
+ """
+ current_loc = __file__.rsplit("/",3)[0]
+ with open(current_loc + "/assets/data_preprocessing_objects/ecdfs.pkl",
+ "rb") as fl:
+ ecdfs = pickle.load(fl)
+
+ rdkit_descrs = create_rdkit_descriptors(input_mols_from_smiles)
+ output_quantils = create_quantils(rdkit_descrs, ecdfs)
+
+ # Check 1: Correct output type
+ assert isinstance(output_quantils, np.ndarray)
+
+ # Check 2: Correct output shape
+ assert output_quantils.shape == rdkit_descr_quantils.shape
+
+ # Check 3: Correct output values
+ assert np.allclose(output_quantils, rdkit_descr_quantils)
+
+ def test_preprocess_molecules(self, input_smiles,
+ preprocessed_features):
+ """
+ This function tests whether the preprocessing of molecules is correctly
+ done.
+ """
+
+ # Check 1: Correct output type
+ output_preprocessed_features = preprocess_molecules(input_smiles)
+ assert isinstance(output_preprocessed_features, np.ndarray)
+
+ # Check 2: Correct output shape
+ assert output_preprocessed_features.shape == preprocessed_features.shape
+
+ # Check 3: Correct output values
+ assert np.allclose(output_preprocessed_features, preprocessed_features)
+
+
+
\ No newline at end of file
diff --git a/src/tests/test_prediction_pipeline_model_preds.py b/src/tests/test_prediction_pipeline_model_preds.py
new file mode 100644
index 0000000000000000000000000000000000000000..36bb640f6cc55565ae7f75a717869ea15800138c
--- /dev/null
+++ b/src/tests/test_prediction_pipeline_model_preds.py
@@ -0,0 +1,88 @@
+"""
+This file tests whether the model predictions for MHNfs match the predictions made on
+the JKU development server (varified model, server conda env with spec. packages ...)
+"""
+
+#---------------------------------------------------------------------------------------
+# Dependencies
+import pytest
+import torch
+import pandas as pd
+from prediction_pipeline import ActivityPredictor
+
+#---------------------------------------------------------------------------------------
+# Define tests
+
+class TestActivityPredictor:
+
+ def test_mhnfs_prediction(self, model_input_query, model_input_support_actives,
+ model_input_support_inactives, model_predictions):
+
+ # Load model
+ predictor = ActivityPredictor()
+
+ # Define additional inputs to model - i.e. support set sizes
+ support_actives_size = torch.tensor(model_input_support_actives.shape[1])
+ support_inactives_size = torch.tensor(model_input_support_inactives.shape[1])
+
+ # Make predictions
+ predictions = predictor.model(
+ model_input_query,
+ model_input_support_actives,
+ model_input_support_inactives,
+ support_actives_size,
+ support_inactives_size
+ ).detach()
+
+ # Compare predictions
+ assert torch.allclose(predictions, model_predictions, atol=0.01, rtol=0.)
+
+ def test_query_mol_return(self):
+
+ # Support set
+ support_actives_smiles = ["CCCCCCCCNC(C)C(O)c1ccc(SC(C)C)cc1"]
+ support_inactives_smiles = ["CCN(CC)C(=S)SSC(=S)N(CC)CCCCC"]
+
+ # Load activity predictor
+ predictor = ActivityPredictor()
+
+ # Check 1: Query mols given as a list
+ query_smiles = ["CCCCCCCCNC(C)C(O)c1ccc(SC(C)C)cc1",
+ "CCN(CC)C(=S)SSC(=S)N(CC)CC"]
+
+ _ = predictor.predict(query_smiles, support_actives_smiles,
+ support_inactives_smiles)
+ query_output = predictor._return_query_mols_as_list()
+ assert query_output == query_smiles
+
+ # Check 2: Query mols given as a string
+ query_smiles_str = ("CCCCCCCCNC(C)C(O)c1ccc(SC(C)C)cc1,"
+ "CCN(CC)C(=S)SSC(=S)N(CC)CC")
+ _ = predictor.predict(query_smiles_str, support_actives_smiles,
+ support_inactives_smiles)
+ query_output = predictor._return_query_mols_as_list()
+ assert query_output == query_smiles
+
+ # Check 3: Query mols given as a pd.Series
+ query_smiles_series = pd.DataFrame({"smiles":
+ ["CCCCCCCCNC(C)C(O)c1ccc(SC(C)C)cc1", "CCN(CC)C(=S)SSC(=S)N(CC)CC"]})
+ _ = predictor.predict(query_smiles_series, support_actives_smiles,
+ support_inactives_smiles)
+ query_output = predictor._return_query_mols_as_list()
+ assert query_output == query_smiles
+
+ # Check 4: Query molecules storage is None
+ predictor.query_molecules = None
+ with pytest.raises(ValueError):
+ predictor._return_query_mols_as_list()
+
+ # Check 5: Other data types
+ predictor.query_molecules = 123 # any other data type
+ with pytest.raises(TypeError):
+ predictor._return_query_mols_as_list()
+
+
+
+
+
+