diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml
index 98b2a668..b04fb15c 100644
--- a/.github/workflows/black.yml
+++ b/.github/workflows/black.yml
@@ -7,4 +7,4 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - uses: psf/black@stable
\ No newline at end of file
+ - uses: psf/black@stable
diff --git a/.gitignore b/.gitignore
index bf0b7890..733bbf9e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -161,3 +161,8 @@ cython_debug/
#.idea/
# configs/ # commented as new configs can be added as a part of a feature
+/.idea
+/data
+/logs
+/results_buffer
+electra_pretrained.ckpt
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 77b2dfa5..108b91d5 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,9 +1,25 @@
repos:
-#- repo: https://github.com/PyCQA/isort
-# rev: "5.12.0"
-# hooks:
-# - id: isort
- repo: https://github.com/psf/black
rev: "24.2.0"
hooks:
- - id: black
\ No newline at end of file
+ - id: black
+ - id: black-jupyter # for formatting jupyter-notebook
+
+- repo: https://github.com/pycqa/isort
+ rev: 5.13.2
+ hooks:
+ - id: isort
+ name: isort (python)
+ args: ["--profile=black"]
+
+- repo: https://github.com/asottile/seed-isort-config
+ rev: v2.2.0
+ hooks:
+ - id: seed-isort-config
+
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.6.0
+ hooks:
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
diff --git a/README.md b/README.md
index 2082f3e0..3c0817ee 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# ChEBai
-ChEBai is a deep learning library designed for the integration of deep learning methods with chemical ontologies, particularly ChEBI.
+ChEBai is a deep learning library designed for the integration of deep learning methods with chemical ontologies, particularly ChEBI.
The library emphasizes the incorporation of the semantic qualities of the ontology into the learning process.
## Installation
@@ -21,7 +21,7 @@ pip install .
## Usage
-The training and inference is abstracted using the Pytorch Lightning modules.
+The training and inference is abstracted using the Pytorch Lightning modules.
Here are some CLI commands for the standard functionalities of pretraining, ontology extension, fine-tuning for toxicity and prediction.
For further details, see the [wiki](https://github.com/ChEB-AI/python-chebai/wiki).
If you face any problems, please open a new [issue](https://github.com/ChEB-AI/python-chebai/issues/new).
@@ -55,18 +55,18 @@ The `classes_path` is the path to the dataset's `raw/classes.txt` file that cont
## Evaluation
-An example for evaluating a model trained on the ontology extension task is given in `tutorials/eval_model_basic.ipynb`.
+An example for evaluating a model trained on the ontology extension task is given in `tutorials/eval_model_basic.ipynb`.
It takes in the finetuned model as input for performing the evaluation.
## Cross-validation
-You can do inner k-fold cross-validation, i.e., train models on k train-validation splits that all use the same test
+You can do inner k-fold cross-validation, i.e., train models on k train-validation splits that all use the same test
set. For that, you need to specify the total_number of folds as
```
--data.init_args.inner_k_folds=K
```
and the fold to be used in the current optimisation run as
-```
+```
--data.init_args.fold_index=I
```
-To train K models, you need to do K such calls, each with a different `fold_index`. On the first call with a given
+To train K models, you need to do K such calls, each with a different `fold_index`. On the first call with a given
`inner_k_folds`, all folds will be created and stored in the data directory
diff --git a/chebai/callbacks.py b/chebai/callbacks.py
index ede0bac0..af306ccb 100644
--- a/chebai/callbacks.py
+++ b/chebai/callbacks.py
@@ -1,8 +1,8 @@
import json
import os
-from lightning.pytorch.callbacks import BasePredictionWriter
import torch
+from lightning.pytorch.callbacks import BasePredictionWriter
class ChebaiPredictionWriter(BasePredictionWriter):
diff --git a/chebai/callbacks/prediction_callback.py b/chebai/callbacks/prediction_callback.py
index a0b34262..07e8b82c 100644
--- a/chebai/callbacks/prediction_callback.py
+++ b/chebai/callbacks/prediction_callback.py
@@ -1,8 +1,9 @@
-from lightning.pytorch.callbacks import BasePredictionWriter
-import torch
import os
import pickle
+import torch
+from lightning.pytorch.callbacks import BasePredictionWriter
+
class PredictionWriter(BasePredictionWriter):
def __init__(self, output_dir, write_interval):
diff --git a/chebai/loggers/custom.py b/chebai/loggers/custom.py
index 121ad08b..bb11ea66 100644
--- a/chebai/loggers/custom.py
+++ b/chebai/loggers/custom.py
@@ -1,11 +1,11 @@
-from datetime import datetime
-from typing import Literal, Optional, Union, List
import os
+from datetime import datetime
+from typing import List, Literal, Optional, Union
+import wandb
from lightning.fabric.utilities.types import _PATH
from lightning.pytorch.callbacks import ModelCheckpoint
from lightning.pytorch.loggers import WandbLogger
-import wandb
class CustomLogger(WandbLogger):
diff --git a/chebai/loss/bce_weighted.py b/chebai/loss/bce_weighted.py
index 2148b644..09ed7276 100644
--- a/chebai/loss/bce_weighted.py
+++ b/chebai/loss/bce_weighted.py
@@ -1,9 +1,11 @@
+import os
+import pickle
+
+import pandas as pd
import torch
+
from chebai.preprocessing.datasets.base import XYBaseDataModule
from chebai.preprocessing.datasets.pubchem import LabeledUnlabeledMixed
-import pandas as pd
-import os
-import pickle
class BCEWeighted(torch.nn.BCEWithLogitsLoss):
diff --git a/chebai/loss/semantic.py b/chebai/loss/semantic.py
index b82157e0..6dfac3e2 100644
--- a/chebai/loss/semantic.py
+++ b/chebai/loss/semantic.py
@@ -1,14 +1,15 @@
import csv
+import math
import os
import pickle
-import math
import torch
+
from typing import Literal, Union
-from chebai.preprocessing.datasets.chebi import _ChEBIDataExtractor, ChEBIOver100
-from chebai.preprocessing.datasets.pubchem import LabeledUnlabeledMixed
from chebai.loss.bce_weighted import BCEWeighted
+from chebai.preprocessing.datasets.chebi import ChEBIOver100, _ChEBIDataExtractor
+from chebai.preprocessing.datasets.pubchem import LabeledUnlabeledMixed
class ImplicationLoss(torch.nn.Module):
diff --git a/chebai/models/base.py b/chebai/models/base.py
index b62e1bf8..8b7b65c1 100644
--- a/chebai/models/base.py
+++ b/chebai/models/base.py
@@ -1,9 +1,9 @@
-from typing import Optional
import logging
import typing
+from typing import Optional
-from lightning.pytorch.core.module import LightningModule
import torch
+from lightning.pytorch.core.module import LightningModule
from chebai.preprocessing.structures import XYData
diff --git a/chebai/models/chemberta.py b/chebai/models/chemberta.py
index 8b3b6175..b601542a 100644
--- a/chebai/models/chemberta.py
+++ b/chebai/models/chemberta.py
@@ -1,7 +1,8 @@
-from tempfile import TemporaryDirectory
import logging
import random
+from tempfile import TemporaryDirectory
+import torch
from torch import nn
from torch.nn.functional import one_hot
from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
@@ -11,7 +12,6 @@
RobertaModel,
RobertaTokenizer,
)
-import torch
from chebai.models.base import ChebaiBaseNet
diff --git a/chebai/models/chemyk.py b/chebai/models/chemyk.py
index 4705aa1a..13bbea7c 100644
--- a/chebai/models/chemyk.py
+++ b/chebai/models/chemyk.py
@@ -3,11 +3,11 @@
import pickle
import sys
+import networkx as nx
+import torch
from torch import nn
from torch.nn import functional as F
from torch.nn.functional import pad
-import networkx as nx
-import torch
from chebai.models.base import ChebaiBaseNet
diff --git a/chebai/models/electra.py b/chebai/models/electra.py
index 76f2711e..4377c29f 100644
--- a/chebai/models/electra.py
+++ b/chebai/models/electra.py
@@ -1,7 +1,8 @@
+import logging
from math import pi
from tempfile import TemporaryDirectory
-import logging
+import torch
from torch import nn
from torch.nn.utils.rnn import pad_sequence
from transformers import (
@@ -10,7 +11,6 @@
ElectraForPreTraining,
ElectraModel,
)
-import torch
from chebai.loss.pretraining import ElectraPreLoss # noqa
from chebai.models.base import ChebaiBaseNet
diff --git a/chebai/models/lnn_model.py b/chebai/models/lnn_model.py
index fdfcdb42..3d61c5af 100644
--- a/chebai/models/lnn_model.py
+++ b/chebai/models/lnn_model.py
@@ -1,8 +1,8 @@
-from lnn import Implies, Model, Not, Predicate, Variable, World
-from owlready2 import get_ontology
import fastobo
import pyhornedowl
import tqdm
+from lnn import Implies, Model, Not, Predicate, Variable, World
+from owlready2 import get_ontology
def get_name(iri: str):
diff --git a/chebai/models/recursive.py b/chebai/models/recursive.py
index 9e69e5b1..fb408039 100644
--- a/chebai/models/recursive.py
+++ b/chebai/models/recursive.py
@@ -1,9 +1,9 @@
import logging
-from torch import exp, nn, tensor
import networkx as nx
import torch
import torch.nn.functional as F
+from torch import exp, nn, tensor
from chebai.models.base import ChebaiBaseNet
diff --git a/chebai/preprocessing/bin/BPE_SWJ/vocab.json b/chebai/preprocessing/bin/BPE_SWJ/vocab.json
index 7e984775..afc12714 100644
--- a/chebai/preprocessing/bin/BPE_SWJ/vocab.json
+++ b/chebai/preprocessing/bin/BPE_SWJ/vocab.json
@@ -1 +1 @@
-{"":0,"":1,"":2,"":3,"":4,"!":5,"\"":6,"#":7,"$":8,"%":9,"&":10,"'":11,"(":12,")":13,"*":14,"+":15,",":16,"-":17,".":18,"/":19,"0":20,"1":21,"2":22,"3":23,"4":24,"5":25,"6":26,"7":27,"8":28,"9":29,":":30,";":31,"<":32,"=":33,">":34,"?":35,"@":36,"A":37,"B":38,"C":39,"D":40,"E":41,"F":42,"G":43,"H":44,"I":45,"J":46,"K":47,"L":48,"M":49,"N":50,"O":51,"P":52,"Q":53,"R":54,"S":55,"T":56,"U":57,"V":58,"W":59,"X":60,"Y":61,"Z":62,"[":63,"\\":64,"]":65,"^":66,"_":67,"`":68,"a":69,"b":70,"c":71,"d":72,"e":73,"f":74,"g":75,"h":76,"i":77,"j":78,"k":79,"l":80,"m":81,"n":82,"o":83,"p":84,"q":85,"r":86,"s":87,"t":88,"u":89,"v":90,"w":91,"x":92,"y":93,"z":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,"ď":208,"Đ":209,"đ":210,"Ē":211,"ē":212,"Ĕ":213,"ĕ":214,"Ė":215,"ė":216,"Ę":217,"ę":218,"Ě":219,"ě":220,"Ĝ":221,"ĝ":222,"Ğ":223,"ğ":224,"Ġ":225,"ġ":226,"Ģ":227,"ģ":228,"Ĥ":229,"ĥ":230,"Ħ":231,"ħ":232,"Ĩ":233,"ĩ":234,"Ī":235,"ī":236,"Ĭ":237,"ĭ":238,"Į":239,"į":240,"İ":241,"ı":242,"IJ":243,"ij":244,"Ĵ":245,"ĵ":246,"Ķ":247,"ķ":248,"ĸ":249,"Ĺ":250,"ĺ":251,"Ļ":252,"ļ":253,"Ľ":254,"ľ":255,"Ŀ":256,"ŀ":257,"Ł":258,"ł":259,"Ń":260,"CC":261,"(=":262,"](":263,"cc":264,"@@":265,")[":266,"CO":267,"NC":268,"CCCC":269,"ccc":270,"OC":271,"]([":272,")(":273,"CN":274,")=":275,"Cl":276,"CCC":277,"-]":278,"([":279,"ccccc":280,")(=":281,"CCCCCCCC":282,"nc":283,"COC":284,"CCN":285,"+]":286,"OCC":287,"Cc":288,"@]":289,"Br":290,"12":291,"]%":292,"@@]":293,".[":294,"cccc":295,"-])":296,"NCC":297,"CS":298,"CCCCC":299,"Nc":300,"COc":301,"nH":302,"NN":303,")/":304,"])":305,"CCOC":306,"CNC":307,"(-":308,"SC":309,")([":310,"Oc":311,"+](=":312,"OP":313,"CCCN":314,"(/":315,"-])=":316,"COP":317,"CCNC":318,"=[":319,"10":320,"21":321,"][":322,"+](":323,"13":324,"-])(=":325,"CCOCC":326,"Na":327,"])[":328,"11":329,"CCCCCC":330,"cnc":331,"NS":332,"NH":333,"CCCCCCCCCCCCCCCC":334,"CCO":335,"@@](":336,"cn":337,"CSC":338,"(\\":339,")\\":340,"CCCCCCC":341,"-].[":342,"CCCCN":343,"Si":344,"CCc":345,"+].[":346,"23":347,")*":348,"SCC":349,"sc":350,"@](":351,"ncc":352,"NCCC":353,"CCCNC":354,"oc":355,"CCCCO":356,"*]":357,"34":358,"OCc":359,"+]([":360,"@]([":361,"-])[":362,"OCO":363,"nnc":364,"14":365,"NNC":366,"CCNCC":367,"])(":368,"].[":369,"NO":370,"nn":371,"32":372,"Cn":373,"ncnc":374,"])([":375,"CCOc":376,"@]%":377,"-].":378,"-])([":379,"COCC":380,"*)=":381,"CCl":382,"CH":383,"([*]":384,"CCS":385,"([*])=":386,"cccnc":387,"CCCCCCCCC":388,"15":389,"OCCO":390,"OS":391,"ccnc":392,"+]=[":393,"Clc":394,"CBr":395,"(*)=":396,"OCCN":397,"*)":398,"43":399,")-":400,"CSc":401,"CNCC":402,"NCc":403,"CCCO":404,"CCCCCCCCCCCCC":405,"CCn":406,"\\[":407,"CCCCCCCCCCC":408,"OCCOCC":409,"FC":410,"@@]([":411,"ON":412,"CCCCCCCCCCCCCCC":413,"ccccn":414,"/[":415,"CCCCCCCCCC":416,"NOC":417,"NCCN":418,"SCCNC":419,"CCCCCCCCCCCC":420,"Fc":421,"ccncc":422,"ccn":423,")*)":424,"CCCCCCCCCCCCCC":425,"OB":426,"OCCC":427,"+])":428,"-](":429,"CCCOC":430,"COCCN":431,"16":432,"CCSC":433,"csc":434,"OCCCC":435,"*])":436,"Brc":437,"])=":438,"](/":439,"CCCCCCCCCCCCCCCCCC":440,"NCCCC":441,"#[":442,"cccs":443,"[*]":444,"CNc":445,"17":446,"45":447,"Sc":448,"ccco":449,"NCCCN":450,"-][":451,"cH":452,"CCOP":453,"CCCc":454,"nccc":455,"+][":456,"CCCCCCCCCCCCCCCCC":457,"COS":458,"31":459,"(=[":460,"cnn":461,"CCCCNC":462,"cs":463,"-])(":464,"](=":465,"NCCSC":466,"OO":467,"18":468,"ncn":469,"Sn":470,"ncccc":471,"cncc":472,"CCCCOC":473,"OCCOC":474,"CSCC":475,"54":476,"Fe":477,"+].":478,"NCCc":479,"Mg":480,")*)[":481,"CCCS":482,"-]#[":483,"CCCl":484,"[*])":485,"Cu":486,"Li":487,"Zn":488,"SCc":489,"CNS":490,"].":491,")*)(":492,"NCCO":493,"no":494,"COCCC":495,"OH":496,"Ca":497,"24":498,"CP":499,"cccn":500,"ClC":501,"CCCOc":502,"*)(=":503,"Co":504,"OCOc":505,"Al":506,"CCCCOc":507,"CCNc":508,"*)[":509,"NCCOC":510,"+]=":511,"CNCCC":512,"OCCOCCOCCOCC":513,"CCCCCN":514,"NCCS":515,"Se":516,"CCNS":517,"NCCNC":518,"As":519,"CNCCN":520,"Ni":521,"coc":522,"ccsc":523,"Ru":524,"NNc":525,"Cr":526,"noc":527,"19":528,"OCCNC":529,"OCOC":530,"56":531,"41":532,")*)*":533,"([*])":534,"ccoc":535,"42":536,"CON":537,"*])[":538,")=[":539,"CCCNCC":540,"SCCC":541,"CCCCc":542,"](*)":543,"OCCCN":544,"Pb":545,"CF":546,"CCCCCCCCCCCCCCCCCCC":547,"cncn":548,"COCCOC":549,"OCCCCCC":550,"sccc":551,"-])/":552,"Pd":553,"CCSCC":554,"CNCc":555,"35":556,"cnccc":557,"-]#":558,"65":559,"*)(":560,"CCBr":561,"+])[":562,"CSSC":563,"Ti":564,"22":565,"Rh":566,"on":567,"CCCCS":568,"COCCOCC":569,"CCCCCCN":570,"ClCc":571,"CCCCCCCCCCCCCCCCCCCC":572,"(\\[":573,"Ba":574,"-]=[":575,"COCc":576,"NNN":577,"CI":578,"SS":579,")*)([":580,"OCCCO":581,"CNN":582,")/[":583,"Mo":584,"Zr":585,"Hg":586,"53":587,"Mn":588,"Pt":589,"COCCNC":590,"CNCCO":591,"CCCCCCCCCCCCCCCCCCCCCC":592,"cnccn":593,"]=":594,"CCP":595,"](\\":596,"CCCCCCCCCCCCCCCCCCCCCCCC":597,"NP":598,"COCCO":599,"CSCCC":600,"OCCCCCCCC":601,"SiH":602,"OOC":603,"CCCCCCCCCCCCCCCCCCCCC":604,"(-*)=":605,"CCOS":606,"OCCc":607,"20":608,"OCCOCCO":609,"CCCCCNC":610,"25":611,"(*)(=":612,"*)([":613,"-]=":614,"CCCCCCOC":615,"CCCn":616,"NSC":617,"OCCCCC":618,"Sb":619,"@](=":620,"-*)":621,"SN":622,"nsc":623,"CCCCCO":624,"CCCCCOC":625,"NON":626,"CCSc":627,"BrCc":628,"co":629,"@@](=":630,"nccn":631,"nccs":632,"Ic":633,"Ag":634,"ncccn":635,"CCCCCCCCN":636,"CCCSC":637,"+]#":638,"NCCCCCC":639,"CCCCl":640,"nccnc":641,"Ir":642,"[*])[":643,"ccnn":644,"Au":645,"*)*":646,"NCCCCC":647,"+]#[":648,")\\[":649,"123":650,"HH":651,")[*]":652,"CSSCC":653,"67":654,"CCCCCCCCCCCCCCCCCCCCCCC":655,"BrC":656,")(/":657,"PH":658,"Te":659,"cnnc":660,"ClCC":661,"nnnn":662,"]=[":663,"occc":664,"CCCCCCCCOC":665,"CCNCCN":666,"(/[":667,"--]":668,"NOCC":669,"76":670,"ns":671,"CCCCn":672,"OCCOc":673,"NCCCOC":674,"onc":675,"COCCCN":676,"CCCCCCCCCCCCCCCCCCCCCCCCC":677,"OCCCOC":678,"CCCCCCCCCCCCCCCCCCCCCCCCCC":679,"SSC":680,"CCOCCO":681,"nnn":682,"CCCOCC":683,"+])=":684,"NSN":685,")*)(=":686,"nonc":687,"Cd":688,"NCCCCN":689,"SCCN":690,"occ":691,"46":692,"CSCCN":693,"CCCCCCCN":694,"64":695,"*[":696,"CCCCCOc":697,"Ge":698,"OCCCl":699,"CCCCCCCCCCCCc":700,"NCCCO":701,"cncnc":702,"(*)[":703,"OCCCCCCC":704,"OCCOCCOCCOCCOCCOCCOCCOCC":705,"33":706,"CNNC":707,"52":708,"@@]%":709,"CCCBr":710,"OCN":711,"OCCCCCCCCCC":712,"])(=":713,"+])(=":714,"SCCS":715,"CCCCCCCOC":716,"CCCCCCCCCCCCCCCCOC":717,"NCCCNC":718,"36":719,"CCOCCN":720,")*)*)*)*":721,"Nn":722,"CNCCCC":723,"BrCC":724,")*)=":725,"COCCCC":726,"CCCCCCCCCc":727,"CCON":728,"26":729,"CCNCc":730,"CCOCCOC":731,"cnnn":732,"75":733,"OCCS":734,"CCCCCCCc":735,"OCCOCCN":736,"CCCCSC":737,"CCCCCCCCCCCCN":738,"++]":739,"Ce":740,"OCCCCCCCCC":741,"scc":742,"(*)":743,"78":744,"OCCCCCCCCCCCCCCCC":745,")(*)[":746,"++].[":747,"86":748,"87":749,"ClH":750,"OCCNCCO":751,"Gd":752,"OCCCNC":753,"CCCCCc":754,"CCOCCC":755,"ncsc":756,"CCCCCCCCCCCCOC":757,"98":758,"Bi":759,"NCN":760,"]([*])":761,"]([*])[":762,"ncnn":763,"NCCOP":764,"Cs":765,"Sr":766,"CCNCCC":767,"=%":768,"La":769,"CNCCOC":770,"CCCCCCCCOc":771,"CCCCCCc":772,"CCCCCCCCCCCCCCCCCCOC":773,"57":774,"OCCCCCCCCCCCC":775,"SCCCC":776,"scnc":777,"CCCCCCCCCCOC":778,"89":779,"97":780,"CCCCCl":781,"CSCc":782,"CCCNc":783,"[*])(":784,"@+]":785,"SSc":786,")(*)":787,"44":788,"Hf":789,"OCCCCCCCCCCC":790,"COCCCNC":791,"CCCCCCNC":792,"CNCCCN":793,"OCCl":794,"OCCOCCOC":795,"OCCCCOC":796,"cscn":797,"-*)=":798,"51":799,"Tl":800,"NCCCOCC":801,"-]([":802,"--](":803,"ONC":804,"Pr":805,"]\\":806,"])\\":807,":*)":808,"CCCCCCCCO":809,"CCCCCCO":810,"NCCCn":811,"Ga":812,"ncoc":813,"NCCOCCOCC":814,"27":815,"314":816,"CCF":817,"CONC":818,"CNCCc":819,"CCCCCCCCCCCCCCCCCCN":820,"OCCCCCN":821,"NCCCCNC":822,"nsnc":823,"Nd":824,"CNCCNC":825,"CCCCCCCCCCN":826,"CCCNS":827,"CCCCCCOc":828,"NCCCS":829,"COCCn":830,"OCCCc":831,"(:*)":832,"COCN":833,"OCCBr":834,"cscc":835,"CCCCCCCCCCCCO":836,"CCOCCCNC":837,"-])(-*)=":838,"In":839,"CCI":840,"cccnn":841,"NCCCc":842,"91":843,"Nb":844,"OCCCCN":845,"COCOC":846,"CSCN":847,"nncn":848,"OCCOCCOCCO":849,"NCCNc":850,"NNCC":851,"OCCCCCCCCCCCCCC":852,"@@+]":853,"([*])[":854,"ncncc":855,"1234":856,"CSN":857,"OCCOCCOCCOCCO":858,"NCCCCCCNC":859,"IC":860,"COCCOc":861,"CCCCOCC":862,"CCCP":863,"NCCSCC":864,"CCOCCCN":865,"OCCCCCCCCCCCCC":866,"OCCCCCCCCCCCCCCCCCC":867,"PC":868,"SH":869,"CCCCCCCCc":870,"CCCCCCCCNC":871,"NCCOCC":872,"NCCOc":873,"CCOCCOCCOCCOCCOCC":874,"(#":875,"++].":876,"29":877,"OCCCCO":878,"NNS":879,"+](-":880,"cncs":881,"cnoc":882,"NOS":883,"ccncn":884,"OCCOCCOCCOC":885,"28":886,"SCCO":887,"nnnc":888,"*)*)(":889,"Eu":890,"NCCCCCCCC":891,"Rb":892,"]#[":893,"])/[":894,"CCCCP":895,"81":896,"Re":897,"nncc":898,"CCOCc":899,"CCNCS":900,"CCSS":901,"NCCCCCN":902,"Sm":903,"]/":904,")(\\":905,"NCCOCCO":906,"NCCCCCCN":907,"37":908,"CB":909,"NCCCCO":910,"Os":911,"]#":912,"COCCc":913,"CCCCNc":914,"CCCCCCCCCN":915,"-])\\":916,"NCCCl":917,"([*])[*]":918,"*)*)*":919,"])/":920,"ocnc":921,"ccnnc":922,"NCNC":923,"CCCCBr":924,"CCCCCS":925,"CCCCCCCCCOC":926,"+])(":927,"OCCF":928,"NCCn":929,"CCCCCCSC":930,"CCCCCCCCCCCCCCCCCCCCCCCCCCC":931,"ccno":932,"Er":933,"IH":934,"OI":935,"Po":936,"ccon":937,"COCCNCC":938,"CCCCNCC":939,"CSCCNC":940,"CCCCCCCCCCCCOS":941,"-*)[":942,"30":943,"61":944,"NCCNCC":945,"SP":946,"Yb":947,"oncc":948,"sn":949,"CCCOP":950,"COB":951,"COCCCCCCCCCCCCCCCC":952,"OCl":953,"CCCNCCC":954,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":955,"OCCCCCOC":956,"OOO":957,"SeH":958,"*)*)*)*)*":959,"68":960,"NCCCCCCC":961,"Ta":962,"sccn":963,"CCCCCBr":964,"CCOCCNC":965,"NCCNS":966,"NCCNCCNCCN":967,"CCCCCCCCCCCCNC":968,"CCCCCCCCCCCCCCOC":969,"OCCCCCCOC":970,"*)*)=":971,"63":972,"735":973,"Ho":974,"SNC":975,"Tb":976,"CCCCCSC":977,"-]/":978,"CSS":979,")([*])":980,"ncco":981,"CCCOS":982,"47":983,"Dy":984,"COCO":985,"CCCCOP":986,"CCCCCOP":987,"CCCF":988,"CCCSCC":989,"CCCCCCCCOP":990,"CCCCCCCCCCO":991,"CCCCCCCCCCOc":992,"+])([":993,"OCCSC":994,"CSCCCC":995,"CCCCCn":996,"CCCCCCn":997,"CCCCCCCCCCCCCCCCCCCCCCCCCCCC":998,"2345":999,"nnsc":1000,"COCCCOC":1001,"OCCCS":1002,"nocc":1003,"SbH":1004,"NOCc":1005,"SCCOC":1006,"+]\\":1007,"CCOCCOCCN":1008,"cnco":1009,"CCCCCCCCCCCCCCCCN":1010,"CCCCCCCCCCCCCCCCS":1011,"OCCOS":1012,"\\[*]":1013,"conc":1014,"79":1015,"753":1016,"Be":1017,"FS":1018,"[*":1019,"NCl":1020,"OCP":1021,"ClP":1022,"CCCCCCCCCCCCCCCCCCNC":1023,"@](/":1024,"NCCNCCN":1025,"OCCCCl":1026,"NCCCCCO":1027,"TlH":1028,"(*)(":1029,"++]([":1030,"NCO":1031,"On":1032,"SCN":1033,"SCCCCCC":1034,"SCCCS":1035,"Tm":1036,"CCCCNS":1037,"CCCCOCCOC":1038,"OCF":1039,"CCCSc":1040,"CSCCO":1041,"SCF":1042,"+](\\":1043,"CCONC":1044,"@@](/":1045,"nncs":1046,"NNCc":1047,"/[*])":1048,"SSS":1049,"cocn":1050,"(*)([":1051,"48":1052,"55":1053,"FB":1054,"He":1055,"NCCCCCNC":1056,"OCCCCCCCCCCCCCCC":1057,"OCCCCCCCCCCCCCCCCC":1058,"se":1059,")[*])":1060,"CNCCS":1061,"OCCCOCC":1062,"NCCSCc":1063,"CCOCN":1064,"CCCNCCN":1065,"CCOCCOCC":1066,"cnsc":1067,")*)*)":1068,"OCOCC":1069,"OCOCCOC":1070,"([*])([*])":1071,"CCSCCC":1072,"OCCOCCCC":1073,"OCCOCCOCCOCCOCCO":1074,"COCCOCCOC":1075,"74":1076,"BH":1077,"CCB":1078,")[*])[":1079,"ClCCN":1080,"CCCCCCCCS":1081,"CCNN":1082,"OCCn":1083,"CSP":1084,"234":1085,"nnco":1086,"CCSSC":1087,"CCCCCCCCCCCc":1088,"CCCCCCCCCCCCS":1089,"(*":1090,"-*":1091,"73":1092,"NCS":1093,"CCCCCCCCOCC":1094,"BrCCC":1095,"CCOCCOCCOCC":1096,"CCCCCCCCCCCCOc":1097,"CCCCCCCCCCCCOP":1098,"NCCCNCCCCN":1099,"AlH":1100,"*)*)(*)*)(":1101,"23451234":1102,"SO":1103,"SCCc":1104,"SOOO":1105,"snc":1106,"OCNC":1107,")(*)=":1108,"CCCCCCCCCCc":1109,"CCNCCO":1110,"OCCSCC":1111,"CCOCCOCCNC":1112,"COCCNc":1113,"COCCOCCNC":1114,"NCCOCCOCCNC":1115,"*)*)":1116,"Lu":1117,"NCCCCCCCCN":1118,"OCOP":1119,"OCCNCC":1120,"COCCCCC":1121,"CCCI":1122,"CCCCCCCCn":1123,"BrCCc":1124,"CSCCS":1125,"CNCP":1126,"CCCNCCCN":1127,"+](\\[":1128,"CCOCCOCCOCCO":1129,"CCCCCCl":1130,"CCCCCCCO":1131,"CCCCCCBr":1132,"CCCCCCCOc":1133,"COCCS":1134,"OCCNc":1135,"CCCCCCCCCCCOC":1136,"CCCCCCCCCCCCn":1137,"OCCCCCCO":1138,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1139,"(*)*":1140,"/*)":1141,"96":1142,"ONc":1143,"Xe":1144,"COO":1145,"CNCCNCc":1146,"CCCCCCCCSC":1147,"CCCCCCCCCCNC":1148,"OCCCOc":1149,"CSSCCC":1150,"])*":1151,"CCOCCOCCOC":1152,"CCCCCCS":1153,"CCCCCCCCCCCCCCCCOc":1154,"CCCCCCCCCCCCCCCCOP":1155,"CCCCCCCCCCCCCCCCCCOCC":1156,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1157,"CCCCCCCNC":1158,"NCCCSC":1159,"COCCCOc":1160,"CCSSCC":1161,"CNCCCO":1162,"CCCOCCC":1163,"/[*]":1164,"CCCCCCCCCCOP":1165,"NCCNCCO":1166,"ccns":1167,"OCCCCc":1168,"456":1169,"OCCCCCCS":1170,"OCCCCCCOc":1171,"94":1172,"FCC":1173,"NI":1174,"NCOC":1175,"OOCC":1176,"SSCC":1177,"](*)[":1178,"COOC":1179,"CCCCCCOCC":1180,"CCCCCNc":1181,")(*)*":1182,"CNCCCNC":1183,"CCCCCCCCCCS":1184,"CCCCCCCCCCn":1185,"+]/":1186,"NCCOCCOCCO":1187,"NCCOCCOCCN":1188,"-])=[":1189,"CCCCCCCOP":1190,"CCSCc":1191,"OCCOCCC":1192,"CCCOCCOC":1193,"OCCOCCOCC":1194,"CCCCCCCCCCCCCOC":1195,"CCCCCCCCCCCCCCCO":1196,"OCCCCNC":1197,"CCCCCCCCCCCCCCCCCCOP":1198,"NCCCCNCCCN":1199,"COCCOCCO":1200,"COCCOCCOCC":1201,"NCCCCCCO":1202,"CCOCCOCCOCCOCCOCCOCCNC":1203,"--].[":1204,"/*":1205,"62":1206,"83":1207,"OOS":1208,"OCCCCCCCCCCCCCCCCCCCC":1209,"Pc":1210,"SCl":1211,"SCS":1212,"CNOC":1213,"CNCCCCN":1214,"ClCCc":1215,"CCCCCCCCCCCN":1216,"CCCCCCCCCCCO":1217,"ncon":1218,"CCNCCCC":1219,"+])/":1220,"OCCOP":1221,"BrBr":1222,"-])*)[":1223,"NCCF":1224,"CSCCCCC":1225,"CSSSC":1226,"CCCCCCCCCCCCCCCCCOC":1227,"CCCCCCCSC":1228,"CCCNCc":1229,"345":1230,"COCCCO":1231,"CCSCCN":1232,"CCCCCCCCCBr":1233,"OCCNS":1234,"CCCCCCCCCCCCSC":1235,"CCCCCCCCCCCCCOP":1236,"OCCCCCl":1237,"csnn":1238,"*)(*)*":1239,"BiH":1240,"[*][":1241,"--][":1242,"59":1243,"71":1244,"NOCCO":1245,"SCCCN":1246,"](-*)":1247,"NCn":1248,"CCCCOCCOCC":1249,"CCCCCCNc":1250,"OCn":1251,"CNCCCCC":1252,"ClCCC":1253,"ClCCCN":1254,"CCCCCCCCOS":1255,"NCCP":1256,"CSCCCCCC":1257,"])\\[":1258,"(-[":1259,"CCCCCCCCCCCCCCCCOCC":1260,"CCCCCCCBr":1261,"CCNCCP":1262,"CCCOCCOCC":1263,"357":1264,"cocc":1265,")#":1266,"*=[":1267,"-[":1268,"58":1269,"72":1270,"85":1271,"=*":1272,"OF":1273,"OON":1274,"ccsn":1275,"COCOc":1276,"CCCCSCC":1277,"CCCCCNS":1278,"CNO":1279,"CCCCCCCCP":1280,"CCCCCCCCCO":1281,"CCCCCCCCCS":1282,"CCCCCCCCCCOCC":1283,"CCNCCCN":1284,"CCNCCNC":1285,"OCCP":1286,"-])*":1287,"NCCCNCC":1288,"NCCCOCCOCC":1289,"CCOCCS":1290,"CCOCCOCCOCCN":1291,"CCOCCCn":1292,"CCCCNCCC":1293,"SCCSC":1294,"COCCCl":1295,"CCSP":1296,"CCSSCCC":1297,"CCCON":1298,"CCCCCCCCCCCCCCN":1299,"CCCCCCCCCCCCOCC":1300,"NCCCCSC":1301,"cnns":1302,"AsH":1303,"CCNCCNCCNCC":1304,"COCCCNc":1305,"*)*)*)*)*)":1306,"++][":1307,"39":1308,"312":1309,"69":1310,"82":1311,"BOB":1312,"FP":1313,"IN":1314,"ICC":1315,"NOc":1316,"OSC":1317,"SCCCCC":1318,"Tc":1319,"]/[":1320,"ssc":1321,"sncc":1322,"snnc":1323,"COCCCCCCCCCCCCCCCCCC":1324,"NCP":1325,"CCCCB":1326,"CCCCNCCCN":1327,"-]/[":1328,"CCNCCOC":1329,"OCCCNCC":1330,"OCCSS":1331,"BrCCCC":1332,"BrCCOc":1333,"CSCCCCCCCCC":1334,"CNCN":1335,"CCCNN":1336,"+](/[":1337,"118":1338,"CCCCCCOP":1339,"CCCCCCCCCCCCCCCCCCCCOC":1340,"CCOO":1341,"SCCCO":1342,"SCCSCC":1343,"CCCCOCCCNC":1344,"341":1345,"NOCCN":1346,"CNCCCOC":1347,"CCCCCCCCCCCBr":1348,"CCCCCCCCCCBr":1349,"CCCCCCCCCCCCCCc":1350,"OCCCCCCN":1351,"NCCCCc":1352,"NCCCCOC":1353,"[*]\\":1354,"NCCCNS":1355,"OCCOCn":1356,"CCCSP":1357,"COCCCn":1358,"OCCOCCOCCOCCOC":1359,"OCCOCCOCCOCCOCCOCCOCCO":1360,"COCCOCc":1361,"COCCOCCOCCOC":1362,"CCCCCCCCCCCCCCCCCCCCCCOC":1363,"SSSSC":1364,"*)*)*)":1365,"nscc":1366,"CNCCCCCCOCC":1367,"*)*)*)*":1368,"*)*)*)*)*)*)*)*)*":1369,"NCCNCCNCCNCCN":1370,"NCCCCCCCCNCCCCCCCCN":1371,"2123":1372,"38":1373,"93":1374,"NCCCCCCCCCC":1375,"NOCOCCOC":1376,"OCCCCCCCCCCCCCCCCCCC":1377,"SOC":1378,"SCSc":1379,"Th":1380,"\\*)(":1381,"ss":1382,"](*)(*)*":1383,"COCCCCCCCC":1384,"CCCCCNCC":1385,")(-*)=":1386,"ClB":1387,"CCCCCCCCBr":1388,"CCCCCCCCCCCNC":1389,"CCNCCc":1390,"cccccc":1391,"NCCCOc":1392,"NCCOCCN":1393,"NCCSc":1394,"NCCOCCOC":1395,"NCCCOCCOC":1396,"CSCCCCCCC":1397,"CSCCl":1398,"CCCNCCOC":1399,"CCOCCn":1400,"CCOCCCO":1401,"CCCCCCP":1402,"CCCCCCCCCCCCCCCCO":1403,"CCCCCCCCCCCCCCCCNC":1404,"CCOCO":1405,"CCOCOC":1406,"cnncc":1407,"SCCn":1408,"NCCCF":1409,"COCCSC":1410,"OCCON":1411,"CCCOCCN":1412,"OCCOCCOCCNC":1413,"CCCCCCCCCCCCCCCc":1414,"CCCCCCCCCCSC":1415,"CCCCCCCCCCCCCN":1416,"OCCCBr":1417,"OCCCSC":1418,"-](/":1419,"OCCCCS":1420,"OCCCCBr":1421,"OCCCCOc":1422,"NCCCNCCCCNC":1423,"NCCCNCCCCNCCCN":1424,"csnc":1425,"ncno":1426,"CNCCNCCNCCN":1427,"567":1428,"*])[*]":1429,"COCCOCCOCCOCC":1430,"COCCCNS":1431,"NCCCCNCCCNC":1432,"OCCCCCCCCCCCOC":1433,"*)*)*)*)*)=":1434,"/*)/":1435,"92":1436,"95":1437,"99":1438,"At":1439,"NB":1440,"NCCCCCCCCCCC":1441,"ONCC":1442,"SCNC":1443,"SOO":1444,"](=[":1445,"al":1446,"COCOCC":1447,"COCCCCCCCCCC":1448,"COCCCS":1449,"NCSC":1450,"CCCCI":1451,"CCCCCOCC":1452,"CCCCOCCCN":1453,"CNSC":1454,"CNCCNCC":1455,"CCCCCCCCNCCCN":1456,"COCn":1457,"COCNC":1458,"OCCI":1459,"@]/":1460,"BrCCN":1461,"NCCBr":1462,"NCCCNc":1463,"NCCCOCCO":1464,"CSCCCCCCCC":1465,"CCCCCI":1466,"CCOCP":1467,"CCOCn":1468,"SCn":1469,"+](=[":1470,"CCCNCCNC":1471,"101":1472,"+](/":1473,"CCOCCCl":1474,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1475,"CCOCCOCCOCCOCCO":1476,"CCCCCCCl":1477,"CCOB":1478,"CCCCCCCS":1479,"CCCCNCCCCN":1480,"SCCSCCS":1481,"CCCCON":1482,"nnccc":1483,"COCCBr":1484,")-[":1485,"CCCOCCO":1486,"CCCCCCCCCCCCCCO":1487,"CCCCCCCCCCCCCCOc":1488,"OCCCCCOc":1489,"NCCCCl":1490,"NCCCCCCCN":1491,"NCCCCNS":1492,"NCCSSCCNC":1493,"COCCOCCOCCO":1494,"COCCOCCOCCOc":1495,"COCCOCCOCCOCCOCCO":1496,"SSSC":1497,"SSSS":1498,"COCCOCCCC":1499,"COCCOCCC":1500,"COCCOCCN":1501,"OCCCCCCCCOC":1502,"*)*)(*)*":1503,"NCCCCCCCCCCNC":1504,"NCCCNCCCCNCCCNC":1505,"(*)*)*":1506,"(*)*)=":1507,"*-":1508,"66":1509,"656":1510,"77":1511,"711":1512,"84":1513,"88":1514,"@+](":1515,"BO":1516,"NCCCCCCCCCCCCCCCCCC":1517,"NNCCO":1518,"OBr":1519,"OOP":1520,"Rn":1521,"SI":1522,"SCSC":1523,"cco":1524,"COn":1525,"COCCCCN":1526,"NCNc":1527,"CCCCF":1528,"CCCCCOS":1529,"CCCCCCNS":1530,"OCI":1531,"OCS":1532,"CNP":1533,"CNCCCCCC":1534,"CNCCNS":1535,"CNCCOCCO":1536,"CCCCCCCCCCOS":1537,"CCNP":1538,"+][*]":1539,"OCCNCc":1540,"NCCCOCCC":1541,"CSNC":1542,"CSCSC":1543,"CSCCSC":1544,"CCCCCP":1545,"CCCNCCCCN":1546,"CCCNCCNCCC":1547,"=[*]":1548,"CCOCCOc":1549,"NSc":1550,"CCCCCCCCCCCCCCCCCc":1551,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1552,"CCCCCCCCCCCCCCCCCCOc":1553,"CCOCCCC":1554,"CCOCCCCNC":1555,"(\\[*])":1556,"SCCl":1557,"])(\\":1558,"ncncn":1559,"CCSCCNC":1560,"CCCOCCCC":1561,"CCCCCCCCCCCS":1562,"CCCCCCCCCCCCCc":1563,"CCCCCCCCCCCCCCCN":1564,"COCCNS":1565,"454":1566,"OCCOCCOCCOCCOCCOCC":1567,"SCCCSC":1568,"229":1569,"CCCCCCNCCC":1570,"COCCNCc":1571,"COCCOS":1572,"CSCCCSC":1573,"OCCCCCCCCCCOC":1574,"OCCOCCOCCN":1575,")*)*)*)*)*)*":1576,"NCCOCCOCCOCCNC":1577,"CCOCCOCCOCCOCCN":1578,"CNCCCCCCOCCOCc":1579,"*:":1580,"*=":1581,"*#[":1582,"++](":1583,"40":1584,"49":1585,"467":1586,"50":1587,"60":1588,"70":1589,"80":1590,"Ac":1591,"Ar":1592,"FCc":1593,"NBr":1594,"NCCCCCCCCC":1595,"NOCCOC":1596,"OCCCCCCCCCCCCCCCCCCCCCC":1597,"OCCCCCCCCCCCCCCCCCCCCC":1598,"PN":1599,"Ra":1600,"SB":1601,"SCCNCC":1602,"SCCCCCCCCCCCC":1603,"SSCCC":1604,"\\*":1605,"op":1606,"sscc":1607,"@@+](":1608,"COOCC":1609,"COCCCCCC":1610,"COCCCCNC":1611,"COCCCCOC":1612,"COCCCCCCCCCCCCCCCCCCCC":1613,"NCNCCCC":1614,"CCCCOCCO":1615,"CCCCOCCNC":1616,"OCSC":1617,"]([*]":1618,"CNCOC":1619,"CNOCC":1620,"CNNN":1621,"CNCCOc":1622,"CNCCCc":1623,"CNCCCS":1624,"ClCCn":1625,"ClCCCc":1626,"ClOCl":1627,"-](=":1628,"CCCCCCCCCl":1629,"CCCCCCCCCNC":1630,"CCCCCCCCCOP":1631,"CCCCCCCCNS":1632,"CCCCCCCCCSC":1633,"CCCCCCCCCOCC":1634,"CCCCCCCCON":1635,"CCNCCCNCC":1636,"+]*)":1637,"OCCCOP":1638,"OCCSSC":1639,"BrP":1640,"BrCCOC":1641,"BrCCn":1642,"125":1643,"-])-":1644,"NCCOCc":1645,"NCCNCc":1646,"NCCON":1647,"NCCOCCNC":1648,"NCCOCCOCCOCCOCCOCCOCCOCCOCC":1649,"CSCCCN":1650,"CSCCCO":1651,"CCCCCF":1652,"NNCCN":1653,"])-":1654,")([*])[*]":1655,"102":1656,"131":1657,"CCOCCc":1658,"CCOCCCOC":1659,"CCOCCOCCO":1660,"CCOCCCNCC":1661,"CCOCCOCCOCCOC":1662,"CCCCCCI":1663,"CCCCCCCOCCCN":1664,"NSS":1665,"NSCC":1666,"CCCCCCCCCCCCCCCCCN":1667,"CCCCCCCCCCCCCCCCCCc":1668,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1669,"CCCCCCCCCCCCCCCCSc":1670,"CCCCCCCCCCCCCCCCCCCCCCN":1671,"CCOOC":1672,"cnon":1673,"cnsn":1674,")\\*":1675,"CCCCNO":1676,"SCCCOC":1677,"NCCCBr":1678,"CCCCOS":1679,"CCCCOCCN":1680,"+]([*])":1681,"COCCl":1682,"COCCCOCC":1683,"CCSN":1684,"CCSCCCC":1685,"CCSCCO":1686,"CCSSc":1687,"OCCNCCC":1688,"OCCNCCOC":1689,"CNCCCl":1690,"CNCCSC":1691,"CNCCOP":1692,"CCCOCCCN":1693,"CCCOCCCNC":1694,"OCCOCCOc":1695,"CCCCCCCCCCP":1696,"CCCCCCCCCCCl":1697,"CCCCCCCCCCCOP":1698,"NCCNCCNC":1699,"CCCCCCCCCCCCCCOCC":1700,"CCCCCCCCCCCCCOS":1701,"CCCCCCCCCCCCCCCOC":1702,"OCCCn":1703,"CCCOCc":1704,"OCCCCOP":1705,"OCCCCCCNC":1706,"])=[":1707,"CCCCCCCCCCCCCCCCCCP":1708,"NCCCCCOC":1709,"NCCCCOCC":1710,"NCCCCCCNc":1711,"NCCCNCCCN":1712,"CSCCCl":1713,"CCCSCCC":1714,"NCCSSC":1715,"NCCSSCC":1716,"NCCSSCCN":1717,"CNCCNCCN":1718,")*)*)=":1719,"OCCCCCCCl":1720,"COCCOCCOCCN":1721,"COCCOCCOCCOCCN":1722,"COCCOCCOCCOCCOC":1723,"CCCCCCNCCCC":1724,"]=*":1725,"OCCOCCOS":1726,"GeH":1727,"OCCOCCOCCOCCOCCOCCOCCOCCOCCO":1728,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1729,")*)*)*)*)*":1730,"OCCSCCOC":1731,"579":1732,"([*])[*])":1733,"CCOCCOCCOCCOCCOCCOC":1734,"ClCCNP":1735,"CCOCCOCCOCCOCCNC":1736,"NCCOCCOCCOCCC":1737,"NCCOCCOCCOCCN":1738,"NCCCOCCOCCOCCCN":1739,"NCCCOCCOCCOCCCNC":1740,"OCCSSCCOC":1741,"OCCSSCCO":1742,"*)*)*)*)*)*)*)*)*)*)":1743,"#*":1744,"(*)*)(*)*)(":1745,"*)*)[":1746,".*:":1747,"113":1748,"4123":1749,"557":1750,"90":1751,"=*)*)*)*":1752,"BB":1753,"Cm":1754,"FN":1755,"FCl":1756,"FCCC":1757,"FCCOC":1758,"NF":1759,"NCCCCCCCCCCCCCCCC":1760,"NCCCCCCCCCCCC":1761,"NNCCc":1762,"NCCCCCCCCCCCCN":1763,"OCCCCCCCCCCCCOC":1764,"Pu":1765,"SF":1766,"SCCCCCCCCCC":1767,"SCCCc":1768,"\\*)":1769,"]*":1770,"]\\[":1771,"(=*)":1772,"COSC":1773,"COCCCCCCCCC":1774,"COCCCCCCCCCCCC":1775,"NCNCCCCC":1776,"CCCCSc":1777,"OCBr":1778,")(*)(":1779,")(*)*)(*)*)(":1780,"CNCCCCO":1781,"CNNCc":1782,"CNCCCCNC":1783,"CNCCCNCC":1784,"CNCCCCCCN":1785,"ClS":1786,"ClCl":1787,"ClCCOP":1788,"ClCCCl":1789,"ClSS":1790,"-]%":1791,"CCCCCCCCl":1792,"CCCCCCCCCCl":1793,"CCCCCCCCNCCCC":1794,"CCCCCCCCCCOCCO":1795,"CCCCCCCCCCOCCC":1796,"CCCCCCCCOCCOS":1797,"CCNNC":1798,"CCNCCNCC":1799,"+]/[":1800,"OCCSc":1801,"OCCCON":1802,"OCCCNCCCO":1803,"@]\\":1804,"BrCCCCN":1805,"BrCCCc":1806,"-])/[":1807,"NCCOCCC":1808,"NCCOCCOCCOCCOCC":1809,"NCCOCCOCCOCCOCCOCCO":1810,"CSI":1811,"CSO":1812,"CSCO":1813,"CSCOC":1814,"CSCS":1815,"CSCNC":1816,"CSCCCNC":1817,"CSCSCC":1818,"CSCCCS":1819,"CSCCNc":1820,"NNNC":1821,"])*)=":1822,"CNCNC":1823,"(-*)":1824,"(-*)(=":1825,"(/[*])[":1826,"10467":1827,"213":1828,"CCOCCl":1829,"CCOCCBr":1830,"CCOCCCNc":1831,"CCCCCCCCCCCCCCCCc":1832,"CCCCCCCCCCCCCCCCNS":1833,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1834,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":1835,"CCOCCCCCC":1836,"CCOCCNc":1837,"CCCCCCCn":1838,"CCCCNP":1839,"CCCCNCCCC":1840,"@](\\":1841,"NCCCSCC":1842,"CCCCOB":1843,"CCCCOCCC":1844,"*])=":1845,"343":1846,"OCOCCOCCO":1847,"nncnn":1848,"CCNCCCO":1849,"])(*)*":1850,"COCCCOCCOC":1851,"CCSNC":1852,"CCSCCOC":1853,"CCSSCCNC":1854,"CCSSSC":1855,"CCCCCCCCCI":1856,"OCCOO":1857,"CNCCCOc":1858,"CNCCSCC":1859,"CNCCCOCC":1860,"CCCOCCOCCO":1861,"CCCOCCOCCOCCOCCOCCOCC":1862,"CCCCCCCCCCCCCNC":1863,"OCCOCCOCCS":1864,"CCCCCCCCCCCCCCCBr":1865,"CCCCCCCCCCI":1866,"NCCNCCCNCCN":1867,"CCCCCCCCCCCCP":1868,"CCCCCCCCCCCCCO":1869,"CCCCCCCCCCCCNCC":1870,"CCCCCCCCCCCCCOCC":1871,"CCCCCCCCCCCCSCCC":1872,"CCCCCCCCCCCCOCCOCCOCCO":1873,"CCCCCCCCCCCCOCCOS":1874,"CCCCCCCCCCCCCCS":1875,"CCCCCCCCCCCCCCCOCC":1876,"OCCCF":1877,"OCCCCI":1878,"OCCCCCS":1879,"OCCCCOCCCO":1880,"CCCCCCCCCCCCCCCCCCBr":1881,"[*])=":1882,"NCCCNCCN":1883,"318":1884,"OOOC":1885,"ncns":1886,"CCCCOCN":1887,"CCCSSC":1888,"CCCSSCCCC":1889,"[*])-":1890,"OCCOCCOCCOCCOc":1891,"OCCOCCOCCOCCOCCOCCOCCOCCO":1892,"NCCSS":1893,"197":1894,"5678":1895,"4253":1896,"OCCCNCCO":1897,"OCCCCCCl":1898,"*)(*)=":1899,"CCCCSCCCC":1900,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1901,"COCCOCCOCCOCCOCCOCCO":1902,"COCCOCCOCCOCCOCCOC":1903,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1904,"COCCOCCOCCOCCOCC":1905,"CCCCCCCCCCCCCCCCCCCCCO":1906,"(\\[*])[*]":1907,"SSN":1908,"SSCCCCCCO":1909,"537":1910,"CCCCCCCCCCCCCCCCCCCCCCCCCO":1911,"CCCCCCCCCCCCCCCCCCCCCCCCOC":1912,"CCCCCCCCCCCCCCCCCCCCCCCCCCCO":1913,"COCCOCCCNC":1914,"OCCCCCCCCCCOc":1915,"OOCl":1916,"201":1917,"CCCCCCCCNCCCCCCCC":1918,"NCCCCCCBr":1919,"CCNCCNCCN":1920,"468":1921,"OCCCCCCCc":1922,")*)*)*)*)*)*)*)*)*)*":1923,"CCCCCCCCCCCCNCCC":1924,"869":1925,"OCCCNCc":1926,"8915":1927,"@+]%":1928,"OCCOCCOCCOCCC":1929,"12345678":1930,"OCCOCCOCCOCCOS":1931,"NCCSCCCO":1932,"CCOCCOCCOCCOCCOCCNC":1933,"CCOCCOCCOCCOCCOCCOCCO":1934,"CCOCCOCCOCCOCCOCCOCCOCCOCCNC":1935,"234567":1936,"[*+":1937,"[*-]":1938,"CCOCCOCCOCCOCCC":1939,"(*)*)*)(":1940,"CCCCOCCOCCOP":1941,"CCCOCCOCCOCCOCCOCCOC":1942,"CCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1943,"@]/%":1944,"CNCCCCCCOCCCCc":1945,"CNCCCCCCNCCCCCCCCNCCCC":1946,"ClSSCl":1947,"(/[*])[*]":1948,"CCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1949,"123456789":1950,"(#[":1951,"*(":1952,"**":1953,"*/":1954,"++])=":1955,"--]([":1956,"/*)(=":1957,"212":1958,"245":1959,"321":1960,"642":1961,"6123":1962,"696":1963,"713":1964,"822":1965,"846":1966,"912":1967,"933":1968,"=*)":1969,"Bc":1970,"FCOC":1971,"IB":1972,"IP":1973,"ICCC":1974,"ICc":1975,"Kr":1976,"Ne":1977,"NNCCCN":1978,"NOCCCN":1979,"NCOCCCC":1980,"NCCCCCCCCO":1981,"NCCCCCCCCCCN":1982,"Op":1983,"ONO":1984,"ONCc":1985,"OOCCCC":1986,"OCCCCCNC":1987,"PO":1988,"Pa":1989,"PCC":1990,"PCCP":1991,"Rf":1992,"SNCC":1993,"SCCOCC":1994,"SCCCCCCC":1995,"SCCCCCCCCCCC":1996,"SCCCCl":1997,"SCCOCCO":1998,"SCCOCCN":1999,"SCCCCSC":2000,"]*)[":2001,"(=*)([":2002,"](*)(":2003,"](*)([":2004,"](-*)[":2005,"ccs":2006,"ccocc":2007,"@@+]([":2008,"COI":2009,"COCCCCCCC":2010,"CONCCC":2011,"CONCc":2012,"COCCCCCCCCCCCCCC":2013,"COCCCc":2014,"COCOCCC":2015,"COCCCCS":2016,"COCCCCCNC":2017,"NCNS":2018,"NCSCC":2019,"CCCCNN":2020,"CCCCOCc":2021,"CCCCCSc":2022,"CCCCCSCC":2023,"CCCCCON":2024,"CCCCCCCNCC":2025,"CCCCCOCCOC":2026,"CCCCOCCOCCOC":2027,"CCCCCCOCCCN":2028,"CCCCOCCOCCCC":2029,")(*)(*)*":2030,"CNn":2031,"CNCO":2032,"CNNc":2033,"CNOCc":2034,"CNCCCCOC":2035,"CNCCCCc":2036,"CNCCCCCO":2037,"CNCCCCl":2038,"CNCCOCCOC":2039,"CNCCCCCCO":2040,"ClI":2041,"Cln":2042,"ClCOC":2043,"ClCCNC":2044,"ClCCO":2045,"ClCn":2046,"ClCCl":2047,"ClCSc":2048,"ClCCCCc":2049,"ClCOCc":2050,"ClCCSc":2051,"-]*":2052,")(=[":2053,"CCCCCCCCCOc":2054,"CCCCCCCCOCCO":2055,"CCCCCCCCOCCOCC":2056,"CCCCCCCCSc":2057,"CCCCCCCCCNS":2058,"CCCCCCCCCCNS":2059,"CCCCCCCCCON":2060,"CCCCCCCCCCOCCCN":2061,"CCCCCCCCCCSS":2062,"CCCCCCCCCSCCCC":2063,"CCCCCCCCCOCCOS":2064,"CCCCCCCCCCOCCOCCOCCOCCOCCOCCO":2065,"nco":2066,"ncs":2067,"ncnnc":2068,"COCP":2069,"COCS":2070,"COCBr":2071,"CCNO":2072,"CCNNCC":2073,"CCNSC":2074,"CCNCCCCNCC":2075,"CCNCCCCNCCCCN":2076,"+]%":2077,"+])=[":2078,"OCCOCc":2079,"OCCOCO":2080,"OCCCOCCN":2081,"OCCCOS":2082,"OCCCNS":2083,"OCCSCCC":2084,"OCCCOCCOC":2085,"OCCCOCc":2086,"OCCSCCS":2087,"@]=":2088,"BrB":2089,"BrCCCN":2090,"BrCCCn":2091,"121":2092,"127":2093,"@@]/":2094,"@@]\\":2095,"-])*)*":2096,"NCCCOP":2097,"NCCCOCCN":2098,"NCCOCCS":2099,"NCCOCCOCCOC":2100,"NCCOCCBr":2101,"NCCCOCCOCCO":2102,"NCCOCCOCCOCCOCCOCCOCCOCCO":2103,"CSCCOC":2104,"CSCCCCN":2105,"CSSc":2106,"CSCCCCCN":2107,"CSSCCN":2108,"CSSCCO":2109,"CSOOO":2110,"CSSSSSC":2111,"CSSSSC":2112,"NNCCCC":2113,"NNNN":2114,")/*":2115,")([*])[":2116,"OPO":2117,"OPOC":2118,"CCCNO":2119,"CCCNNC":2120,"CCCNCCCC":2121,"CCCNCCCNC":2122,"CCCNCCS":2123,"100":2124,"103":2125,"1045":2126,"10345":2127,"10642":2128,"+](*)":2129,"133":2130,"CCOCCI":2131,"CCOCCOS":2132,"CCOCCOCCC":2133,"CCOCCOCCCC":2134,"CCOCCCNCCN":2135,"CCOCCOCCOCCOCCOCCO":2136,"NaH":2137,"111":2138,"CCCCCCF":2139,"CCCCCCOS":2140,"CCCCCCOCCC":2141,"CCCCCCCOCCC":2142,"CCCCCCSCCC":2143,"CCCCCCCOCCO":2144,"NSNS":2145,"CCCCCCCCCCCCCCCCP":2146,"CCCCCCCCCCCCCCCCCO":2147,"CCCCCCCCCCCCCCCCNc":2148,"CCCCCCCCCCCCCCCCCCO":2149,"CCCCCCCCCCCCCCCCCCCCN":2150,"CCCCCCCCCCCCCCCCSCC":2151,"CCCCCCCCCCCCCCCCCOCC":2152,"CCCCCCCCCCCCCCCCCCS":2153,"CCCCCCCCCCCCCCCCOCCO":2154,"CCCCCCCCCCCCCCCCCCSC":2155,"CCCCCCCCCCCCCCCCCCCc":2156,"CCCCCCCCCCCCCCCCCCCCc":2157,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2158,"CCOOCC":2159,"CCOCCCCO":2160,"CCOCCNCC":2161,"CCOCOCC":2162,"CCOCCCS":2163,"CCOCCNS":2164,"@@](*)(":2165,"(\\[*])=":2166,"CCCCCCCP":2167,"CCCCNCCCCNCC":2168,"238":2169,"SCCCl":2170,"SCCBr":2171,"SCCOP":2172,"NCCCNCc":2173,"CCCCOCCCC":2174,"CCCCOOC":2175,"CCCCOCOCCCC":2176,"346":2177,"OCON":2178,"OCOS":2179,"nncnc":2180,"NNCNNC":2181,"CCNCCCOC":2182,"CCNCCSC":2183,"CCNCCSS":2184,"])(*)[":2185,"COCCF":2186,"([*])(":2187,"([*])(=":2188,"CCSCCCCCCCCCCCC":2189,"CCSSCCN":2190,"CCCCCCCCCF":2191,"151":2192,"OCCOCCCCCC":2193,"OSOO":2194,"OCCNCCCN":2195,"OCCNCCCS":2196,"CCCOO":2197,"CCCOCCCCC":2198,"CCCOCCNC":2199,"\\[*])":2200,"CCCCCCCCCCCI":2201,"CCCCCCCCCCCP":2202,"CCCCCCCCCCCSCC":2203,"OCCOCCF":2204,"OCCOCCS":2205,"OCCOCCCOC":2206,"OCCOCCSC":2207,"OCCOCCOCCOc":2208,"OCCOCCOCCF":2209,"CCCCCCCCCCF":2210,"NCCNCCCC":2211,"NCCNCCC":2212,"CCCCCCCCCCCCl":2213,"CCCCCCCCCCCCCl":2214,"CCCCCCCCCCCCBr":2215,"CCCCCCCCCCCCNc":2216,"CCCCCCCCCCCCSCC":2217,"CCCCCCCCCCCCOCCO":2218,"CCCCCCCCCCCCCNc":2219,"CCCCCCCCCCCCOCCOC":2220,"CCCCCCCCCCCCCOCCO":2221,")*)#":2222,"CCCCCCCCCCCCCCBr":2223,"CCCCCCCCCCCCCCOP":2224,"CCCCCCCCCCCCCCOS":2225,"OCCCI":2226,"OCCCP":2227,"COCCNN":2228,"COCCNCCNC":2229,"COCCNCCNS":2230,"OCCCCCO":2231,"OCCCCOCC":2232,"OCCCCCc":2233,"OCCCCCCOCC":2234,"OCCCCNCc":2235,"NCCCCI":2236,"NCCCCn":2237,"NCCCCBr":2238,"NCCCCCS":2239,"NCCCCNc":2240,"NCCCCCCOC":2241,"NCCCCOCCOC":2242,"NCCCCCCNS":2243,"4567":2244,"NCCCNCCS":2245,"NCCCNCCCNCCCN":2246,"NCCCNCCSP":2247,"+][*])[":2248,"-])(*)=":2249,"](=*)*":2250,"OOCCCCO":2251,"OOOO":2252,"CSCCSCC":2253,"CSCCSCCS":2254,"CCCSN":2255,"CCCSSc":2256,"CCCSSCCC":2257,"CNCCCP":2258,"CNCCCn":2259,"CNCCCBr":2260,"CNCCCSC":2261,"OCCOCCOCCOCCNC":2262,"OCCOCCOCCOCCOCCOC":2263,"OCCOCCOCCOCCOCCOCCO":2264,"OCCOCCOCCOCCOCCOCCN":2265,"OCCOCCOCCOCCOCCOCCOCCOC":2266,"NCCSP":2267,"NCCSCCN":2268,"CNCCNCCCNCCNC":2269,"OCOCc":2270,"564":2271,")*)*)*":2272,")*)*)*)":2273,"SCCCSCC":2274,"PbH":2275,"OCCCCCCSSCCCCCCO":2276,"CCSCCS":2277,"CCSCCCO":2278,"CCSCCCl":2279,"CCSCCSCC":2280,"CCSCCSP":2281,"*)(*)*)(*)*)(":2282,"228":2283,"CCCCSP":2284,"CCCCSCCO":2285,"COCCOCCl":2286,"COCCOCCCOC":2287,"COCCOCCOc":2288,"COCCOCCOS":2289,"COCCOCCOCCC":2290,"COCCOCCOCCCN":2291,"COCCOCCOCCOCCO":2292,"COCCOCCOCCS":2293,"CCCCCCNO":2294,"CCCCCCNCCCCC":2295,"SSCCCC":2296,"SSCCCCCCCC":2297,"CNCCOCCC":2298,"CCCCCCCCCCCCCCCCCCCCCCCO":2299,"CCPC":2300,"CCPCC":2301,"CCCCCCCCCCCCCCCCCCCCCCCCCOC":2302,"COCCOO":2303,"COCCOCCNCC":2304,"CSCCCSCC":2305,"OCCCCCCCCNC":2306,"OCCCCCCCCCOC":2307,"CCOSOOO":2308,"202":2309,"203":2310,"252":2311,"CCCCCCOCc":2312,"OCCCCCBr":2313,"CCNCCNCCNCCN":2314,"NOCCS":2315,"NCCCCNP":2316,"CCCCCCCNS":2317,"NCCCOCCOc":2318,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":2319,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":2320,"CNCCCCCCNC":2321,"CNCCCCCCNCC":2322,"COCCCCCl":2323,"COCCCCOCC":2324,"785":2325,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2326,"573":2327,"OCCCCCCCCCCCS":2328,"OCCCCCCCCCCCSS":2329,"NCCOCCOCCOCCO":2330,"NCCOCCOCCOCCOCCC":2331,"CCCCCCCCCCNCCCCCCCCC":2332,"12345":2333,"CCCCOCCOP":2334,"*)*)(*)*)=":2335,"NCCCCCCCCCCO":2336,"CCSSCCCCCCCCCCCCCCC":2337,"NCCOCCON":2338,"CCCCCCCCCNCCCCCCCCC":2339,"*)*)*)*)":2340,"CCCCCSCCO":2341,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":2342,"*)*)*)*)*)*)=":2343,"474":2344,"CCCSCCSCCC":2345,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":2346,"SSSSCC":2347,"OCCCOCCCO":2348,"CCOCCOCCOP":2349,"CCCCCCCCCCCCSCCCCCCCCCCCC":2350,"(*)*)":2351,"(*)*)[":2352,"CCCCCCCCOCCOP":2353,"CCOCCOCCOCCNC":2354,"CCOCCOCCOCCOCC":2355,"CCCCCCSSCCS":2356,"CCCCCCCCCCCCCCCCCCOCCCOC":2357,"CCSSCCn":2358,"NCOCNC":2359,"CCCCCCOCCOP":2360,"NCCCCNCCCNCCCN":2361,"/*)\\[":2362,"CCCCCCCCCCCOCCO":2363,"CCCCOCCOCCNC":2364,"NOCCNB":2365,"CNCCNCCNCCNCCNCCN":2366,"COCCOCCOCCOCCNC":2367,"COCCOCCOCCOCCCN":2368,"/*)/*":2369,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCNC":2370,"CCOCCOCCOCCOCCOCCC":2371,"SBS":2372,"NCCCNCCCNCCCCCNC":2373,"(*)*)(*)*)(*)*)(*)*)(":2374,"NCCOCCOCCOCCOCCOCCOCCC":2375,"CCCCCCCCCCCCOCCOCCOCCOS":2376,"CNCCCCCCNCCCCCCCCNCCCCCCNCc":2377,"SCCCCCCCCCCCn":2378,"ClCCOCOCCCl":2379,"CCNCCCCNCCCCNCCCCNCCCCNCC":2380,"CCNCCSSCCNCCC":2381,"(*)*)(":2382,"(*)*)(*)*":2383,"*#":2384,"*\\":2385,"*([":2386,"*)/":2387,"*)\\":2388,"*)\\*":2389,"*(*)*)":2390,"++](=":2391,"--]=[":2392,"-]([*])[":2393,".*":2394,"/*)=":2395,"/*)[":2396,"1123":2397,"112345":2398,"210":2399,"224":2400,"256":2401,"265":2402,"356":2403,"375":2404,"3345":2405,"412":2406,"532":2407,"613":2408,"686":2409,"718":2410,"824":2411,"=*)=":2412,"@+]([":2413,"Am":2414,"Bh":2415,"Bk":2416,"Cf":2417,"Db":2418,"Ds":2419,"Es":2420,"FF":2421,"FI":2422,"Fm":2423,"FCCN":2424,"FCCOc":2425,"FCCl":2426,"FCBr":2427,"FCCBr":2428,"FCCCBr":2429,"FCCI":2430,"FCCCCBr":2431,"FCCCCCBr":2432,"FCCCCCCBr":2433,"FCCCCF":2434,"FCCCCCCCCCCF":2435,"Hs":2436,"II":2437,"IO":2438,"ICCCC":2439,"IOC":2440,"ICCCCCCCC":2441,"ICCN":2442,"ICI":2443,"ICCI":2444,"ICCOCc":2445,"ICCOCCOCC":2446,"ICCCI":2447,"ICCCCCI":2448,"ICCCCCCI":2449,"ICCCCCCCCCI":2450,"ICCCCCCCCCCI":2451,"ICCOCCI":2452,"ICCCCCCCCCCCI":2453,"KH":2454,"Lr":2455,"Md":2456,"Mt":2457,"No":2458,"NCOCC":2459,"NCCCCCCCCCCCCCCC":2460,"NCCCCCCCCCCCCCC":2461,"NNCCS":2462,"NCOCCOC":2463,"NOCCCO":2464,"NOCCc":2465,"NCCCCCCCCOC":2466,"NNCCCO":2467,"NCCCCCCCCCCCCCCCCCCN":2468,"NCOCN":2469,"NCCCCCCCCNC":2470,"NCCCCCCCCCCCCNC":2471,"NCCCCCCCCCCCCCCN":2472,"ONN":2473,"OOc":2474,"ONS":2475,"ONNC":2476,"ONCCCN":2477,"ONCCc":2478,"OCCCCCCCCCCCCCCCCCCCCCCCC":2479,"OCCCCCCCCCCCCCCCCCCCCCCCCC":2480,"OCCCCCCCCCCCCCCCCCCCCCCCCCC":2481,"OOCCCOCC":2482,"PI":2483,"PP":2484,"PS":2485,"Pm":2486,"PCl":2487,"POCCC":2488,"PNP":2489,"POOP":2490,"Rg":2491,"SCO":2492,"SCOC":2493,"SBr":2494,"SnH":2495,"SNN":2496,"SOP":2497,"SNCCC":2498,"SCCCNC":2499,"SCCCCO":2500,"SCCCCCCCCC":2501,"SOS":2502,"SSCCNC":2503,"SNCCCC":2504,"SCCCCOC":2505,"SCSCC":2506,"SSCc":2507,"SCCCCOc":2508,"SCCCCCN":2509,"SCCNS":2510,"SCCCCS":2511,"SOOC":2512,"SCCCCCNC":2513,"SCCON":2514,"SCCCCCCCCCCCCN":2515,"SCCCCCCO":2516,"SCCCCCCCCCCN":2517,"SNCCOCC":2518,"SCCOCCOCCOCCOCCOCC":2519,"SCCCCCCCCCCCCCCCCS":2520,"SCSP":2521,"SCCCCCCCCCCCc":2522,"SCCOCCOCCOCC":2523,"SCCCCCCCCCBr":2524,"SCCCCCCCCCS":2525,"SCCOCCS":2526,"SCCCCCCCCCCCBr":2527,"SNSNS":2528,"\\*)=":2529,"onnc":2530,"pH":2531,"scnn":2532,"te":2533,"(=*)=":2534,"(=*)*)=":2535,"](-":2536,"](*)(=":2537,"](-[":2538,"](*)*)(*)*":2539,"ccccccc":2540,"ccss":2541,"COF":2542,"COOP":2543,"CONS":2544,"COCCCCO":2545,"CONNC":2546,"COOS":2547,"COOCCN":2548,"COCCCCCCCCCCC":2549,"COCCCCCCCCCCCCCCC":2550,"COCNc":2551,"COCCCCCN":2552,"COCCCNCC":2553,"COCCCCc":2554,"COCOCCOC":2555,"COCCCCCCOC":2556,"COCCCCCO":2557,"COCCCCCOC":2558,"COCCCCCCO":2559,"COCOCOC":2560,"CONCCCCCCNC":2561,"COCCCCCCS":2562,"COCCCCOCCC":2563,"NCNN":2564,"NCSc":2565,"NCSCCC":2566,"NCNCN":2567,"NCSCN":2568,"CCCCNCc":2569,"CCCCNCCO":2570,"CCCCCOCCC":2571,"CCCCNCCOC":2572,"CCCCCNCCC":2573,"CCCCNCCS":2574,"CCCCCSSC":2575,"CCCCOCCOCCO":2576,"CCCCOCCCOC":2577,"CCCCCCOCCO":2578,"CCCCOCCCl":2579,"CCCCOCCS":2580,"CCCCOCCOCCOCCO":2581,"CCCCOCCOCCOCCOCCO":2582,"CCCCOCCOS":2583,"CCCCCCOCCOCCOCCO":2584,"CCCCCOCCOCCO":2585,"CCCCOCCOCCOS":2586,"CCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2587,"cccoc":2588,"OCSOC":2589,")(\\[":2590,")(*)*)(":2591,")(*)*)=":2592,")(*)*)":2593,")(*)*)(*)*":2594,")(*)*)[":2595,"CNI":2596,"CNNCC":2597,"CNOP":2598,"CNCCOCC":2599,"CNNNC":2600,"CNCOCC":2601,"CNCCCCCCCCCCCC":2602,"CNOCCOC":2603,"CNCCCCCNC":2604,"CNCCCCCCOC":2605,"CNCCCCCCCCNC":2606,"CNCCOCCOCC":2607,"CNCCCCCCNCCC":2608,"CNCOOCC":2609,")=*":2610,")=*)=":2611,")=*)":2612,"ClN":2613,"ClO":2614,"Clp":2615,"ClCCCC":2616,"ClBr":2617,"ClCCCCC":2618,"ClCOc":2619,"ClCCOC":2620,"ClCCOCC":2621,"ClCCCCN":2622,"ClCCNCC":2623,"ClCCOc":2624,"ClCOCC":2625,"ClCBr":2626,"ClCCSC":2627,"ClCCCOc":2628,"ClCCNc":2629,"ClCCBr":2630,"ClCCCn":2631,"ClCCCCl":2632,"ClCCCCCl":2633,"ClCSCc":2634,"ClCCOCc":2635,"ClNCNC":2636,"ClCCCCBr":2637,"ClCCCCCBr":2638,"ClCCCSc":2639,"ClCCOCCOCCOCC":2640,"ClCCCCCCl":2641,"ClCCCCCCBr":2642,"ClCCSSCC":2643,"ClCCSCc":2644,"ClSCl":2645,"ClCCCCCCCBr":2646,"ClCSCCl":2647,"ClCCCCI":2648,"ClCCOCCCl":2649,"ClCCCCCCCl":2650,"ClCCCCCCCCCl":2651,"ClCCCCCCI":2652,"ClCCCCCCCCl":2653,"ClCCCCCCCCCCl":2654,"ClCCOCCl":2655,"ClCCCCCCCCCI":2656,"ClOOCl":2657,"ClCCSCCCl":2658,"ClCOCCOCCl":2659,"-]\\[":2660,"-][*]":2661,"CCCCCCCCB":2662,"CCCCCCCCF":2663,"CCCCCCCCNCC":2664,"CCCCCCCCNc":2665,"CCCCCCCCSCC":2666,"CCCCCCCCNCCC":2667,"CCCCCCCCCCNCC":2668,"CCCCCCCCCn":2669,"CCCCCCCCNOC":2670,"CCCCCCCCOB":2671,"CCCCCCCCOCCC":2672,"CCCCCCCCOCCCC":2673,"CCCCCCCCCOS":2674,"CCCCCCCCOO":2675,"CCCCCCCCCSCC":2676,"CCCCCCCCNCCO":2677,"CCCCCCCCCCNc":2678,"CCCCCCCCNCCOC":2679,"CCCCCCCCCOCCOC":2680,"CCCCCCCCCOCCO":2681,"CCCCCCCCOCCCCCCCC":2682,"CCCCCCCCOCCCCC":2683,"CCCCCCCCCCSc":2684,"CCCCCCCCCCNCCN":2685,"CCCCCCCCNCCCNC":2686,"CCCCCCCCCCOCCOC":2687,"CCCCCCCCOCCCCCCCCC":2688,"CCCCCCCCCCNCCC":2689,"CCCCCCCCCCCNc":2690,"CCCCCCCCSSc":2691,"CCCCCCCCOCCl":2692,"CCCCCCCCOCCOCCOCCOCCO":2693,"CCCCCCCCSCCO":2694,"CCCCCCCCCCCOS":2695,"CCCCCCCCCCOCCOCC":2696,"CCCCCCCCCCSCCC":2697,"CCCCCCCCOCCOCCOCCOCCOCCO":2698,"CCCCCCCCCCOCCOCCOCCO":2699,"CCCCCCCCSSSS":2700,"CCCCCCCCSSCCCCCCCC":2701,"ncnnn":2702,"ncsn":2703,"COCF":2704,"COCI":2705,"COCSC":2706,"CCNOC":2707,"CCNOCC":2708,"CCNCCCCC":2709,"CCNOP":2710,"CCNCCOCC":2711,"CCNCCCCCC":2712,"CCNCCCCCCC":2713,"CCNCCCCN":2714,"CCNCCCNC":2715,"CCNCCCCO":2716,"CCNOCc":2717,"CCNOS":2718,"CCNCCCCOC":2719,"CCNCCCS":2720,"CCNCCNS":2721,"CCNCCCCS":2722,"CCNCCCCCCN":2723,"CCNCCCCCOC":2724,"CCNCCOCCO":2725,"CCNCCOCCN":2726,"CCNCCON":2727,"CCNCCCCCCNC":2728,"CCNCCCCCCCCCCN":2729,"CCNCCCCCCl":2730,"+]*":2731,"+])-":2732,"+])*)":2733,"+]*)*":2734,"+])*)=":2735,"OCCSCc":2736,"OCCCOCCOCC":2737,"OCCPC":2738,"BrI":2739,"BrN":2740,"BrO":2741,"Brn":2742,"BrCCOCC":2743,"BrCCCCCCC":2744,"BrCCCCO":2745,"BrCn":2746,"BrCCCO":2747,"BrCCCOC":2748,"BrSc":2749,"BrCCCOc":2750,"BrCCCCOc":2751,"BrCCNc":2752,"BrCCCCc":2753,"BrCCBr":2754,"BrCOCc":2755,"BrCI":2756,"BrCCCCn":2757,"BrCCCBr":2758,"BrCCCCCc":2759,"BrCCCCCCCCOc":2760,"BrCCCCCCc":2761,"BrCCCCCCOc":2762,"BrCCCCCCCCc":2763,"BrCCOCc":2764,"BrCCCCBr":2765,"BrCCCCCBr":2766,"BrCCCCCCn":2767,"BrCCCCCCCCCCc":2768,"BrCCCCCCBr":2769,"BrCCCCCCCCCBr":2770,"BrCCCCCCCCCCBr":2771,"BrCCCCCCCCBr":2772,"BrCCCOCc":2773,"BrCCOCCBr":2774,"BrCCCCCCCCCCCCCCCCCCBr":2775,"BrCCCCCCCCCCCCBr":2776,"BrCCCCCCCCCCCCCCBr":2777,"BrCCCCCCOCc":2778,"120":2779,"129":2780,"@@]=":2781,"cccco":2782,"-])\\[":2783,"-])*)*)":2784,"NCCI":2785,"NCCOCCCC":2786,"NCCCON":2787,"NCCOCCCN":2788,"NCCOCCOc":2789,"NCCCOCCCN":2790,"NCCOCCCOC":2791,"NCCOCCCl":2792,"NCCOCCNCCO":2793,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2794,"NCCOCCOCCOCCOCCOCCOCC":2795,"CSOCC":2796,"CSNN":2797,"CSCCOCC":2798,"CSCCc":2799,"CSCCCCO":2800,"CSCSc":2801,"CSCNCC":2802,"CSCCCCCCCCCCCC":2803,"CSCCCOC":2804,"CSCCCCNC":2805,"CSOO":2806,"CSCCCCOC":2807,"CSSCc":2808,"CSCCCCOc":2809,"CSCON":2810,"CSCSSC":2811,"CSSS":2812,"CSCCCCCNC":2813,"CSCCOCCO":2814,"CSSCCCC":2815,"CSOCCOCCOCCO":2816,"CSCCCCCS":2817,"CSCCCCCCSC":2818,"CSCCCOS":2819,"CSCCCCCCn":2820,"CSCOCCCCC":2821,"CSCCCCCCCCCCCCCOC":2822,"CSCCCCCCCCCCCO":2823,"CSSSSS":2824,"CSSSSSCC":2825,"CCCCCB":2826,"CCCCCPC":2827,"NNI":2828,"NNCCC":2829,"NNBr":2830,"NNNCC":2831,"NNCCCc":2832,"])*)[":2833,"])*)(":2834,"])*[":2835,"])*)*)*)*)*":2836,"CCOCS":2837,"CCOCBr":2838,"CNCS":2839,"CNCl":2840,"CNCn":2841,"CNCSC":2842,"SCI":2843,"SCBr":2844,")([*])=":2845,"OPC":2846,"OPP":2847,"OPOCC":2848,"CCCNI":2849,"CCCNP":2850,"CCCNSC":2851,"CCCNCCOCC":2852,"CCCNCCCCCC":2853,"CCCNNS":2854,"CCCNCCCCCCC":2855,"CCCNSCC":2856,"CCCNNCCC":2857,"CCCNOCc":2858,"CCCNCCNCC":2859,"CCCNCCCO":2860,"CCCNCCCOC":2861,"CCCNCCSC":2862,"CCCNCCCCNC":2863,"CCCNCCCS":2864,"CCCNCCCCS":2865,"CCCNCCCCCCOC":2866,"CCCNCCNCCN":2867,"CCCNCCOCCC":2868,"CCCNCCCNCCC":2869,"CCCNCCCOS":2870,"CCCNCCCCCCNCCC":2871,"(/*)=":2872,"(/*)\\":2873,"COPC":2874,"COPN":2875,"COPNP":2876,"CCNCN":2877,"CCNCSC":2878,"109":2879,"10121":2880,"211":2881,"214":2882,"215":2883,"216":2884,"217":2885,"218":2886,"219":2887,"+](*)([":2888,"+](\\[*]":2889,"+](*)(*)*":2890,"132":2891,"134":2892,"139":2893,"1336":2894,"13468":2895,"CCOCCF":2896,"CCOCCCOCC":2897,"CCOCCNCc":2898,"CCOCCON":2899,"CCOCCCNS":2900,"CCOCCOCCNCCO":2901,"CCOCCCNCCOC":2902,"CCOCCOCCBr":2903,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2904,"CCOCCSCCSCC":2905,"CCOCCPCCP":2906,"115":2907,"116":2908,"117":2909,"119":2910,"CCCCCCB":2911,"CCCCCCCOCC":2912,"CCCCCCON":2913,"CCCCCCOB":2914,"CCCCCCOCCCC":2915,"CCCCCCSc":2916,"CCCCCCCOS":2917,"CCCCCCSCc":2918,"CCCCCCOCCCCCC":2919,"CCCCCCCOCCOCC":2920,"CCCCCCSS":2921,"CCCCCCOCCCCC":2922,"CCCCCCSCCO":2923,"CCCCCCSCCCCCC":2924,"CCCCCCCOCCOCCCC":2925,"CCCCCCSSCCCCCCO":2926,"CCCCCCCOCCOCCOCCOCCCN":2927,"NSO":2928,"NSNC":2929,"NSCCC":2930,"NSCCN":2931,"NSNSN":2932,"CCCCCCCCCCCCCCCCn":2933,"CCCCCCCCCCCCCCCCBr":2934,"CCCCCCCCCCCCCCCCCS":2935,"CCCCCCCCCCCCCCCCCOc":2936,"CCCCCCCCCCCCCCCCCCCN":2937,"CCCCCCCCCCCCCCCCCOP":2938,"CCCCCCCCCCCCCCCCCCCCO":2939,"CCCCCCCCCCCCCCCCCCn":2940,"CCCCCCCCCCCCCCCCOCCOCC":2941,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2942,"CCCCCCCCCCCCCCCCOB":2943,"CCCCCCCCCCCCCCCCCCCOC":2944,"CCCCCCCCCCCCCCCCCCCCCN":2945,"CCCCCCCCCCCCCCCCSCCC":2946,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2947,"CCCCCCCCCCCCCCCCCCCCS":2948,"CCCCCCCCCCCCCCCCSS":2949,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2950,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2951,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2952,"CCCCCCCCCCCCCCCCCCOS":2953,"CCCCCCCCCCCCCCCCCCSc":2954,"CCCCCCCCCCCCCCCCCCOCCO":2955,"CCCCCCCCCCCCCCCCOCCCCCCCCCCCCCCCC":2956,"CCCCCCCCCCCCCCCCCCOCCC":2957,"CCCCCCCCCCCCCCCCCCNCCC":2958,"CCCCCCCCCCCCCCCCCCOCCCN":2959,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCC":2960,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2961,"CCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2962,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2963,"CCCCCCCCCCCCCCCCOCCOP":2964,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":2965,"CCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2966,"CCCCCCCCCCCCCCCCCCNCCNCCN":2967,"CCOF":2968,"CCOn":2969,"CCOCCCCCCCC":2970,"CCONCC":2971,"CCOCCCCC":2972,"CCOCOc":2973,"CCOSC":2974,"CCOOP":2975,"CCONS":2976,"CCOCCCCCCCCCC":2977,"CCOCOCCN":2978,"CCOOO":2979,"CCOCCCCCN":2980,"CCOCCCCCCCCN":2981,"CCOCCCCl":2982,"CCOCCCBr":2983,"CCOCCCCCCCCCCCCN":2984,"CCOCCCCCCCCO":2985,"CCOCCCCCCCCCCCCCCCCCCN":2986,"CCOCCCCNCC":2987,"CCOOCCCCCCO":2988,"CCOOOCC":2989,"CCOCCCSP":2990,"CCOCCCCCCCCCCCCCN":2991,"@@](\\":2992,"cnnnc":2993,"cnncn":2994,"cnnnn":2995,"CSCn":2996,"CCCCCCCF":2997,"CCCCCCCSc":2998,"CCCCCCCSCCO":2999,"-].[*]":3000,"CCCCNNC":3001,"CCCCNOC":3002,"CCCCNCCN":3003,"CCCCNOCC":3004,"CCCCNSC":3005,"CCCCNCCCNC":3006,"CCCCNOCc":3007,"CCCCNCCCCOC":3008,"CCCCNCCCCCCNCCCC":3009,"231":3010,")*)*)[":3011,")*)\\[":3012,")*.*":3013,"SCCF":3014,"SCCP":3015,"SCCCOCC":3016,"SCCSc":3017,"SCCSCCC":3018,"SCCSS":3019,"@](*)(":3020,"NCCCB":3021,"NCCCP":3022,"CCCCOCOC":3023,"CCCCOCCCCC":3024,"CCCCOCCCCN":3025,"CCCCOCCCCO":3026,"CCCCOCCCCCCCCCBr":3027,"*])([*])":3028,"*])([*])[*]":3029,"342":3030,"3456":3031,"+]([*])=":3032,"+]([*])([*])[*]":3033,"@]([*])([*])":3034,"OCOO":3035,"OCOCCC":3036,"OCOCOC":3037,"OCOCCCCC":3038,"OCOCCS":3039,"OCOCOCO":3040,"OCOCCOCO":3041,"142":3042,"144":3043,"1414":3044,"1448":3045,"NNCN":3046,"NNCS":3047,"NNCl":3048,"CCNCCOc":3049,"CCNCCCOCC":3050,"CCNCCSCCCO":3051,"])(/":3052,"NOO":3053,"NONC":3054,"NOCCCCCC":3055,"NOON":3056,"NOCCCCNC":3057,"NOCCCS":3058,"NOOSC":3059,"nnoc":3060,"nnns":3061,"])([*])":3062,"-])([*])=":3063,"COCCB":3064,"COCCI":3065,"COCCP":3066,"COCCCOP":3067,"COCCSCC":3068,"COCCCOCCN":3069,"COCCSc":3070,"COCCSCCN":3071,"COCCCOCCCC":3072,"COCCSCCCC":3073,"COCCSNC":3074,"COCCCOCCCOC":3075,"COCCSCCl":3076,"([*])([*])[*]":3077,"([*])([*])=":3078,"CCSCN":3079,"CCSCS":3080,"CCSCCCN":3081,"CCSCCCCCC":3082,"CCSCCCNC":3083,"CCSCCCCCCCCC":3084,"CCSCCCNCC":3085,"CCSCCCCS":3086,"CCSSS":3087,"CCSCCCCl":3088,"CCSOOO":3089,"CCSCCOCCOCC":3090,"CCSCCCCSCC":3091,"CCSCCCCCCCCCCSCCC":3092,"CCCCCCCCCP":3093,"153":3094,"155":3095,"1585":3096,"OCCONC":3097,"OCCOOC":3098,"OCCOCCCCCCCC":3099,"OCCOOCC":3100,"OCCOCCCCCCCCCCCCCCCCCC":3101,"OCCOCCCS":3102,"OCCOCCNS":3103,"OCCOCCCCS":3104,"OCCOCCCCCCCCCCCCCCCCCCCCCC":3105,"OCCOCCCCBr":3106,"OCCOCCCCOCCOC":3107,"OSS":3108,"OSc":3109,"OCCNP":3110,"OCCNCO":3111,"OCCNNC":3112,"OCCNCCCCC":3113,"OCCNCCc":3114,"OCCNCCCF":3115,"OCCNCCNCCO":3116,"*)#":3117,"*)-":3118,"CNCCF":3119,"CNCCI":3120,"CNCCBr":3121,"CNCCCOCCO":3122,"CCCOB":3123,"CCCONC":3124,"CCCOCOC":3125,"CCCOCCCCCCC":3126,"CCCOCCCS":3127,"CCCOCOCCC":3128,"CCCOCCNc":3129,"CCCOCCOCCC":3130,"CCCOOCCCCOC":3131,"CCCOCCOCCOCCOCCO":3132,"CCCCCCCCCCCSC":3133,"OCCOCCI":3134,"OCCOCCNC":3135,"OCCOCCCl":3136,"OCCOCCBr":3137,"OCCOCCOP":3138,"OCCOCCCOCCO":3139,"OCCOCCOCCCl":3140,"OCCOCCOCCOCCN":3141,"FCI":3142,"ONP":3143,"ONCCCC":3144,"CCCCCCCCCCCCCCCS":3145,"CCCCCCCCCCCOc":3146,"CCCCCCCCCCSCC":3147,"CCCCCCCCCCCOCC":3148,"NOCS":3149,"NCCNN":3150,"NCCNP":3151,"NCCNCCOC":3152,"NCCNCCCN":3153,"CCCCCCCCCCCCCS":3154,"CCCCCCCCCCCCOCCOCC":3155,"CCCCCCCCCCCCSc":3156,"CCCCCCCCCCCCNCCCN":3157,"CCCCCCCCCCCCSCc":3158,"CCCCCCCCCCCCCNS":3159,"CCCCCCCCCCCCCOCCC":3160,"CCCCCCCCCCCCCOCCOCC":3161,"CCCCCCCCCCCCOCCOCCO":3162,"CCCCCCCCCCCCCCNCCN":3163,"CCCCCCCCCCCCCOCCCN":3164,"CCCCCCCCCCCCSSC":3165,"CCCCCCCCCCCCCCOCCO":3166,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCC":3167,"CCCCCCCCCCCCOCCOCCN":3168,"CCCCCCCCCCCCCNCCNC":3169,"CCCCCCCCCCCCOCCOCCOCCOCCO":3170,"CCCCCCCCCCCCCCOCCOCCOCCOCCOCC":3171,"CCCCCCCCCCCCOCCOCCOCCOC":3172,"CCCCCCCCCCCCOCCOCCOCCOCCOCCO":3173,"CCCCCCCCCCCCCCOCCOCCOCCO":3174,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":3175,"CCCCCCCCCCCCCCNCCCC":3176,"CCCCCCCCCCCCOCCOP":3177,"CCCCCCCCCCCCNCCCNCC":3178,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO":3179,"CCCCCCCCCCCCCCOCCCO":3180,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCC":3181,"CCCCCCCCCCCCCOCCOS":3182,"CCCCCCCCCCCCOCCOCCOS":3183,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCO":3184,"CCCCCCCCCCCCCCF":3185,"CCCCCCCCCCCCCCI":3186,"CCCCCCCCCCCCCCP":3187,"CCCCCCCCCCCCCCl":3188,"CCCCCCCCCCCCCCCl":3189,"CCCCCCCCCCCCCCSCC":3190,"CCCCCCCCCCCCCCCOS":3191,"CCCCCCCCCCCCCCOCCCCCCCCCCCCCC":3192,"OBO":3193,"OBOBO":3194,"OCCCSCC":3195,"OCCCSCCNC":3196,"OCCCSCCN":3197,"OCCCSCCCOC":3198,"COCCNCCC":3199,"COCCNCCN":3200,"COCCNCCOC":3201,"COCCNCCO":3202,"COCCNCCCCSCC":3203,"COCCNCCOCCOCCOCCN":3204,"OCCCCF":3205,"OCCCCCCCN":3206,"OCCCCCOP":3207,"OCCCCOCc":3208,"OCCCCCCNCC":3209,"OCCCCOCCO":3210,"OCCCCCSc":3211,"OCCCCCOCc":3212,"OCCCCCOCCO":3213,"OCCCCCCNCc":3214,"CCCCCCCCCCCCCCCCCCI":3215,"CCCCCCCCCCCCCCCCCCCl":3216,"NCCCCF":3217,"NCCCCP":3218,"NCCCCS":3219,"NCCCCCl":3220,"NCCCCCSC":3221,"NCCCCOCc":3222,"NCCCCCNCC":3223,"NCCCCCNS":3224,"NCCCCCNCCCN":3225,"NCCCCOCCI":3226,"NCCCCCOCCOCCC":3227,"1721":3228,"457":3229,"4545":3230,"NCCCNO":3231,"NCCCNCCCCCCCC":3232,"NCCCNCCCNC":3233,"NCCCNCCCCCCCCC":3234,"NCCCNCCCCCNC":3235,"NCCCNCCNCCCN":3236,"COSN":3237,"COSOC":3238,"3191":3239,"-])(*)":3240,"-])(*)*":3241,"OOSC":3242,"CCCCOCSSCCNC":3243,"OCCOCN":3244,"OCCOCNC":3245,"CSCCB":3246,"CSCCBr":3247,"CSCCCOc":3248,"CSCCSCCSC":3249,"CSCCSCCSCC":3250,"CSCCSCCSCCS":3251,"CCCSO":3252,"CCCSNC":3253,"CCCSCCO":3254,"CCCSON":3255,"CCCSCCCSC":3256,"CCCSCCON":3257,"CCCSSCCCS":3258,"CCCSCCCCCCCCCBr":3259,"CCCSSSSC":3260,"CCCSSCCCSC":3261,"[*])\\":3262,"LiH":3263,")*)(*)*)=":3264,"NCCONC":3265,"COCCCF":3266,"COCCCI":3267,"COCCCBr":3268,"246":3269,"CPC":3270,"CPP":3271,"CPc":3272,"CPCC":3273,"CPOC":3274,"CPCc":3275,"CPCCP":3276,"+]=*":3277,"CNCCCF":3278,"OCCOCCOCCOCCS":3279,"OCCOCCOCCOCCCl":3280,"OCCOCCOCCOCCOCc":3281,"OCCOCCOCCOCCOCCNC":3282,"OCCOCCOCCOCCOCCBr":3283,"OCCOCCOCCOCCOCCOS":3284,"OCCOCCOCCOCCOCCOCCOCCNC":3285,"OCCOCCOCCOCCOCCOCCOS":3286,"CCCCCNN":3287,"CCCCCNNC":3288,"CCCCCNOCc":3289,"NCCSN":3290,"NCCSCCO":3291,"NCCSSCCC":3292,"CCNSSNCCC":3293,"CNCCNCCC":3294,"CNCCNCCCN":3295,"CNCCNCCO":3296,"CNCCNCCNCCC":3297,"NiH":3298,"190":3299,"191":3300,"193":3301,"194":3302,"198":3303,"199":3304,"569":3305,")*)*)*)*)":3306,")*)*)*)(*)*)=":3307,"*])[*])":3308,"SCCCBr":3309,"OCCCNCCCC":3310,"OCCCNCCCCN":3311,"OCCCCCCI":3312,"OCCCCCCCO":3313,"OCCCCCCBr":3314,"OCCCCCCCOP":3315,"CCSCCBr":3316,"CCSCCOP":3317,"CCSCCSCCN":3318,"CCSCCSCCSCC":3319,"3535":3320,"*)(\\":3321,"*)(*)[":3322,"*)(*)*)*)*)*":3323,"*)(*)*)(*)*":3324,"+])[*])[":3325,"220":3326,"222":3327,"226":3328,"CCCCSN":3329,"CCCCSNC":3330,"CCCCSCSC":3331,"CCCCSCCCCCCCCCCC":3332,"CCCCSCCCCCN":3333,"COCCOCCI":3334,"COCCOCCS":3335,"COCCOCCn":3336,"COCCOCCCN":3337,"COCCOCCBr":3338,"COCCOCCCNCC":3339,"COCCOCCON":3340,"COCCOCCOCCNC":3341,"COCCOCCSS":3342,"COCCOCCOCCBr":3343,"COCCOCCOCCOCCOCCOCCOCCO":3344,"COCCOCCOCCn":3345,"COCCOCCOCCOCCOCCOCCOCCOCCOCCO":3346,"COCCOCCOCCOCCOCCN":3347,"CCCCCCNN":3348,"CCCCCCNP":3349,"CCCCCCNCCOC":3350,"CCCCCCNCCCCCC":3351,"CCCCCCNCCCCCCC":3352,"CCCCCCNCCCCCBr":3353,"CCCCCCCCCCCCCCCCCCCCP":3354,"CCCCCCCCCCCCCCCCCCCCOCC":3355,"CCCCCCCCCCCCCCCCCCCCBr":3356,"CCCCCCCCCCCCCCCCCCCCCCNC":3357,"(\\[*])[*])":3358,"SSP":3359,"SSSCC":3360,"SSCOCC":3361,"SSSSc":3362,"SSSSS":3363,"SSCCCCCCCCCCCN":3364,"SSCCCCCCCCCCCCCCCCO":3365,"SSCSSS":3366,"OCCCOOC":3367,"OCCCOCCCCl":3368,"OCCCOCCOCCCCl":3369,"CNCCOCCN":3370,"CCCCCCCCCCCCCCCCCCCCCCO":3371,"CCCCCCCCCCCCCCCCCCCCCCc":3372,"CCCCCCCCCCCCCCCCCCCCCCBr":3373,"CCPP":3374,"CCCCCCCCCCCCCCCCCCCCCCCCO":3375,"CCCCCCCCCCCCCCCCCCCCCCCCCCN":3376,"CCCCCCCCCCCCCCCCCCCCCCCCCCOC":3377,"CCCCCCCCCCCCCCCCCCCCCCCCCCO":3378,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3379,"NPN":3380,"NPOCCOC":3381,"NPOCCCN":3382,"COCCON":3383,"COCCOCOC":3384,"COCCOCCCBr":3385,"COCCOCCCCCCBr":3386,"CSCCCBr":3387,"OCCCCCCCCO":3388,"OCCCCCCCCS":3389,"OCCCCCCCCCO":3390,"OCCCCCCCCCl":3391,"OCCCCCCCCCS":3392,"OCCCCCCCCOP":3393,"OCCCCCCCCCCCN":3394,"OCCCCCCCCCCOCC":3395,"OCCCCCCCCCSCCCC":3396,"204":3397,"205":3398,"206":3399,"207":3400,"208":3401,"209":3402,"OCCOCCOCCCC":3403,"OCCOCCOCCC":3404,"OCCOCCOCCCCOCC":3405,"OCCOCCOCCCCOCCOCCOC":3406,"(*)(=[":3407,"CCCCCOB":3408,"CCCCCONC":3409,"CCCCCOCCCC":3410,"CCCCCOCCCCC":3411,"CCCCCOCCCN":3412,"CCCCCOOOO":3413,"coccc":3414,"NCCCCCCS":3415,"NCCCCCCc":3416,"NCCCCCCn":3417,"NCCCCCCOP":3418,"NCCCCCCOCCCC":3419,"NCCCCCCSc":3420,"ccnnn":3421,"*)*)*)[":3422,"678":3423,"TeH":3424,"ClCCI":3425,"nnnnn":3426,"CCNCCNCCC":3427,"NOCCBr":3428,"NOCCCON":3429,"COCCCNN":3430,"COCCCNCCCC":3431,"COCCCNCCOC":3432,"COCCCNCCCOC":3433,"CCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3434,"CCCOCCBr":3435,"CCCOCCCOS":3436,"NCCCCNO":3437,"NCCCCNCCCC":3438,"NCCCCNCCN":3439,"NCCCCNCCCCN":3440,"SCCNCCO":3441,"occo":3442,"4681":3443,"CSCCNCCNS":3444,"CCCCCCCNCCCCCCC":3445,"CCCCCCCNCCCCCCCCCCC":3446,"NCCCOOC":3447,"OCCCCCCCF":3448,"OCCCCCCCS":3449,"OCCCCCCCBr":3450,"OCCOCCOCCOCCOCCOCCOCCOCCOC":3451,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3452,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3453,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCC":3454,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3455,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOP":3456,"CNNCN":3457,"OCCCCCCCCCCCl":3458,"OCCCCCCCCCCBr":3459,"SCCSCCOCC":3460,"SCCSCCO":3461,"CCOCCNN":3462,"CNCCCCBr":3463,"CNCCCCNCC":3464,"CNCCCCSC":3465,"BrCCI":3466,")*)=*":3467,"COCCCCBr":3468,"COCCCCCCNC":3469,"COCCCCCNCC":3470,"758":3471,"OCCSCCCN":3472,"OCCSSCC":3473,"OCCSSc":3474,"OCCOCCNCCOCCO":3475,"CCCCCCCCCCCCNCCCCCCCCCCCC":3476,"CCCCCCCCCCCCNCCNCCNCC":3477,"OCCCCCCCCCBr":3478,"OCCCCCCCCCCCCCCCCO":3479,"OCCCCCCCCCCCCCCCCBr":3480,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3481,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3482,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3483,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3484,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3485,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3486,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3487,"OCCCCCCCCCCCCCCCCSSCCCCCCCCCCCCCCCCO":3488,"CCCCCCCCCCCCCCCCCCOCN":3489,"CCCCCCCCCCCCCCCCCCOCc":3490,"OCCCCCCCCCCCCNCc":3491,"SCCCCP":3492,"SCCCCBr":3493,"SCCCCCS":3494,"CCCCCCNCl":3495,"CNCCCNCCCNC":3496,"CNCCCNCCNCCCNC":3497,"CCCCCCOCCNCC":3498,"NCCOCCOCCOCC":3499,"NCCOCCOCCOCCOC":3500,"NCCOCCOCCOCCOCCO":3501,"NCCOCCOCCOCCOCCN":3502,"NCCOCCOCCOCCP":3503,"NCCOCCOCCOCCOCCOCCN":3504,"CNCCNCN":3505,"CCCCCCCCCCNCCCCCCCCCC":3506,"NCCCSCCCN":3507,"CCCCCCCCCCCCOCCC":3508,"CCCCCCCCCCCCOCCCNC":3509,"CCCCCCCCCCCCOCCCCCCCCCCCC":3510,"CCCCCCCCCCCCOCCCCCCCCCCCCc":3511,"NNCCF":3512,"NNCCON":3513,"NNCCCOCc":3514,"OCCCCCCCCCCCCCCc":3515,"OCCCCCCCCCCCCCCBr":3516,"OCCOCCOCCOCCOCCN":3517,"CCCCOCCCNCC":3518,"CCCCOCCCNS":3519,"NCCSCCSC":3520,"OCCCCCCCCCCCCCBr":3521,"NCCOCCP":3522,"CCOCCOCCOCCOCCOCCOCCOCCOCCO":3523,"(#*)":3524,"OCCCCON":3525,"OCCCCOS":3526,"OCCCCOOC":3527,"OCCCCOCCC":3528,"285":3529,"*)*)(*)=":3530,"NCCCCCCCCS":3531,"NCCCCCCCCCN":3532,"NCCCCCCCCCCCN":3533,"NCCCCCCCCCCCO":3534,"NCCCCCCCCNP":3535,"CCSSOC":3536,"CCSSSCC":3537,"NCCCCCNO":3538,"NCCCCCNCCCNC":3539,"NCCOCCOCCC":3540,"NCCOCCOCCNS":3541,"NCCOCCOCCCCCCCl":3542,"NCCCCCCNCCCCCCN":3543,"NCCCCON":3544,"NCCCCOCCC":3545,"NCCCCOCCCCOCCCCN":3546,"CCCCCCCCCNCCCNC":3547,"*)*)*)*)=":3548,"*)*)*)=*)":3549,"NCNCNCN":3550,"CCCCCSSCCCCC":3551,"CCCCNCCCNCC":3552,"NCCNCCS":3553,"NCCNCCCOC":3554,"COCCCCCCCCCCCCCCCCCCCCOC":3555,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3556,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3557,"*)*)*)*)*)*":3558,"*)*)*)*)*)*)":3559,"*)*)*)*)*)*)(":3560,"684":3561,"NCCCCCCCNC":3562,"NCCNCCNCCNCCNC":3563,"NCCNCCNCCNCCNCCN":3564,"NCCNCCNCCNCCNCCNCCN":3565,"CSSCS":3566,"479":3567,"COCOCOCOC":3568,"COCOCCCCCCCCCCCCCNC":3569,"CCCSCCCO":3570,"CCCSCCSC":3571,"CCCSCCSCCS":3572,"CCCCCCCCCCOB":3573,"CCCCCCCCCCOCCCC":3574,"CCCCCCCCCCOOC":3575,"CCCCCCCCCCOCCCCCCCCCCOP":3576,"CSCCCCNS":3577,"CSCCCCSCC":3578,"CSCCCCCCNCC":3579,"CSCCCCCNCC":3580,"CSCCCCCNS":3581,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3582,"CCCCCCCCCCCCCCCCNCCCCCCCCCCCCCCCC":3583,"FSI":3584,"[*-":3585,"[*+]":3586,"[*++]":3587,"OCPOCOC":3588,"(*)(*)(=":3589,"(*)(*)[":3590,"(*)(*)*":3591,"(*)(*)*)":3592,"(*)(*)(*)[":3593,"NCONCCCOOC":3594,"SCCCCCCS":3595,"CSCCOOCCO":3596,"OCCCCCCCCCCCCCCCBr":3597,"OCCCOCCCOCCCO":3598,"CCCNCCNCCCNCC":3599,"OCCOCCCCCCOCCOC":3600,"CCCCCCCCSCCCCCCCC":3601,"CCCCCCCCSNS":3602,"CCCCCCCCSOS":3603,"CCCCCCCCSCCOCCO":3604,"CCCCCCCCSCSP":3605,"CCCCCCCCCCCCSCCCCCCCCCCCCCCCCCCCCCCC":3606,"CCCCCCCCCCCCSCCOCCO":3607,"CCCCCCCCOCCCNCCC":3608,"BrCCCB":3609,"NCCCNCCCCNCCC":3610,"SOSC":3611,"OCCSCCCO":3612,"OCCSCCCl":3613,"OCCSCCSCCSCCS":3614,"OCCSCCSCCSCCO":3615,"NCCCCCCCCNCCCCCCCCNC":3616,"CSCCSCCNC":3617,"CSCCSCCCSCCSC":3618,"CCOCCOCCOCCOCCNCC":3619,"CCCCCCCOCCCCCCC":3620,"CCCCCCCOOCCCCCC":3621,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3622,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3623,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3624,"9669":3625,"COOSC":3626,"CCCCCCCCCCCCCCCCCCOCCOP":3627,"CCCCCCCCCCCCCCCCCCOCCOCCO":3628,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCO":3629,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCO":3630,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3631,"CCCCCCOCCOCc":3632,"CCCCCCOCCOCCO":3633,"OCCOCCOCCI":3634,"/*)\\*":3635,"SCSCS":3636,"CNCCCCNCCC":3637,"CCCCCCCCCCCNCCCCCCCCCCC":3638,"CCCCCCCCCCCON":3639,"CCCCCCCCCCCOCCOCCOCC":3640,"CCNCCCCCCNCC":3641,"CCCCOCCOCCSC":3642,"CCCCOCCOCCOCc":3643,"CCCCOCCOCCSCCSCCS":3644,"CNCCCCCI":3645,"ClCCCNCCCl":3646,"CCCOCCOCCOCCC":3647,"CCCOCCOCCOCCCN":3648,"CCCOCCOCCOCCOCCOCCOCCOCCN":3649,"CCCCCCCCCCOCCOS":3650,"CCCCCCCCCCOCCOCCOCCOCCOCCO":3651,"CCCCCCCCCCOCCOCCOCCC":3652,"NCCCNCCCl":3653,"NCCCOCCOCCCN":3654,"CCCCCCCCCCCCCCNCCCCCCCCCCCCCC":3655,"OCCCNCCCl":3656,"OCCCNCCSC":3657,"OCCCNCCCOB":3658,"BrCCCCOCc":3659,"BrCCCCCOCc":3660,"SCCSCCCl":3661,"CNCCCCCCOCCCOC":3662,"*)*)*)*)*)*)*)*)*)*)[":3663,"ssss":3664,"CCCCCCCCCCCCCNCCCCCCCCCCCCC":3665,"CNCCNCCNCCNCCNCCNC":3666,"NBN":3667,"NBNBN":3668,"NCCCCCCCCCCCS":3669,"NCCCCCCCCCCCSSCCCCCCCCCCCN":3670,"SCNCS":3671,"SOONC":3672,"CCCCCOCCPCC":3673,"CCCCCCCCNCCCNCCCN":3674,"CCCCCCCCNCCCNCCCNCCCN":3675,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3676,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3677,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCS":3678,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3679,"CCCCCCCSCCCCCCC":3680,"CCCCCCCSCCCCOC":3681,"CCCOCCOCCCCCCCl":3682,"COCCOCCOCCOB":3683,"COCCOCCOCCOCCOCCOCCC":3684,"COCCOCCNCCOCCOCCN":3685,"COCCOCCNCCOCCOCCOCCN":3686,"(*)*)*)=":3687,"CNCCCCCCOCCCCC":3688,"+][*])=":3689,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3690,"CCCOCCCCCCNCC":3691,"OCCOCCOCCOCCOCCOCCNC":3692,"OCCOCCOCCOCCOCCOCCOP":3693,"OCCOCCOCCOCCOCCOCCOCO":3694,"SBSBS":3695,"\\*)\\*":3696,"CCCCOCCOCCCS":3697,"]([*])([*])":3698,"]([*])([*])[*]":3699,"]([*])([*])[":3700,"CCCCCCCCCOCCOP":3701,"NCCOCCOCCOCCOCCOCCOCCOCCOCCNC":3702,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3703,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3704,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCC":3705,"CSCCCONN":3706,"CCOCCOCCOCCCCCC":3707,"CCOCCOCCOCCNCC":3708,"CCCCCCCOCCCNCCCN":3709,"CCCCCCCCCCCCCCCCCCCCCCNCCCCCCCCCCCCCCCCCCCCCC":3710,"(*)*)(*)*)(*)*":3711,"BBB":3712,"NCCCCCCCCCCCCNc":3713,")(*)*)(*)*)(*)*)=":3714,")(*)*)(*)*)(*)*)(*)*":3715,")(*)*)(*)*)(*)*)(*)*)=":3716,"NCCOCCOCCOCCOCCOCCNC":3717,"NCCOCCOCCOCCOCCOCCSC":3718,"CSCCCSCc":3719,"CSCCCSCCCSCCCSC":3720,"(-*)-*":3721,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCCC":3722,"COCCOCCOCCOCCOCCOCCOCCC":3723,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3724,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3725,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3726,"23456789":3727,"CNCCCCCCNCCCCCCCCNCCCCCCNCC":3728,"PCCPc":3729,"SCCOCCOCCS":3730,"](*)(*)[":3731,"](*)(*)*)(*)=":3732,"CCCCCCCCCCSSCCCCCCCCCCC":3733,"CCCCCCCCCCSSCCCCCCCCCCc":3734,"OCCOCOCCOc":3735,"OCCOCOCCSCC":3736,"OCCSCCSCCO":3737,"NCCOCCOCCOCCOCCOCCOCCOCCOCCC":3738,"+](*)#[":3739,"CCOCCOCCOCCOCCOCCOCCC":3740,"CCCCCCCCCCCCCCCCCCOCCCCCCCCCCCCCCCCCC":3741,"CCCCCCCCCCCCCCCCCCSCCCCl":3742,"CCOCCCCOCCCCO":3743,"CCCCOCCCCCCNCc":3744,"OCCNCCCNCCO":3745,"NCCCNCCCNCCCNCCCN":3746,"OOOOOOC":3747,"*)(*)*)(*)*)(*)*)=":3748,"*)(*)*)(*)*)(*)*)(*)*)=":3749,"OCCCCCCCCCCCSSCCCCCCCCCCCOC":3750,"OCCCCCCCCCCCSSCCCCCCCCCCCO":3751,"(*)*)(*)*)(*)*)(*)*)(*)*)=":3752,"(*)*)(*)*)(*)*)(*)*)(*)*)(*)*":3753,"(*)*)(*)*)*)[":3754,"6868":3755,"=*)=*":3756,"ICCCCCCCCI":3757,"ICCOCCOCCI":3758,"NCCCCCCCCCCCCCCCI":3759,"SNCCCCCNCCSCC":3760,"SCCCCCNCCNC":3761,"SCCOCCOCCOCCOCCOCCS":3762,"SCCOCCOCCOCCS":3763,"SNSNSNS":3764,"(=*)*)=*)(":3765,"COCCCCCOCOOC":3766,"CCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3767,")(*)*)(*)*)*":3768,")(*)*)=*)":3769,"CNCCCCCCCCCCCCNCc":3770,"CNCCOCCOCCNCc":3771,"ClCCOCCOCCCl":3772,"ClCCNCCCl":3773,"ClCCOCCOCCOCCCl":3774,"ClCCSSCCCl":3775,"CCCCCCCCOCCCCCOCCC":3776,"CCCCCCCCSSSSSSSSS":3777,"CCNCCOCCOCCCOC":3778,"OCCCOCCOCCOCCOCCOCCOCCOCCOCCOCO":3779,"NCCOCCCCCCOCCO":3780,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3781,"NCCOCCOCCOCCOCCOCCOCCOCCOCCN":3782,"CSCCOCCSCC":3783,"CSOCCOCCOCCOSC":3784,"CSCCCCCCCCCCCOCCOCCOCCOCC":3785,"+](\\[*])=":3786,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCNC":3787,"CCOCCSCCSCCSCCSCCOCC":3788,"CCOCCPCCPCCO":3789,"CCCCCCSSCCCCCC":3790,"CCCCCCCCCCCCCCCCSSCCCCCCCCCCCCCCCC":3791,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3792,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO":3793,"CCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3794,"CCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3795,"CCOOCCCCCCOOCC":3796,"SCCSCCCSCCS":3797,"COCCSCCNCCC":3798,"COCCCOCCCCOCCCOC":3799,"CCSCCCNCCCOCC":3800,"CCSSSOC":3801,"CCSCCOCCOCCSCC":3802,"158591":3803,"CCCCCCCCCCCCCOCCOCCOCCOS":3804,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3805,"CCCCCCCCCCCCCCOCCOCCOCCOS":3806,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3807,"CSCCSCCSCCSCCSCCS":3808,"CPCCPCCOCCPCCPCCO":3809,"COCCOCCSSCCOCCO":3810,"OCCOCCOCCCCOCCCOCCOC":3811,"OCCSCCSCCSCCSCCO":3812,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCCS":3813,"CCCCOCCOCCSCCSCCSCCOCCOCCCC":3814,"CCCCCCCCSSSSSSSSSCCCCCCC":3815}
\ No newline at end of file
+{"":0,"":1,"":2,"":3,"":4,"!":5,"\"":6,"#":7,"$":8,"%":9,"&":10,"'":11,"(":12,")":13,"*":14,"+":15,",":16,"-":17,".":18,"/":19,"0":20,"1":21,"2":22,"3":23,"4":24,"5":25,"6":26,"7":27,"8":28,"9":29,":":30,";":31,"<":32,"=":33,">":34,"?":35,"@":36,"A":37,"B":38,"C":39,"D":40,"E":41,"F":42,"G":43,"H":44,"I":45,"J":46,"K":47,"L":48,"M":49,"N":50,"O":51,"P":52,"Q":53,"R":54,"S":55,"T":56,"U":57,"V":58,"W":59,"X":60,"Y":61,"Z":62,"[":63,"\\":64,"]":65,"^":66,"_":67,"`":68,"a":69,"b":70,"c":71,"d":72,"e":73,"f":74,"g":75,"h":76,"i":77,"j":78,"k":79,"l":80,"m":81,"n":82,"o":83,"p":84,"q":85,"r":86,"s":87,"t":88,"u":89,"v":90,"w":91,"x":92,"y":93,"z":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,"ď":208,"Đ":209,"đ":210,"Ē":211,"ē":212,"Ĕ":213,"ĕ":214,"Ė":215,"ė":216,"Ę":217,"ę":218,"Ě":219,"ě":220,"Ĝ":221,"ĝ":222,"Ğ":223,"ğ":224,"Ġ":225,"ġ":226,"Ģ":227,"ģ":228,"Ĥ":229,"ĥ":230,"Ħ":231,"ħ":232,"Ĩ":233,"ĩ":234,"Ī":235,"ī":236,"Ĭ":237,"ĭ":238,"Į":239,"į":240,"İ":241,"ı":242,"IJ":243,"ij":244,"Ĵ":245,"ĵ":246,"Ķ":247,"ķ":248,"ĸ":249,"Ĺ":250,"ĺ":251,"Ļ":252,"ļ":253,"Ľ":254,"ľ":255,"Ŀ":256,"ŀ":257,"Ł":258,"ł":259,"Ń":260,"CC":261,"(=":262,"](":263,"cc":264,"@@":265,")[":266,"CO":267,"NC":268,"CCCC":269,"ccc":270,"OC":271,"]([":272,")(":273,"CN":274,")=":275,"Cl":276,"CCC":277,"-]":278,"([":279,"ccccc":280,")(=":281,"CCCCCCCC":282,"nc":283,"COC":284,"CCN":285,"+]":286,"OCC":287,"Cc":288,"@]":289,"Br":290,"12":291,"]%":292,"@@]":293,".[":294,"cccc":295,"-])":296,"NCC":297,"CS":298,"CCCCC":299,"Nc":300,"COc":301,"nH":302,"NN":303,")/":304,"])":305,"CCOC":306,"CNC":307,"(-":308,"SC":309,")([":310,"Oc":311,"+](=":312,"OP":313,"CCCN":314,"(/":315,"-])=":316,"COP":317,"CCNC":318,"=[":319,"10":320,"21":321,"][":322,"+](":323,"13":324,"-])(=":325,"CCOCC":326,"Na":327,"])[":328,"11":329,"CCCCCC":330,"cnc":331,"NS":332,"NH":333,"CCCCCCCCCCCCCCCC":334,"CCO":335,"@@](":336,"cn":337,"CSC":338,"(\\":339,")\\":340,"CCCCCCC":341,"-].[":342,"CCCCN":343,"Si":344,"CCc":345,"+].[":346,"23":347,")*":348,"SCC":349,"sc":350,"@](":351,"ncc":352,"NCCC":353,"CCCNC":354,"oc":355,"CCCCO":356,"*]":357,"34":358,"OCc":359,"+]([":360,"@]([":361,"-])[":362,"OCO":363,"nnc":364,"14":365,"NNC":366,"CCNCC":367,"])(":368,"].[":369,"NO":370,"nn":371,"32":372,"Cn":373,"ncnc":374,"])([":375,"CCOc":376,"@]%":377,"-].":378,"-])([":379,"COCC":380,"*)=":381,"CCl":382,"CH":383,"([*]":384,"CCS":385,"([*])=":386,"cccnc":387,"CCCCCCCCC":388,"15":389,"OCCO":390,"OS":391,"ccnc":392,"+]=[":393,"Clc":394,"CBr":395,"(*)=":396,"OCCN":397,"*)":398,"43":399,")-":400,"CSc":401,"CNCC":402,"NCc":403,"CCCO":404,"CCCCCCCCCCCCC":405,"CCn":406,"\\[":407,"CCCCCCCCCCC":408,"OCCOCC":409,"FC":410,"@@]([":411,"ON":412,"CCCCCCCCCCCCCCC":413,"ccccn":414,"/[":415,"CCCCCCCCCC":416,"NOC":417,"NCCN":418,"SCCNC":419,"CCCCCCCCCCCC":420,"Fc":421,"ccncc":422,"ccn":423,")*)":424,"CCCCCCCCCCCCCC":425,"OB":426,"OCCC":427,"+])":428,"-](":429,"CCCOC":430,"COCCN":431,"16":432,"CCSC":433,"csc":434,"OCCCC":435,"*])":436,"Brc":437,"])=":438,"](/":439,"CCCCCCCCCCCCCCCCCC":440,"NCCCC":441,"#[":442,"cccs":443,"[*]":444,"CNc":445,"17":446,"45":447,"Sc":448,"ccco":449,"NCCCN":450,"-][":451,"cH":452,"CCOP":453,"CCCc":454,"nccc":455,"+][":456,"CCCCCCCCCCCCCCCCC":457,"COS":458,"31":459,"(=[":460,"cnn":461,"CCCCNC":462,"cs":463,"-])(":464,"](=":465,"NCCSC":466,"OO":467,"18":468,"ncn":469,"Sn":470,"ncccc":471,"cncc":472,"CCCCOC":473,"OCCOC":474,"CSCC":475,"54":476,"Fe":477,"+].":478,"NCCc":479,"Mg":480,")*)[":481,"CCCS":482,"-]#[":483,"CCCl":484,"[*])":485,"Cu":486,"Li":487,"Zn":488,"SCc":489,"CNS":490,"].":491,")*)(":492,"NCCO":493,"no":494,"COCCC":495,"OH":496,"Ca":497,"24":498,"CP":499,"cccn":500,"ClC":501,"CCCOc":502,"*)(=":503,"Co":504,"OCOc":505,"Al":506,"CCCCOc":507,"CCNc":508,"*)[":509,"NCCOC":510,"+]=":511,"CNCCC":512,"OCCOCCOCCOCC":513,"CCCCCN":514,"NCCS":515,"Se":516,"CCNS":517,"NCCNC":518,"As":519,"CNCCN":520,"Ni":521,"coc":522,"ccsc":523,"Ru":524,"NNc":525,"Cr":526,"noc":527,"19":528,"OCCNC":529,"OCOC":530,"56":531,"41":532,")*)*":533,"([*])":534,"ccoc":535,"42":536,"CON":537,"*])[":538,")=[":539,"CCCNCC":540,"SCCC":541,"CCCCc":542,"](*)":543,"OCCCN":544,"Pb":545,"CF":546,"CCCCCCCCCCCCCCCCCCC":547,"cncn":548,"COCCOC":549,"OCCCCCC":550,"sccc":551,"-])/":552,"Pd":553,"CCSCC":554,"CNCc":555,"35":556,"cnccc":557,"-]#":558,"65":559,"*)(":560,"CCBr":561,"+])[":562,"CSSC":563,"Ti":564,"22":565,"Rh":566,"on":567,"CCCCS":568,"COCCOCC":569,"CCCCCCN":570,"ClCc":571,"CCCCCCCCCCCCCCCCCCCC":572,"(\\[":573,"Ba":574,"-]=[":575,"COCc":576,"NNN":577,"CI":578,"SS":579,")*)([":580,"OCCCO":581,"CNN":582,")/[":583,"Mo":584,"Zr":585,"Hg":586,"53":587,"Mn":588,"Pt":589,"COCCNC":590,"CNCCO":591,"CCCCCCCCCCCCCCCCCCCCCC":592,"cnccn":593,"]=":594,"CCP":595,"](\\":596,"CCCCCCCCCCCCCCCCCCCCCCCC":597,"NP":598,"COCCO":599,"CSCCC":600,"OCCCCCCCC":601,"SiH":602,"OOC":603,"CCCCCCCCCCCCCCCCCCCCC":604,"(-*)=":605,"CCOS":606,"OCCc":607,"20":608,"OCCOCCO":609,"CCCCCNC":610,"25":611,"(*)(=":612,"*)([":613,"-]=":614,"CCCCCCOC":615,"CCCn":616,"NSC":617,"OCCCCC":618,"Sb":619,"@](=":620,"-*)":621,"SN":622,"nsc":623,"CCCCCO":624,"CCCCCOC":625,"NON":626,"CCSc":627,"BrCc":628,"co":629,"@@](=":630,"nccn":631,"nccs":632,"Ic":633,"Ag":634,"ncccn":635,"CCCCCCCCN":636,"CCCSC":637,"+]#":638,"NCCCCCC":639,"CCCCl":640,"nccnc":641,"Ir":642,"[*])[":643,"ccnn":644,"Au":645,"*)*":646,"NCCCCC":647,"+]#[":648,")\\[":649,"123":650,"HH":651,")[*]":652,"CSSCC":653,"67":654,"CCCCCCCCCCCCCCCCCCCCCCC":655,"BrC":656,")(/":657,"PH":658,"Te":659,"cnnc":660,"ClCC":661,"nnnn":662,"]=[":663,"occc":664,"CCCCCCCCOC":665,"CCNCCN":666,"(/[":667,"--]":668,"NOCC":669,"76":670,"ns":671,"CCCCn":672,"OCCOc":673,"NCCCOC":674,"onc":675,"COCCCN":676,"CCCCCCCCCCCCCCCCCCCCCCCCC":677,"OCCCOC":678,"CCCCCCCCCCCCCCCCCCCCCCCCCC":679,"SSC":680,"CCOCCO":681,"nnn":682,"CCCOCC":683,"+])=":684,"NSN":685,")*)(=":686,"nonc":687,"Cd":688,"NCCCCN":689,"SCCN":690,"occ":691,"46":692,"CSCCN":693,"CCCCCCCN":694,"64":695,"*[":696,"CCCCCOc":697,"Ge":698,"OCCCl":699,"CCCCCCCCCCCCc":700,"NCCCO":701,"cncnc":702,"(*)[":703,"OCCCCCCC":704,"OCCOCCOCCOCCOCCOCCOCCOCC":705,"33":706,"CNNC":707,"52":708,"@@]%":709,"CCCBr":710,"OCN":711,"OCCCCCCCCCC":712,"])(=":713,"+])(=":714,"SCCS":715,"CCCCCCCOC":716,"CCCCCCCCCCCCCCCCOC":717,"NCCCNC":718,"36":719,"CCOCCN":720,")*)*)*)*":721,"Nn":722,"CNCCCC":723,"BrCC":724,")*)=":725,"COCCCC":726,"CCCCCCCCCc":727,"CCON":728,"26":729,"CCNCc":730,"CCOCCOC":731,"cnnn":732,"75":733,"OCCS":734,"CCCCCCCc":735,"OCCOCCN":736,"CCCCSC":737,"CCCCCCCCCCCCN":738,"++]":739,"Ce":740,"OCCCCCCCCC":741,"scc":742,"(*)":743,"78":744,"OCCCCCCCCCCCCCCCC":745,")(*)[":746,"++].[":747,"86":748,"87":749,"ClH":750,"OCCNCCO":751,"Gd":752,"OCCCNC":753,"CCCCCc":754,"CCOCCC":755,"ncsc":756,"CCCCCCCCCCCCOC":757,"98":758,"Bi":759,"NCN":760,"]([*])":761,"]([*])[":762,"ncnn":763,"NCCOP":764,"Cs":765,"Sr":766,"CCNCCC":767,"=%":768,"La":769,"CNCCOC":770,"CCCCCCCCOc":771,"CCCCCCc":772,"CCCCCCCCCCCCCCCCCCOC":773,"57":774,"OCCCCCCCCCCCC":775,"SCCCC":776,"scnc":777,"CCCCCCCCCCOC":778,"89":779,"97":780,"CCCCCl":781,"CSCc":782,"CCCNc":783,"[*])(":784,"@+]":785,"SSc":786,")(*)":787,"44":788,"Hf":789,"OCCCCCCCCCCC":790,"COCCCNC":791,"CCCCCCNC":792,"CNCCCN":793,"OCCl":794,"OCCOCCOC":795,"OCCCCOC":796,"cscn":797,"-*)=":798,"51":799,"Tl":800,"NCCCOCC":801,"-]([":802,"--](":803,"ONC":804,"Pr":805,"]\\":806,"])\\":807,":*)":808,"CCCCCCCCO":809,"CCCCCCO":810,"NCCCn":811,"Ga":812,"ncoc":813,"NCCOCCOCC":814,"27":815,"314":816,"CCF":817,"CONC":818,"CNCCc":819,"CCCCCCCCCCCCCCCCCCN":820,"OCCCCCN":821,"NCCCCNC":822,"nsnc":823,"Nd":824,"CNCCNC":825,"CCCCCCCCCCN":826,"CCCNS":827,"CCCCCCOc":828,"NCCCS":829,"COCCn":830,"OCCCc":831,"(:*)":832,"COCN":833,"OCCBr":834,"cscc":835,"CCCCCCCCCCCCO":836,"CCOCCCNC":837,"-])(-*)=":838,"In":839,"CCI":840,"cccnn":841,"NCCCc":842,"91":843,"Nb":844,"OCCCCN":845,"COCOC":846,"CSCN":847,"nncn":848,"OCCOCCOCCO":849,"NCCNc":850,"NNCC":851,"OCCCCCCCCCCCCCC":852,"@@+]":853,"([*])[":854,"ncncc":855,"1234":856,"CSN":857,"OCCOCCOCCOCCO":858,"NCCCCCCNC":859,"IC":860,"COCCOc":861,"CCCCOCC":862,"CCCP":863,"NCCSCC":864,"CCOCCCN":865,"OCCCCCCCCCCCCC":866,"OCCCCCCCCCCCCCCCCCC":867,"PC":868,"SH":869,"CCCCCCCCc":870,"CCCCCCCCNC":871,"NCCOCC":872,"NCCOc":873,"CCOCCOCCOCCOCCOCC":874,"(#":875,"++].":876,"29":877,"OCCCCO":878,"NNS":879,"+](-":880,"cncs":881,"cnoc":882,"NOS":883,"ccncn":884,"OCCOCCOCCOC":885,"28":886,"SCCO":887,"nnnc":888,"*)*)(":889,"Eu":890,"NCCCCCCCC":891,"Rb":892,"]#[":893,"])/[":894,"CCCCP":895,"81":896,"Re":897,"nncc":898,"CCOCc":899,"CCNCS":900,"CCSS":901,"NCCCCCN":902,"Sm":903,"]/":904,")(\\":905,"NCCOCCO":906,"NCCCCCCN":907,"37":908,"CB":909,"NCCCCO":910,"Os":911,"]#":912,"COCCc":913,"CCCCNc":914,"CCCCCCCCCN":915,"-])\\":916,"NCCCl":917,"([*])[*]":918,"*)*)*":919,"])/":920,"ocnc":921,"ccnnc":922,"NCNC":923,"CCCCBr":924,"CCCCCS":925,"CCCCCCCCCOC":926,"+])(":927,"OCCF":928,"NCCn":929,"CCCCCCSC":930,"CCCCCCCCCCCCCCCCCCCCCCCCCCC":931,"ccno":932,"Er":933,"IH":934,"OI":935,"Po":936,"ccon":937,"COCCNCC":938,"CCCCNCC":939,"CSCCNC":940,"CCCCCCCCCCCCOS":941,"-*)[":942,"30":943,"61":944,"NCCNCC":945,"SP":946,"Yb":947,"oncc":948,"sn":949,"CCCOP":950,"COB":951,"COCCCCCCCCCCCCCCCC":952,"OCl":953,"CCCNCCC":954,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":955,"OCCCCCOC":956,"OOO":957,"SeH":958,"*)*)*)*)*":959,"68":960,"NCCCCCCC":961,"Ta":962,"sccn":963,"CCCCCBr":964,"CCOCCNC":965,"NCCNS":966,"NCCNCCNCCN":967,"CCCCCCCCCCCCNC":968,"CCCCCCCCCCCCCCOC":969,"OCCCCCCOC":970,"*)*)=":971,"63":972,"735":973,"Ho":974,"SNC":975,"Tb":976,"CCCCCSC":977,"-]/":978,"CSS":979,")([*])":980,"ncco":981,"CCCOS":982,"47":983,"Dy":984,"COCO":985,"CCCCOP":986,"CCCCCOP":987,"CCCF":988,"CCCSCC":989,"CCCCCCCCOP":990,"CCCCCCCCCCO":991,"CCCCCCCCCCOc":992,"+])([":993,"OCCSC":994,"CSCCCC":995,"CCCCCn":996,"CCCCCCn":997,"CCCCCCCCCCCCCCCCCCCCCCCCCCCC":998,"2345":999,"nnsc":1000,"COCCCOC":1001,"OCCCS":1002,"nocc":1003,"SbH":1004,"NOCc":1005,"SCCOC":1006,"+]\\":1007,"CCOCCOCCN":1008,"cnco":1009,"CCCCCCCCCCCCCCCCN":1010,"CCCCCCCCCCCCCCCCS":1011,"OCCOS":1012,"\\[*]":1013,"conc":1014,"79":1015,"753":1016,"Be":1017,"FS":1018,"[*":1019,"NCl":1020,"OCP":1021,"ClP":1022,"CCCCCCCCCCCCCCCCCCNC":1023,"@](/":1024,"NCCNCCN":1025,"OCCCCl":1026,"NCCCCCO":1027,"TlH":1028,"(*)(":1029,"++]([":1030,"NCO":1031,"On":1032,"SCN":1033,"SCCCCCC":1034,"SCCCS":1035,"Tm":1036,"CCCCNS":1037,"CCCCOCCOC":1038,"OCF":1039,"CCCSc":1040,"CSCCO":1041,"SCF":1042,"+](\\":1043,"CCONC":1044,"@@](/":1045,"nncs":1046,"NNCc":1047,"/[*])":1048,"SSS":1049,"cocn":1050,"(*)([":1051,"48":1052,"55":1053,"FB":1054,"He":1055,"NCCCCCNC":1056,"OCCCCCCCCCCCCCCC":1057,"OCCCCCCCCCCCCCCCCC":1058,"se":1059,")[*])":1060,"CNCCS":1061,"OCCCOCC":1062,"NCCSCc":1063,"CCOCN":1064,"CCCNCCN":1065,"CCOCCOCC":1066,"cnsc":1067,")*)*)":1068,"OCOCC":1069,"OCOCCOC":1070,"([*])([*])":1071,"CCSCCC":1072,"OCCOCCCC":1073,"OCCOCCOCCOCCOCCO":1074,"COCCOCCOC":1075,"74":1076,"BH":1077,"CCB":1078,")[*])[":1079,"ClCCN":1080,"CCCCCCCCS":1081,"CCNN":1082,"OCCn":1083,"CSP":1084,"234":1085,"nnco":1086,"CCSSC":1087,"CCCCCCCCCCCc":1088,"CCCCCCCCCCCCS":1089,"(*":1090,"-*":1091,"73":1092,"NCS":1093,"CCCCCCCCOCC":1094,"BrCCC":1095,"CCOCCOCCOCC":1096,"CCCCCCCCCCCCOc":1097,"CCCCCCCCCCCCOP":1098,"NCCCNCCCCN":1099,"AlH":1100,"*)*)(*)*)(":1101,"23451234":1102,"SO":1103,"SCCc":1104,"SOOO":1105,"snc":1106,"OCNC":1107,")(*)=":1108,"CCCCCCCCCCc":1109,"CCNCCO":1110,"OCCSCC":1111,"CCOCCOCCNC":1112,"COCCNc":1113,"COCCOCCNC":1114,"NCCOCCOCCNC":1115,"*)*)":1116,"Lu":1117,"NCCCCCCCCN":1118,"OCOP":1119,"OCCNCC":1120,"COCCCCC":1121,"CCCI":1122,"CCCCCCCCn":1123,"BrCCc":1124,"CSCCS":1125,"CNCP":1126,"CCCNCCCN":1127,"+](\\[":1128,"CCOCCOCCOCCO":1129,"CCCCCCl":1130,"CCCCCCCO":1131,"CCCCCCBr":1132,"CCCCCCCOc":1133,"COCCS":1134,"OCCNc":1135,"CCCCCCCCCCCOC":1136,"CCCCCCCCCCCCn":1137,"OCCCCCCO":1138,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1139,"(*)*":1140,"/*)":1141,"96":1142,"ONc":1143,"Xe":1144,"COO":1145,"CNCCNCc":1146,"CCCCCCCCSC":1147,"CCCCCCCCCCNC":1148,"OCCCOc":1149,"CSSCCC":1150,"])*":1151,"CCOCCOCCOC":1152,"CCCCCCS":1153,"CCCCCCCCCCCCCCCCOc":1154,"CCCCCCCCCCCCCCCCOP":1155,"CCCCCCCCCCCCCCCCCCOCC":1156,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1157,"CCCCCCCNC":1158,"NCCCSC":1159,"COCCCOc":1160,"CCSSCC":1161,"CNCCCO":1162,"CCCOCCC":1163,"/[*]":1164,"CCCCCCCCCCOP":1165,"NCCNCCO":1166,"ccns":1167,"OCCCCc":1168,"456":1169,"OCCCCCCS":1170,"OCCCCCCOc":1171,"94":1172,"FCC":1173,"NI":1174,"NCOC":1175,"OOCC":1176,"SSCC":1177,"](*)[":1178,"COOC":1179,"CCCCCCOCC":1180,"CCCCCNc":1181,")(*)*":1182,"CNCCCNC":1183,"CCCCCCCCCCS":1184,"CCCCCCCCCCn":1185,"+]/":1186,"NCCOCCOCCO":1187,"NCCOCCOCCN":1188,"-])=[":1189,"CCCCCCCOP":1190,"CCSCc":1191,"OCCOCCC":1192,"CCCOCCOC":1193,"OCCOCCOCC":1194,"CCCCCCCCCCCCCOC":1195,"CCCCCCCCCCCCCCCO":1196,"OCCCCNC":1197,"CCCCCCCCCCCCCCCCCCOP":1198,"NCCCCNCCCN":1199,"COCCOCCO":1200,"COCCOCCOCC":1201,"NCCCCCCO":1202,"CCOCCOCCOCCOCCOCCOCCNC":1203,"--].[":1204,"/*":1205,"62":1206,"83":1207,"OOS":1208,"OCCCCCCCCCCCCCCCCCCCC":1209,"Pc":1210,"SCl":1211,"SCS":1212,"CNOC":1213,"CNCCCCN":1214,"ClCCc":1215,"CCCCCCCCCCCN":1216,"CCCCCCCCCCCO":1217,"ncon":1218,"CCNCCCC":1219,"+])/":1220,"OCCOP":1221,"BrBr":1222,"-])*)[":1223,"NCCF":1224,"CSCCCCC":1225,"CSSSC":1226,"CCCCCCCCCCCCCCCCCOC":1227,"CCCCCCCSC":1228,"CCCNCc":1229,"345":1230,"COCCCO":1231,"CCSCCN":1232,"CCCCCCCCCBr":1233,"OCCNS":1234,"CCCCCCCCCCCCSC":1235,"CCCCCCCCCCCCCOP":1236,"OCCCCCl":1237,"csnn":1238,"*)(*)*":1239,"BiH":1240,"[*][":1241,"--][":1242,"59":1243,"71":1244,"NOCCO":1245,"SCCCN":1246,"](-*)":1247,"NCn":1248,"CCCCOCCOCC":1249,"CCCCCCNc":1250,"OCn":1251,"CNCCCCC":1252,"ClCCC":1253,"ClCCCN":1254,"CCCCCCCCOS":1255,"NCCP":1256,"CSCCCCCC":1257,"])\\[":1258,"(-[":1259,"CCCCCCCCCCCCCCCCOCC":1260,"CCCCCCCBr":1261,"CCNCCP":1262,"CCCOCCOCC":1263,"357":1264,"cocc":1265,")#":1266,"*=[":1267,"-[":1268,"58":1269,"72":1270,"85":1271,"=*":1272,"OF":1273,"OON":1274,"ccsn":1275,"COCOc":1276,"CCCCSCC":1277,"CCCCCNS":1278,"CNO":1279,"CCCCCCCCP":1280,"CCCCCCCCCO":1281,"CCCCCCCCCS":1282,"CCCCCCCCCCOCC":1283,"CCNCCCN":1284,"CCNCCNC":1285,"OCCP":1286,"-])*":1287,"NCCCNCC":1288,"NCCCOCCOCC":1289,"CCOCCS":1290,"CCOCCOCCOCCN":1291,"CCOCCCn":1292,"CCCCNCCC":1293,"SCCSC":1294,"COCCCl":1295,"CCSP":1296,"CCSSCCC":1297,"CCCON":1298,"CCCCCCCCCCCCCCN":1299,"CCCCCCCCCCCCOCC":1300,"NCCCCSC":1301,"cnns":1302,"AsH":1303,"CCNCCNCCNCC":1304,"COCCCNc":1305,"*)*)*)*)*)":1306,"++][":1307,"39":1308,"312":1309,"69":1310,"82":1311,"BOB":1312,"FP":1313,"IN":1314,"ICC":1315,"NOc":1316,"OSC":1317,"SCCCCC":1318,"Tc":1319,"]/[":1320,"ssc":1321,"sncc":1322,"snnc":1323,"COCCCCCCCCCCCCCCCCCC":1324,"NCP":1325,"CCCCB":1326,"CCCCNCCCN":1327,"-]/[":1328,"CCNCCOC":1329,"OCCCNCC":1330,"OCCSS":1331,"BrCCCC":1332,"BrCCOc":1333,"CSCCCCCCCCC":1334,"CNCN":1335,"CCCNN":1336,"+](/[":1337,"118":1338,"CCCCCCOP":1339,"CCCCCCCCCCCCCCCCCCCCOC":1340,"CCOO":1341,"SCCCO":1342,"SCCSCC":1343,"CCCCOCCCNC":1344,"341":1345,"NOCCN":1346,"CNCCCOC":1347,"CCCCCCCCCCCBr":1348,"CCCCCCCCCCBr":1349,"CCCCCCCCCCCCCCc":1350,"OCCCCCCN":1351,"NCCCCc":1352,"NCCCCOC":1353,"[*]\\":1354,"NCCCNS":1355,"OCCOCn":1356,"CCCSP":1357,"COCCCn":1358,"OCCOCCOCCOCCOC":1359,"OCCOCCOCCOCCOCCOCCOCCO":1360,"COCCOCc":1361,"COCCOCCOCCOC":1362,"CCCCCCCCCCCCCCCCCCCCCCOC":1363,"SSSSC":1364,"*)*)*)":1365,"nscc":1366,"CNCCCCCCOCC":1367,"*)*)*)*":1368,"*)*)*)*)*)*)*)*)*":1369,"NCCNCCNCCNCCN":1370,"NCCCCCCCCNCCCCCCCCN":1371,"2123":1372,"38":1373,"93":1374,"NCCCCCCCCCC":1375,"NOCOCCOC":1376,"OCCCCCCCCCCCCCCCCCCC":1377,"SOC":1378,"SCSc":1379,"Th":1380,"\\*)(":1381,"ss":1382,"](*)(*)*":1383,"COCCCCCCCC":1384,"CCCCCNCC":1385,")(-*)=":1386,"ClB":1387,"CCCCCCCCBr":1388,"CCCCCCCCCCCNC":1389,"CCNCCc":1390,"cccccc":1391,"NCCCOc":1392,"NCCOCCN":1393,"NCCSc":1394,"NCCOCCOC":1395,"NCCCOCCOC":1396,"CSCCCCCCC":1397,"CSCCl":1398,"CCCNCCOC":1399,"CCOCCn":1400,"CCOCCCO":1401,"CCCCCCP":1402,"CCCCCCCCCCCCCCCCO":1403,"CCCCCCCCCCCCCCCCNC":1404,"CCOCO":1405,"CCOCOC":1406,"cnncc":1407,"SCCn":1408,"NCCCF":1409,"COCCSC":1410,"OCCON":1411,"CCCOCCN":1412,"OCCOCCOCCNC":1413,"CCCCCCCCCCCCCCCc":1414,"CCCCCCCCCCSC":1415,"CCCCCCCCCCCCCN":1416,"OCCCBr":1417,"OCCCSC":1418,"-](/":1419,"OCCCCS":1420,"OCCCCBr":1421,"OCCCCOc":1422,"NCCCNCCCCNC":1423,"NCCCNCCCCNCCCN":1424,"csnc":1425,"ncno":1426,"CNCCNCCNCCN":1427,"567":1428,"*])[*]":1429,"COCCOCCOCCOCC":1430,"COCCCNS":1431,"NCCCCNCCCNC":1432,"OCCCCCCCCCCCOC":1433,"*)*)*)*)*)=":1434,"/*)/":1435,"92":1436,"95":1437,"99":1438,"At":1439,"NB":1440,"NCCCCCCCCCCC":1441,"ONCC":1442,"SCNC":1443,"SOO":1444,"](=[":1445,"al":1446,"COCOCC":1447,"COCCCCCCCCCC":1448,"COCCCS":1449,"NCSC":1450,"CCCCI":1451,"CCCCCOCC":1452,"CCCCOCCCN":1453,"CNSC":1454,"CNCCNCC":1455,"CCCCCCCCNCCCN":1456,"COCn":1457,"COCNC":1458,"OCCI":1459,"@]/":1460,"BrCCN":1461,"NCCBr":1462,"NCCCNc":1463,"NCCCOCCO":1464,"CSCCCCCCCC":1465,"CCCCCI":1466,"CCOCP":1467,"CCOCn":1468,"SCn":1469,"+](=[":1470,"CCCNCCNC":1471,"101":1472,"+](/":1473,"CCOCCCl":1474,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1475,"CCOCCOCCOCCOCCO":1476,"CCCCCCCl":1477,"CCOB":1478,"CCCCCCCS":1479,"CCCCNCCCCN":1480,"SCCSCCS":1481,"CCCCON":1482,"nnccc":1483,"COCCBr":1484,")-[":1485,"CCCOCCO":1486,"CCCCCCCCCCCCCCO":1487,"CCCCCCCCCCCCCCOc":1488,"OCCCCCOc":1489,"NCCCCl":1490,"NCCCCCCCN":1491,"NCCCCNS":1492,"NCCSSCCNC":1493,"COCCOCCOCCO":1494,"COCCOCCOCCOc":1495,"COCCOCCOCCOCCOCCO":1496,"SSSC":1497,"SSSS":1498,"COCCOCCCC":1499,"COCCOCCC":1500,"COCCOCCN":1501,"OCCCCCCCCOC":1502,"*)*)(*)*":1503,"NCCCCCCCCCCNC":1504,"NCCCNCCCCNCCCNC":1505,"(*)*)*":1506,"(*)*)=":1507,"*-":1508,"66":1509,"656":1510,"77":1511,"711":1512,"84":1513,"88":1514,"@+](":1515,"BO":1516,"NCCCCCCCCCCCCCCCCCC":1517,"NNCCO":1518,"OBr":1519,"OOP":1520,"Rn":1521,"SI":1522,"SCSC":1523,"cco":1524,"COn":1525,"COCCCCN":1526,"NCNc":1527,"CCCCF":1528,"CCCCCOS":1529,"CCCCCCNS":1530,"OCI":1531,"OCS":1532,"CNP":1533,"CNCCCCCC":1534,"CNCCNS":1535,"CNCCOCCO":1536,"CCCCCCCCCCOS":1537,"CCNP":1538,"+][*]":1539,"OCCNCc":1540,"NCCCOCCC":1541,"CSNC":1542,"CSCSC":1543,"CSCCSC":1544,"CCCCCP":1545,"CCCNCCCCN":1546,"CCCNCCNCCC":1547,"=[*]":1548,"CCOCCOc":1549,"NSc":1550,"CCCCCCCCCCCCCCCCCc":1551,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1552,"CCCCCCCCCCCCCCCCCCOc":1553,"CCOCCCC":1554,"CCOCCCCNC":1555,"(\\[*])":1556,"SCCl":1557,"])(\\":1558,"ncncn":1559,"CCSCCNC":1560,"CCCOCCCC":1561,"CCCCCCCCCCCS":1562,"CCCCCCCCCCCCCc":1563,"CCCCCCCCCCCCCCCN":1564,"COCCNS":1565,"454":1566,"OCCOCCOCCOCCOCCOCC":1567,"SCCCSC":1568,"229":1569,"CCCCCCNCCC":1570,"COCCNCc":1571,"COCCOS":1572,"CSCCCSC":1573,"OCCCCCCCCCCOC":1574,"OCCOCCOCCN":1575,")*)*)*)*)*)*":1576,"NCCOCCOCCOCCNC":1577,"CCOCCOCCOCCOCCN":1578,"CNCCCCCCOCCOCc":1579,"*:":1580,"*=":1581,"*#[":1582,"++](":1583,"40":1584,"49":1585,"467":1586,"50":1587,"60":1588,"70":1589,"80":1590,"Ac":1591,"Ar":1592,"FCc":1593,"NBr":1594,"NCCCCCCCCC":1595,"NOCCOC":1596,"OCCCCCCCCCCCCCCCCCCCCCC":1597,"OCCCCCCCCCCCCCCCCCCCCC":1598,"PN":1599,"Ra":1600,"SB":1601,"SCCNCC":1602,"SCCCCCCCCCCCC":1603,"SSCCC":1604,"\\*":1605,"op":1606,"sscc":1607,"@@+](":1608,"COOCC":1609,"COCCCCCC":1610,"COCCCCNC":1611,"COCCCCOC":1612,"COCCCCCCCCCCCCCCCCCCCC":1613,"NCNCCCC":1614,"CCCCOCCO":1615,"CCCCOCCNC":1616,"OCSC":1617,"]([*]":1618,"CNCOC":1619,"CNOCC":1620,"CNNN":1621,"CNCCOc":1622,"CNCCCc":1623,"CNCCCS":1624,"ClCCn":1625,"ClCCCc":1626,"ClOCl":1627,"-](=":1628,"CCCCCCCCCl":1629,"CCCCCCCCCNC":1630,"CCCCCCCCCOP":1631,"CCCCCCCCNS":1632,"CCCCCCCCCSC":1633,"CCCCCCCCCOCC":1634,"CCCCCCCCON":1635,"CCNCCCNCC":1636,"+]*)":1637,"OCCCOP":1638,"OCCSSC":1639,"BrP":1640,"BrCCOC":1641,"BrCCn":1642,"125":1643,"-])-":1644,"NCCOCc":1645,"NCCNCc":1646,"NCCON":1647,"NCCOCCNC":1648,"NCCOCCOCCOCCOCCOCCOCCOCCOCC":1649,"CSCCCN":1650,"CSCCCO":1651,"CCCCCF":1652,"NNCCN":1653,"])-":1654,")([*])[*]":1655,"102":1656,"131":1657,"CCOCCc":1658,"CCOCCCOC":1659,"CCOCCOCCO":1660,"CCOCCCNCC":1661,"CCOCCOCCOCCOC":1662,"CCCCCCI":1663,"CCCCCCCOCCCN":1664,"NSS":1665,"NSCC":1666,"CCCCCCCCCCCCCCCCCN":1667,"CCCCCCCCCCCCCCCCCCc":1668,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1669,"CCCCCCCCCCCCCCCCSc":1670,"CCCCCCCCCCCCCCCCCCCCCCN":1671,"CCOOC":1672,"cnon":1673,"cnsn":1674,")\\*":1675,"CCCCNO":1676,"SCCCOC":1677,"NCCCBr":1678,"CCCCOS":1679,"CCCCOCCN":1680,"+]([*])":1681,"COCCl":1682,"COCCCOCC":1683,"CCSN":1684,"CCSCCCC":1685,"CCSCCO":1686,"CCSSc":1687,"OCCNCCC":1688,"OCCNCCOC":1689,"CNCCCl":1690,"CNCCSC":1691,"CNCCOP":1692,"CCCOCCCN":1693,"CCCOCCCNC":1694,"OCCOCCOc":1695,"CCCCCCCCCCP":1696,"CCCCCCCCCCCl":1697,"CCCCCCCCCCCOP":1698,"NCCNCCNC":1699,"CCCCCCCCCCCCCCOCC":1700,"CCCCCCCCCCCCCOS":1701,"CCCCCCCCCCCCCCCOC":1702,"OCCCn":1703,"CCCOCc":1704,"OCCCCOP":1705,"OCCCCCCNC":1706,"])=[":1707,"CCCCCCCCCCCCCCCCCCP":1708,"NCCCCCOC":1709,"NCCCCOCC":1710,"NCCCCCCNc":1711,"NCCCNCCCN":1712,"CSCCCl":1713,"CCCSCCC":1714,"NCCSSC":1715,"NCCSSCC":1716,"NCCSSCCN":1717,"CNCCNCCN":1718,")*)*)=":1719,"OCCCCCCCl":1720,"COCCOCCOCCN":1721,"COCCOCCOCCOCCN":1722,"COCCOCCOCCOCCOC":1723,"CCCCCCNCCCC":1724,"]=*":1725,"OCCOCCOS":1726,"GeH":1727,"OCCOCCOCCOCCOCCOCCOCCOCCOCCO":1728,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1729,")*)*)*)*)*":1730,"OCCSCCOC":1731,"579":1732,"([*])[*])":1733,"CCOCCOCCOCCOCCOCCOC":1734,"ClCCNP":1735,"CCOCCOCCOCCOCCNC":1736,"NCCOCCOCCOCCC":1737,"NCCOCCOCCOCCN":1738,"NCCCOCCOCCOCCCN":1739,"NCCCOCCOCCOCCCNC":1740,"OCCSSCCOC":1741,"OCCSSCCO":1742,"*)*)*)*)*)*)*)*)*)*)":1743,"#*":1744,"(*)*)(*)*)(":1745,"*)*)[":1746,".*:":1747,"113":1748,"4123":1749,"557":1750,"90":1751,"=*)*)*)*":1752,"BB":1753,"Cm":1754,"FN":1755,"FCl":1756,"FCCC":1757,"FCCOC":1758,"NF":1759,"NCCCCCCCCCCCCCCCC":1760,"NCCCCCCCCCCCC":1761,"NNCCc":1762,"NCCCCCCCCCCCCN":1763,"OCCCCCCCCCCCCOC":1764,"Pu":1765,"SF":1766,"SCCCCCCCCCC":1767,"SCCCc":1768,"\\*)":1769,"]*":1770,"]\\[":1771,"(=*)":1772,"COSC":1773,"COCCCCCCCCC":1774,"COCCCCCCCCCCCC":1775,"NCNCCCCC":1776,"CCCCSc":1777,"OCBr":1778,")(*)(":1779,")(*)*)(*)*)(":1780,"CNCCCCO":1781,"CNNCc":1782,"CNCCCCNC":1783,"CNCCCNCC":1784,"CNCCCCCCN":1785,"ClS":1786,"ClCl":1787,"ClCCOP":1788,"ClCCCl":1789,"ClSS":1790,"-]%":1791,"CCCCCCCCl":1792,"CCCCCCCCCCl":1793,"CCCCCCCCNCCCC":1794,"CCCCCCCCCCOCCO":1795,"CCCCCCCCCCOCCC":1796,"CCCCCCCCOCCOS":1797,"CCNNC":1798,"CCNCCNCC":1799,"+]/[":1800,"OCCSc":1801,"OCCCON":1802,"OCCCNCCCO":1803,"@]\\":1804,"BrCCCCN":1805,"BrCCCc":1806,"-])/[":1807,"NCCOCCC":1808,"NCCOCCOCCOCCOCC":1809,"NCCOCCOCCOCCOCCOCCO":1810,"CSI":1811,"CSO":1812,"CSCO":1813,"CSCOC":1814,"CSCS":1815,"CSCNC":1816,"CSCCCNC":1817,"CSCSCC":1818,"CSCCCS":1819,"CSCCNc":1820,"NNNC":1821,"])*)=":1822,"CNCNC":1823,"(-*)":1824,"(-*)(=":1825,"(/[*])[":1826,"10467":1827,"213":1828,"CCOCCl":1829,"CCOCCBr":1830,"CCOCCCNc":1831,"CCCCCCCCCCCCCCCCc":1832,"CCCCCCCCCCCCCCCCNS":1833,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":1834,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":1835,"CCOCCCCCC":1836,"CCOCCNc":1837,"CCCCCCCn":1838,"CCCCNP":1839,"CCCCNCCCC":1840,"@](\\":1841,"NCCCSCC":1842,"CCCCOB":1843,"CCCCOCCC":1844,"*])=":1845,"343":1846,"OCOCCOCCO":1847,"nncnn":1848,"CCNCCCO":1849,"])(*)*":1850,"COCCCOCCOC":1851,"CCSNC":1852,"CCSCCOC":1853,"CCSSCCNC":1854,"CCSSSC":1855,"CCCCCCCCCI":1856,"OCCOO":1857,"CNCCCOc":1858,"CNCCSCC":1859,"CNCCCOCC":1860,"CCCOCCOCCO":1861,"CCCOCCOCCOCCOCCOCCOCC":1862,"CCCCCCCCCCCCCNC":1863,"OCCOCCOCCS":1864,"CCCCCCCCCCCCCCCBr":1865,"CCCCCCCCCCI":1866,"NCCNCCCNCCN":1867,"CCCCCCCCCCCCP":1868,"CCCCCCCCCCCCCO":1869,"CCCCCCCCCCCCNCC":1870,"CCCCCCCCCCCCCOCC":1871,"CCCCCCCCCCCCSCCC":1872,"CCCCCCCCCCCCOCCOCCOCCO":1873,"CCCCCCCCCCCCOCCOS":1874,"CCCCCCCCCCCCCCS":1875,"CCCCCCCCCCCCCCCOCC":1876,"OCCCF":1877,"OCCCCI":1878,"OCCCCCS":1879,"OCCCCOCCCO":1880,"CCCCCCCCCCCCCCCCCCBr":1881,"[*])=":1882,"NCCCNCCN":1883,"318":1884,"OOOC":1885,"ncns":1886,"CCCCOCN":1887,"CCCSSC":1888,"CCCSSCCCC":1889,"[*])-":1890,"OCCOCCOCCOCCOc":1891,"OCCOCCOCCOCCOCCOCCOCCOCCO":1892,"NCCSS":1893,"197":1894,"5678":1895,"4253":1896,"OCCCNCCO":1897,"OCCCCCCl":1898,"*)(*)=":1899,"CCCCSCCCC":1900,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1901,"COCCOCCOCCOCCOCCOCCO":1902,"COCCOCCOCCOCCOCCOC":1903,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":1904,"COCCOCCOCCOCCOCC":1905,"CCCCCCCCCCCCCCCCCCCCCO":1906,"(\\[*])[*]":1907,"SSN":1908,"SSCCCCCCO":1909,"537":1910,"CCCCCCCCCCCCCCCCCCCCCCCCCO":1911,"CCCCCCCCCCCCCCCCCCCCCCCCOC":1912,"CCCCCCCCCCCCCCCCCCCCCCCCCCCO":1913,"COCCOCCCNC":1914,"OCCCCCCCCCCOc":1915,"OOCl":1916,"201":1917,"CCCCCCCCNCCCCCCCC":1918,"NCCCCCCBr":1919,"CCNCCNCCN":1920,"468":1921,"OCCCCCCCc":1922,")*)*)*)*)*)*)*)*)*)*":1923,"CCCCCCCCCCCCNCCC":1924,"869":1925,"OCCCNCc":1926,"8915":1927,"@+]%":1928,"OCCOCCOCCOCCC":1929,"12345678":1930,"OCCOCCOCCOCCOS":1931,"NCCSCCCO":1932,"CCOCCOCCOCCOCCOCCNC":1933,"CCOCCOCCOCCOCCOCCOCCO":1934,"CCOCCOCCOCCOCCOCCOCCOCCOCCNC":1935,"234567":1936,"[*+":1937,"[*-]":1938,"CCOCCOCCOCCOCCC":1939,"(*)*)*)(":1940,"CCCCOCCOCCOP":1941,"CCCOCCOCCOCCOCCOCCOC":1942,"CCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1943,"@]/%":1944,"CNCCCCCCOCCCCc":1945,"CNCCCCCCNCCCCCCCCNCCCC":1946,"ClSSCl":1947,"(/[*])[*]":1948,"CCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":1949,"123456789":1950,"(#[":1951,"*(":1952,"**":1953,"*/":1954,"++])=":1955,"--]([":1956,"/*)(=":1957,"212":1958,"245":1959,"321":1960,"642":1961,"6123":1962,"696":1963,"713":1964,"822":1965,"846":1966,"912":1967,"933":1968,"=*)":1969,"Bc":1970,"FCOC":1971,"IB":1972,"IP":1973,"ICCC":1974,"ICc":1975,"Kr":1976,"Ne":1977,"NNCCCN":1978,"NOCCCN":1979,"NCOCCCC":1980,"NCCCCCCCCO":1981,"NCCCCCCCCCCN":1982,"Op":1983,"ONO":1984,"ONCc":1985,"OOCCCC":1986,"OCCCCCNC":1987,"PO":1988,"Pa":1989,"PCC":1990,"PCCP":1991,"Rf":1992,"SNCC":1993,"SCCOCC":1994,"SCCCCCCC":1995,"SCCCCCCCCCCC":1996,"SCCCCl":1997,"SCCOCCO":1998,"SCCOCCN":1999,"SCCCCSC":2000,"]*)[":2001,"(=*)([":2002,"](*)(":2003,"](*)([":2004,"](-*)[":2005,"ccs":2006,"ccocc":2007,"@@+]([":2008,"COI":2009,"COCCCCCCC":2010,"CONCCC":2011,"CONCc":2012,"COCCCCCCCCCCCCCC":2013,"COCCCc":2014,"COCOCCC":2015,"COCCCCS":2016,"COCCCCCNC":2017,"NCNS":2018,"NCSCC":2019,"CCCCNN":2020,"CCCCOCc":2021,"CCCCCSc":2022,"CCCCCSCC":2023,"CCCCCON":2024,"CCCCCCCNCC":2025,"CCCCCOCCOC":2026,"CCCCOCCOCCOC":2027,"CCCCCCOCCCN":2028,"CCCCOCCOCCCC":2029,")(*)(*)*":2030,"CNn":2031,"CNCO":2032,"CNNc":2033,"CNOCc":2034,"CNCCCCOC":2035,"CNCCCCc":2036,"CNCCCCCO":2037,"CNCCCCl":2038,"CNCCOCCOC":2039,"CNCCCCCCO":2040,"ClI":2041,"Cln":2042,"ClCOC":2043,"ClCCNC":2044,"ClCCO":2045,"ClCn":2046,"ClCCl":2047,"ClCSc":2048,"ClCCCCc":2049,"ClCOCc":2050,"ClCCSc":2051,"-]*":2052,")(=[":2053,"CCCCCCCCCOc":2054,"CCCCCCCCOCCO":2055,"CCCCCCCCOCCOCC":2056,"CCCCCCCCSc":2057,"CCCCCCCCCNS":2058,"CCCCCCCCCCNS":2059,"CCCCCCCCCON":2060,"CCCCCCCCCCOCCCN":2061,"CCCCCCCCCCSS":2062,"CCCCCCCCCSCCCC":2063,"CCCCCCCCCOCCOS":2064,"CCCCCCCCCCOCCOCCOCCOCCOCCOCCO":2065,"nco":2066,"ncs":2067,"ncnnc":2068,"COCP":2069,"COCS":2070,"COCBr":2071,"CCNO":2072,"CCNNCC":2073,"CCNSC":2074,"CCNCCCCNCC":2075,"CCNCCCCNCCCCN":2076,"+]%":2077,"+])=[":2078,"OCCOCc":2079,"OCCOCO":2080,"OCCCOCCN":2081,"OCCCOS":2082,"OCCCNS":2083,"OCCSCCC":2084,"OCCCOCCOC":2085,"OCCCOCc":2086,"OCCSCCS":2087,"@]=":2088,"BrB":2089,"BrCCCN":2090,"BrCCCn":2091,"121":2092,"127":2093,"@@]/":2094,"@@]\\":2095,"-])*)*":2096,"NCCCOP":2097,"NCCCOCCN":2098,"NCCOCCS":2099,"NCCOCCOCCOC":2100,"NCCOCCBr":2101,"NCCCOCCOCCO":2102,"NCCOCCOCCOCCOCCOCCOCCOCCO":2103,"CSCCOC":2104,"CSCCCCN":2105,"CSSc":2106,"CSCCCCCN":2107,"CSSCCN":2108,"CSSCCO":2109,"CSOOO":2110,"CSSSSSC":2111,"CSSSSC":2112,"NNCCCC":2113,"NNNN":2114,")/*":2115,")([*])[":2116,"OPO":2117,"OPOC":2118,"CCCNO":2119,"CCCNNC":2120,"CCCNCCCC":2121,"CCCNCCCNC":2122,"CCCNCCS":2123,"100":2124,"103":2125,"1045":2126,"10345":2127,"10642":2128,"+](*)":2129,"133":2130,"CCOCCI":2131,"CCOCCOS":2132,"CCOCCOCCC":2133,"CCOCCOCCCC":2134,"CCOCCCNCCN":2135,"CCOCCOCCOCCOCCOCCO":2136,"NaH":2137,"111":2138,"CCCCCCF":2139,"CCCCCCOS":2140,"CCCCCCOCCC":2141,"CCCCCCCOCCC":2142,"CCCCCCSCCC":2143,"CCCCCCCOCCO":2144,"NSNS":2145,"CCCCCCCCCCCCCCCCP":2146,"CCCCCCCCCCCCCCCCCO":2147,"CCCCCCCCCCCCCCCCNc":2148,"CCCCCCCCCCCCCCCCCCO":2149,"CCCCCCCCCCCCCCCCCCCCN":2150,"CCCCCCCCCCCCCCCCSCC":2151,"CCCCCCCCCCCCCCCCCOCC":2152,"CCCCCCCCCCCCCCCCCCS":2153,"CCCCCCCCCCCCCCCCOCCO":2154,"CCCCCCCCCCCCCCCCCCSC":2155,"CCCCCCCCCCCCCCCCCCCc":2156,"CCCCCCCCCCCCCCCCCCCCc":2157,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2158,"CCOOCC":2159,"CCOCCCCO":2160,"CCOCCNCC":2161,"CCOCOCC":2162,"CCOCCCS":2163,"CCOCCNS":2164,"@@](*)(":2165,"(\\[*])=":2166,"CCCCCCCP":2167,"CCCCNCCCCNCC":2168,"238":2169,"SCCCl":2170,"SCCBr":2171,"SCCOP":2172,"NCCCNCc":2173,"CCCCOCCCC":2174,"CCCCOOC":2175,"CCCCOCOCCCC":2176,"346":2177,"OCON":2178,"OCOS":2179,"nncnc":2180,"NNCNNC":2181,"CCNCCCOC":2182,"CCNCCSC":2183,"CCNCCSS":2184,"])(*)[":2185,"COCCF":2186,"([*])(":2187,"([*])(=":2188,"CCSCCCCCCCCCCCC":2189,"CCSSCCN":2190,"CCCCCCCCCF":2191,"151":2192,"OCCOCCCCCC":2193,"OSOO":2194,"OCCNCCCN":2195,"OCCNCCCS":2196,"CCCOO":2197,"CCCOCCCCC":2198,"CCCOCCNC":2199,"\\[*])":2200,"CCCCCCCCCCCI":2201,"CCCCCCCCCCCP":2202,"CCCCCCCCCCCSCC":2203,"OCCOCCF":2204,"OCCOCCS":2205,"OCCOCCCOC":2206,"OCCOCCSC":2207,"OCCOCCOCCOc":2208,"OCCOCCOCCF":2209,"CCCCCCCCCCF":2210,"NCCNCCCC":2211,"NCCNCCC":2212,"CCCCCCCCCCCCl":2213,"CCCCCCCCCCCCCl":2214,"CCCCCCCCCCCCBr":2215,"CCCCCCCCCCCCNc":2216,"CCCCCCCCCCCCSCC":2217,"CCCCCCCCCCCCOCCO":2218,"CCCCCCCCCCCCCNc":2219,"CCCCCCCCCCCCOCCOC":2220,"CCCCCCCCCCCCCOCCO":2221,")*)#":2222,"CCCCCCCCCCCCCCBr":2223,"CCCCCCCCCCCCCCOP":2224,"CCCCCCCCCCCCCCOS":2225,"OCCCI":2226,"OCCCP":2227,"COCCNN":2228,"COCCNCCNC":2229,"COCCNCCNS":2230,"OCCCCCO":2231,"OCCCCOCC":2232,"OCCCCCc":2233,"OCCCCCCOCC":2234,"OCCCCNCc":2235,"NCCCCI":2236,"NCCCCn":2237,"NCCCCBr":2238,"NCCCCCS":2239,"NCCCCNc":2240,"NCCCCCCOC":2241,"NCCCCOCCOC":2242,"NCCCCCCNS":2243,"4567":2244,"NCCCNCCS":2245,"NCCCNCCCNCCCN":2246,"NCCCNCCSP":2247,"+][*])[":2248,"-])(*)=":2249,"](=*)*":2250,"OOCCCCO":2251,"OOOO":2252,"CSCCSCC":2253,"CSCCSCCS":2254,"CCCSN":2255,"CCCSSc":2256,"CCCSSCCC":2257,"CNCCCP":2258,"CNCCCn":2259,"CNCCCBr":2260,"CNCCCSC":2261,"OCCOCCOCCOCCNC":2262,"OCCOCCOCCOCCOCCOC":2263,"OCCOCCOCCOCCOCCOCCO":2264,"OCCOCCOCCOCCOCCOCCN":2265,"OCCOCCOCCOCCOCCOCCOCCOC":2266,"NCCSP":2267,"NCCSCCN":2268,"CNCCNCCCNCCNC":2269,"OCOCc":2270,"564":2271,")*)*)*":2272,")*)*)*)":2273,"SCCCSCC":2274,"PbH":2275,"OCCCCCCSSCCCCCCO":2276,"CCSCCS":2277,"CCSCCCO":2278,"CCSCCCl":2279,"CCSCCSCC":2280,"CCSCCSP":2281,"*)(*)*)(*)*)(":2282,"228":2283,"CCCCSP":2284,"CCCCSCCO":2285,"COCCOCCl":2286,"COCCOCCCOC":2287,"COCCOCCOc":2288,"COCCOCCOS":2289,"COCCOCCOCCC":2290,"COCCOCCOCCCN":2291,"COCCOCCOCCOCCO":2292,"COCCOCCOCCS":2293,"CCCCCCNO":2294,"CCCCCCNCCCCC":2295,"SSCCCC":2296,"SSCCCCCCCC":2297,"CNCCOCCC":2298,"CCCCCCCCCCCCCCCCCCCCCCCO":2299,"CCPC":2300,"CCPCC":2301,"CCCCCCCCCCCCCCCCCCCCCCCCCOC":2302,"COCCOO":2303,"COCCOCCNCC":2304,"CSCCCSCC":2305,"OCCCCCCCCNC":2306,"OCCCCCCCCCOC":2307,"CCOSOOO":2308,"202":2309,"203":2310,"252":2311,"CCCCCCOCc":2312,"OCCCCCBr":2313,"CCNCCNCCNCCN":2314,"NOCCS":2315,"NCCCCNP":2316,"CCCCCCCNS":2317,"NCCCOCCOc":2318,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":2319,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":2320,"CNCCCCCCNC":2321,"CNCCCCCCNCC":2322,"COCCCCCl":2323,"COCCCCOCC":2324,"785":2325,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2326,"573":2327,"OCCCCCCCCCCCS":2328,"OCCCCCCCCCCCSS":2329,"NCCOCCOCCOCCO":2330,"NCCOCCOCCOCCOCCC":2331,"CCCCCCCCCCNCCCCCCCCC":2332,"12345":2333,"CCCCOCCOP":2334,"*)*)(*)*)=":2335,"NCCCCCCCCCCO":2336,"CCSSCCCCCCCCCCCCCCC":2337,"NCCOCCON":2338,"CCCCCCCCCNCCCCCCCCC":2339,"*)*)*)*)":2340,"CCCCCSCCO":2341,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":2342,"*)*)*)*)*)*)=":2343,"474":2344,"CCCSCCSCCC":2345,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":2346,"SSSSCC":2347,"OCCCOCCCO":2348,"CCOCCOCCOP":2349,"CCCCCCCCCCCCSCCCCCCCCCCCC":2350,"(*)*)":2351,"(*)*)[":2352,"CCCCCCCCOCCOP":2353,"CCOCCOCCOCCNC":2354,"CCOCCOCCOCCOCC":2355,"CCCCCCSSCCS":2356,"CCCCCCCCCCCCCCCCCCOCCCOC":2357,"CCSSCCn":2358,"NCOCNC":2359,"CCCCCCOCCOP":2360,"NCCCCNCCCNCCCN":2361,"/*)\\[":2362,"CCCCCCCCCCCOCCO":2363,"CCCCOCCOCCNC":2364,"NOCCNB":2365,"CNCCNCCNCCNCCNCCN":2366,"COCCOCCOCCOCCNC":2367,"COCCOCCOCCOCCCN":2368,"/*)/*":2369,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCNC":2370,"CCOCCOCCOCCOCCOCCC":2371,"SBS":2372,"NCCCNCCCNCCCCCNC":2373,"(*)*)(*)*)(*)*)(*)*)(":2374,"NCCOCCOCCOCCOCCOCCOCCC":2375,"CCCCCCCCCCCCOCCOCCOCCOS":2376,"CNCCCCCCNCCCCCCCCNCCCCCCNCc":2377,"SCCCCCCCCCCCn":2378,"ClCCOCOCCCl":2379,"CCNCCCCNCCCCNCCCCNCCCCNCC":2380,"CCNCCSSCCNCCC":2381,"(*)*)(":2382,"(*)*)(*)*":2383,"*#":2384,"*\\":2385,"*([":2386,"*)/":2387,"*)\\":2388,"*)\\*":2389,"*(*)*)":2390,"++](=":2391,"--]=[":2392,"-]([*])[":2393,".*":2394,"/*)=":2395,"/*)[":2396,"1123":2397,"112345":2398,"210":2399,"224":2400,"256":2401,"265":2402,"356":2403,"375":2404,"3345":2405,"412":2406,"532":2407,"613":2408,"686":2409,"718":2410,"824":2411,"=*)=":2412,"@+]([":2413,"Am":2414,"Bh":2415,"Bk":2416,"Cf":2417,"Db":2418,"Ds":2419,"Es":2420,"FF":2421,"FI":2422,"Fm":2423,"FCCN":2424,"FCCOc":2425,"FCCl":2426,"FCBr":2427,"FCCBr":2428,"FCCCBr":2429,"FCCI":2430,"FCCCCBr":2431,"FCCCCCBr":2432,"FCCCCCCBr":2433,"FCCCCF":2434,"FCCCCCCCCCCF":2435,"Hs":2436,"II":2437,"IO":2438,"ICCCC":2439,"IOC":2440,"ICCCCCCCC":2441,"ICCN":2442,"ICI":2443,"ICCI":2444,"ICCOCc":2445,"ICCOCCOCC":2446,"ICCCI":2447,"ICCCCCI":2448,"ICCCCCCI":2449,"ICCCCCCCCCI":2450,"ICCCCCCCCCCI":2451,"ICCOCCI":2452,"ICCCCCCCCCCCI":2453,"KH":2454,"Lr":2455,"Md":2456,"Mt":2457,"No":2458,"NCOCC":2459,"NCCCCCCCCCCCCCCC":2460,"NCCCCCCCCCCCCCC":2461,"NNCCS":2462,"NCOCCOC":2463,"NOCCCO":2464,"NOCCc":2465,"NCCCCCCCCOC":2466,"NNCCCO":2467,"NCCCCCCCCCCCCCCCCCCN":2468,"NCOCN":2469,"NCCCCCCCCNC":2470,"NCCCCCCCCCCCCNC":2471,"NCCCCCCCCCCCCCCN":2472,"ONN":2473,"OOc":2474,"ONS":2475,"ONNC":2476,"ONCCCN":2477,"ONCCc":2478,"OCCCCCCCCCCCCCCCCCCCCCCCC":2479,"OCCCCCCCCCCCCCCCCCCCCCCCCC":2480,"OCCCCCCCCCCCCCCCCCCCCCCCCCC":2481,"OOCCCOCC":2482,"PI":2483,"PP":2484,"PS":2485,"Pm":2486,"PCl":2487,"POCCC":2488,"PNP":2489,"POOP":2490,"Rg":2491,"SCO":2492,"SCOC":2493,"SBr":2494,"SnH":2495,"SNN":2496,"SOP":2497,"SNCCC":2498,"SCCCNC":2499,"SCCCCO":2500,"SCCCCCCCCC":2501,"SOS":2502,"SSCCNC":2503,"SNCCCC":2504,"SCCCCOC":2505,"SCSCC":2506,"SSCc":2507,"SCCCCOc":2508,"SCCCCCN":2509,"SCCNS":2510,"SCCCCS":2511,"SOOC":2512,"SCCCCCNC":2513,"SCCON":2514,"SCCCCCCCCCCCCN":2515,"SCCCCCCO":2516,"SCCCCCCCCCCN":2517,"SNCCOCC":2518,"SCCOCCOCCOCCOCCOCC":2519,"SCCCCCCCCCCCCCCCCS":2520,"SCSP":2521,"SCCCCCCCCCCCc":2522,"SCCOCCOCCOCC":2523,"SCCCCCCCCCBr":2524,"SCCCCCCCCCS":2525,"SCCOCCS":2526,"SCCCCCCCCCCCBr":2527,"SNSNS":2528,"\\*)=":2529,"onnc":2530,"pH":2531,"scnn":2532,"te":2533,"(=*)=":2534,"(=*)*)=":2535,"](-":2536,"](*)(=":2537,"](-[":2538,"](*)*)(*)*":2539,"ccccccc":2540,"ccss":2541,"COF":2542,"COOP":2543,"CONS":2544,"COCCCCO":2545,"CONNC":2546,"COOS":2547,"COOCCN":2548,"COCCCCCCCCCCC":2549,"COCCCCCCCCCCCCCCC":2550,"COCNc":2551,"COCCCCCN":2552,"COCCCNCC":2553,"COCCCCc":2554,"COCOCCOC":2555,"COCCCCCCOC":2556,"COCCCCCO":2557,"COCCCCCOC":2558,"COCCCCCCO":2559,"COCOCOC":2560,"CONCCCCCCNC":2561,"COCCCCCCS":2562,"COCCCCOCCC":2563,"NCNN":2564,"NCSc":2565,"NCSCCC":2566,"NCNCN":2567,"NCSCN":2568,"CCCCNCc":2569,"CCCCNCCO":2570,"CCCCCOCCC":2571,"CCCCNCCOC":2572,"CCCCCNCCC":2573,"CCCCNCCS":2574,"CCCCCSSC":2575,"CCCCOCCOCCO":2576,"CCCCOCCCOC":2577,"CCCCCCOCCO":2578,"CCCCOCCCl":2579,"CCCCOCCS":2580,"CCCCOCCOCCOCCO":2581,"CCCCOCCOCCOCCOCCO":2582,"CCCCOCCOS":2583,"CCCCCCOCCOCCOCCO":2584,"CCCCCOCCOCCO":2585,"CCCCOCCOCCOS":2586,"CCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2587,"cccoc":2588,"OCSOC":2589,")(\\[":2590,")(*)*)(":2591,")(*)*)=":2592,")(*)*)":2593,")(*)*)(*)*":2594,")(*)*)[":2595,"CNI":2596,"CNNCC":2597,"CNOP":2598,"CNCCOCC":2599,"CNNNC":2600,"CNCOCC":2601,"CNCCCCCCCCCCCC":2602,"CNOCCOC":2603,"CNCCCCCNC":2604,"CNCCCCCCOC":2605,"CNCCCCCCCCNC":2606,"CNCCOCCOCC":2607,"CNCCCCCCNCCC":2608,"CNCOOCC":2609,")=*":2610,")=*)=":2611,")=*)":2612,"ClN":2613,"ClO":2614,"Clp":2615,"ClCCCC":2616,"ClBr":2617,"ClCCCCC":2618,"ClCOc":2619,"ClCCOC":2620,"ClCCOCC":2621,"ClCCCCN":2622,"ClCCNCC":2623,"ClCCOc":2624,"ClCOCC":2625,"ClCBr":2626,"ClCCSC":2627,"ClCCCOc":2628,"ClCCNc":2629,"ClCCBr":2630,"ClCCCn":2631,"ClCCCCl":2632,"ClCCCCCl":2633,"ClCSCc":2634,"ClCCOCc":2635,"ClNCNC":2636,"ClCCCCBr":2637,"ClCCCCCBr":2638,"ClCCCSc":2639,"ClCCOCCOCCOCC":2640,"ClCCCCCCl":2641,"ClCCCCCCBr":2642,"ClCCSSCC":2643,"ClCCSCc":2644,"ClSCl":2645,"ClCCCCCCCBr":2646,"ClCSCCl":2647,"ClCCCCI":2648,"ClCCOCCCl":2649,"ClCCCCCCCl":2650,"ClCCCCCCCCCl":2651,"ClCCCCCCI":2652,"ClCCCCCCCCl":2653,"ClCCCCCCCCCCl":2654,"ClCCOCCl":2655,"ClCCCCCCCCCI":2656,"ClOOCl":2657,"ClCCSCCCl":2658,"ClCOCCOCCl":2659,"-]\\[":2660,"-][*]":2661,"CCCCCCCCB":2662,"CCCCCCCCF":2663,"CCCCCCCCNCC":2664,"CCCCCCCCNc":2665,"CCCCCCCCSCC":2666,"CCCCCCCCNCCC":2667,"CCCCCCCCCCNCC":2668,"CCCCCCCCCn":2669,"CCCCCCCCNOC":2670,"CCCCCCCCOB":2671,"CCCCCCCCOCCC":2672,"CCCCCCCCOCCCC":2673,"CCCCCCCCCOS":2674,"CCCCCCCCOO":2675,"CCCCCCCCCSCC":2676,"CCCCCCCCNCCO":2677,"CCCCCCCCCCNc":2678,"CCCCCCCCNCCOC":2679,"CCCCCCCCCOCCOC":2680,"CCCCCCCCCOCCO":2681,"CCCCCCCCOCCCCCCCC":2682,"CCCCCCCCOCCCCC":2683,"CCCCCCCCCCSc":2684,"CCCCCCCCCCNCCN":2685,"CCCCCCCCNCCCNC":2686,"CCCCCCCCCCOCCOC":2687,"CCCCCCCCOCCCCCCCCC":2688,"CCCCCCCCCCNCCC":2689,"CCCCCCCCCCCNc":2690,"CCCCCCCCSSc":2691,"CCCCCCCCOCCl":2692,"CCCCCCCCOCCOCCOCCOCCO":2693,"CCCCCCCCSCCO":2694,"CCCCCCCCCCCOS":2695,"CCCCCCCCCCOCCOCC":2696,"CCCCCCCCCCSCCC":2697,"CCCCCCCCOCCOCCOCCOCCOCCO":2698,"CCCCCCCCCCOCCOCCOCCO":2699,"CCCCCCCCSSSS":2700,"CCCCCCCCSSCCCCCCCC":2701,"ncnnn":2702,"ncsn":2703,"COCF":2704,"COCI":2705,"COCSC":2706,"CCNOC":2707,"CCNOCC":2708,"CCNCCCCC":2709,"CCNOP":2710,"CCNCCOCC":2711,"CCNCCCCCC":2712,"CCNCCCCCCC":2713,"CCNCCCCN":2714,"CCNCCCNC":2715,"CCNCCCCO":2716,"CCNOCc":2717,"CCNOS":2718,"CCNCCCCOC":2719,"CCNCCCS":2720,"CCNCCNS":2721,"CCNCCCCS":2722,"CCNCCCCCCN":2723,"CCNCCCCCOC":2724,"CCNCCOCCO":2725,"CCNCCOCCN":2726,"CCNCCON":2727,"CCNCCCCCCNC":2728,"CCNCCCCCCCCCCN":2729,"CCNCCCCCCl":2730,"+]*":2731,"+])-":2732,"+])*)":2733,"+]*)*":2734,"+])*)=":2735,"OCCSCc":2736,"OCCCOCCOCC":2737,"OCCPC":2738,"BrI":2739,"BrN":2740,"BrO":2741,"Brn":2742,"BrCCOCC":2743,"BrCCCCCCC":2744,"BrCCCCO":2745,"BrCn":2746,"BrCCCO":2747,"BrCCCOC":2748,"BrSc":2749,"BrCCCOc":2750,"BrCCCCOc":2751,"BrCCNc":2752,"BrCCCCc":2753,"BrCCBr":2754,"BrCOCc":2755,"BrCI":2756,"BrCCCCn":2757,"BrCCCBr":2758,"BrCCCCCc":2759,"BrCCCCCCCCOc":2760,"BrCCCCCCc":2761,"BrCCCCCCOc":2762,"BrCCCCCCCCc":2763,"BrCCOCc":2764,"BrCCCCBr":2765,"BrCCCCCBr":2766,"BrCCCCCCn":2767,"BrCCCCCCCCCCc":2768,"BrCCCCCCBr":2769,"BrCCCCCCCCCBr":2770,"BrCCCCCCCCCCBr":2771,"BrCCCCCCCCBr":2772,"BrCCCOCc":2773,"BrCCOCCBr":2774,"BrCCCCCCCCCCCCCCCCCCBr":2775,"BrCCCCCCCCCCCCBr":2776,"BrCCCCCCCCCCCCCCBr":2777,"BrCCCCCCOCc":2778,"120":2779,"129":2780,"@@]=":2781,"cccco":2782,"-])\\[":2783,"-])*)*)":2784,"NCCI":2785,"NCCOCCCC":2786,"NCCCON":2787,"NCCOCCCN":2788,"NCCOCCOc":2789,"NCCCOCCCN":2790,"NCCOCCCOC":2791,"NCCOCCCl":2792,"NCCOCCNCCO":2793,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2794,"NCCOCCOCCOCCOCCOCCOCC":2795,"CSOCC":2796,"CSNN":2797,"CSCCOCC":2798,"CSCCc":2799,"CSCCCCO":2800,"CSCSc":2801,"CSCNCC":2802,"CSCCCCCCCCCCCC":2803,"CSCCCOC":2804,"CSCCCCNC":2805,"CSOO":2806,"CSCCCCOC":2807,"CSSCc":2808,"CSCCCCOc":2809,"CSCON":2810,"CSCSSC":2811,"CSSS":2812,"CSCCCCCNC":2813,"CSCCOCCO":2814,"CSSCCCC":2815,"CSOCCOCCOCCO":2816,"CSCCCCCS":2817,"CSCCCCCCSC":2818,"CSCCCOS":2819,"CSCCCCCCn":2820,"CSCOCCCCC":2821,"CSCCCCCCCCCCCCCOC":2822,"CSCCCCCCCCCCCO":2823,"CSSSSS":2824,"CSSSSSCC":2825,"CCCCCB":2826,"CCCCCPC":2827,"NNI":2828,"NNCCC":2829,"NNBr":2830,"NNNCC":2831,"NNCCCc":2832,"])*)[":2833,"])*)(":2834,"])*[":2835,"])*)*)*)*)*":2836,"CCOCS":2837,"CCOCBr":2838,"CNCS":2839,"CNCl":2840,"CNCn":2841,"CNCSC":2842,"SCI":2843,"SCBr":2844,")([*])=":2845,"OPC":2846,"OPP":2847,"OPOCC":2848,"CCCNI":2849,"CCCNP":2850,"CCCNSC":2851,"CCCNCCOCC":2852,"CCCNCCCCCC":2853,"CCCNNS":2854,"CCCNCCCCCCC":2855,"CCCNSCC":2856,"CCCNNCCC":2857,"CCCNOCc":2858,"CCCNCCNCC":2859,"CCCNCCCO":2860,"CCCNCCCOC":2861,"CCCNCCSC":2862,"CCCNCCCCNC":2863,"CCCNCCCS":2864,"CCCNCCCCS":2865,"CCCNCCCCCCOC":2866,"CCCNCCNCCN":2867,"CCCNCCOCCC":2868,"CCCNCCCNCCC":2869,"CCCNCCCOS":2870,"CCCNCCCCCCNCCC":2871,"(/*)=":2872,"(/*)\\":2873,"COPC":2874,"COPN":2875,"COPNP":2876,"CCNCN":2877,"CCNCSC":2878,"109":2879,"10121":2880,"211":2881,"214":2882,"215":2883,"216":2884,"217":2885,"218":2886,"219":2887,"+](*)([":2888,"+](\\[*]":2889,"+](*)(*)*":2890,"132":2891,"134":2892,"139":2893,"1336":2894,"13468":2895,"CCOCCF":2896,"CCOCCCOCC":2897,"CCOCCNCc":2898,"CCOCCON":2899,"CCOCCCNS":2900,"CCOCCOCCNCCO":2901,"CCOCCCNCCOC":2902,"CCOCCOCCBr":2903,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2904,"CCOCCSCCSCC":2905,"CCOCCPCCP":2906,"115":2907,"116":2908,"117":2909,"119":2910,"CCCCCCB":2911,"CCCCCCCOCC":2912,"CCCCCCON":2913,"CCCCCCOB":2914,"CCCCCCOCCCC":2915,"CCCCCCSc":2916,"CCCCCCCOS":2917,"CCCCCCSCc":2918,"CCCCCCOCCCCCC":2919,"CCCCCCCOCCOCC":2920,"CCCCCCSS":2921,"CCCCCCOCCCCC":2922,"CCCCCCSCCO":2923,"CCCCCCSCCCCCC":2924,"CCCCCCCOCCOCCCC":2925,"CCCCCCSSCCCCCCO":2926,"CCCCCCCOCCOCCOCCOCCCN":2927,"NSO":2928,"NSNC":2929,"NSCCC":2930,"NSCCN":2931,"NSNSN":2932,"CCCCCCCCCCCCCCCCn":2933,"CCCCCCCCCCCCCCCCBr":2934,"CCCCCCCCCCCCCCCCCS":2935,"CCCCCCCCCCCCCCCCCOc":2936,"CCCCCCCCCCCCCCCCCCCN":2937,"CCCCCCCCCCCCCCCCCOP":2938,"CCCCCCCCCCCCCCCCCCCCO":2939,"CCCCCCCCCCCCCCCCCCn":2940,"CCCCCCCCCCCCCCCCOCCOCC":2941,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2942,"CCCCCCCCCCCCCCCCOB":2943,"CCCCCCCCCCCCCCCCCCCOC":2944,"CCCCCCCCCCCCCCCCCCCCCN":2945,"CCCCCCCCCCCCCCCCSCCC":2946,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2947,"CCCCCCCCCCCCCCCCCCCCS":2948,"CCCCCCCCCCCCCCCCSS":2949,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2950,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2951,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2952,"CCCCCCCCCCCCCCCCCCOS":2953,"CCCCCCCCCCCCCCCCCCSc":2954,"CCCCCCCCCCCCCCCCCCOCCO":2955,"CCCCCCCCCCCCCCCCOCCCCCCCCCCCCCCCC":2956,"CCCCCCCCCCCCCCCCCCOCCC":2957,"CCCCCCCCCCCCCCCCCCNCCC":2958,"CCCCCCCCCCCCCCCCCCOCCCN":2959,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCC":2960,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2961,"CCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2962,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":2963,"CCCCCCCCCCCCCCCCOCCOP":2964,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":2965,"CCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":2966,"CCCCCCCCCCCCCCCCCCNCCNCCN":2967,"CCOF":2968,"CCOn":2969,"CCOCCCCCCCC":2970,"CCONCC":2971,"CCOCCCCC":2972,"CCOCOc":2973,"CCOSC":2974,"CCOOP":2975,"CCONS":2976,"CCOCCCCCCCCCC":2977,"CCOCOCCN":2978,"CCOOO":2979,"CCOCCCCCN":2980,"CCOCCCCCCCCN":2981,"CCOCCCCl":2982,"CCOCCCBr":2983,"CCOCCCCCCCCCCCCN":2984,"CCOCCCCCCCCO":2985,"CCOCCCCCCCCCCCCCCCCCCN":2986,"CCOCCCCNCC":2987,"CCOOCCCCCCO":2988,"CCOOOCC":2989,"CCOCCCSP":2990,"CCOCCCCCCCCCCCCCN":2991,"@@](\\":2992,"cnnnc":2993,"cnncn":2994,"cnnnn":2995,"CSCn":2996,"CCCCCCCF":2997,"CCCCCCCSc":2998,"CCCCCCCSCCO":2999,"-].[*]":3000,"CCCCNNC":3001,"CCCCNOC":3002,"CCCCNCCN":3003,"CCCCNOCC":3004,"CCCCNSC":3005,"CCCCNCCCNC":3006,"CCCCNOCc":3007,"CCCCNCCCCOC":3008,"CCCCNCCCCCCNCCCC":3009,"231":3010,")*)*)[":3011,")*)\\[":3012,")*.*":3013,"SCCF":3014,"SCCP":3015,"SCCCOCC":3016,"SCCSc":3017,"SCCSCCC":3018,"SCCSS":3019,"@](*)(":3020,"NCCCB":3021,"NCCCP":3022,"CCCCOCOC":3023,"CCCCOCCCCC":3024,"CCCCOCCCCN":3025,"CCCCOCCCCO":3026,"CCCCOCCCCCCCCCBr":3027,"*])([*])":3028,"*])([*])[*]":3029,"342":3030,"3456":3031,"+]([*])=":3032,"+]([*])([*])[*]":3033,"@]([*])([*])":3034,"OCOO":3035,"OCOCCC":3036,"OCOCOC":3037,"OCOCCCCC":3038,"OCOCCS":3039,"OCOCOCO":3040,"OCOCCOCO":3041,"142":3042,"144":3043,"1414":3044,"1448":3045,"NNCN":3046,"NNCS":3047,"NNCl":3048,"CCNCCOc":3049,"CCNCCCOCC":3050,"CCNCCSCCCO":3051,"])(/":3052,"NOO":3053,"NONC":3054,"NOCCCCCC":3055,"NOON":3056,"NOCCCCNC":3057,"NOCCCS":3058,"NOOSC":3059,"nnoc":3060,"nnns":3061,"])([*])":3062,"-])([*])=":3063,"COCCB":3064,"COCCI":3065,"COCCP":3066,"COCCCOP":3067,"COCCSCC":3068,"COCCCOCCN":3069,"COCCSc":3070,"COCCSCCN":3071,"COCCCOCCCC":3072,"COCCSCCCC":3073,"COCCSNC":3074,"COCCCOCCCOC":3075,"COCCSCCl":3076,"([*])([*])[*]":3077,"([*])([*])=":3078,"CCSCN":3079,"CCSCS":3080,"CCSCCCN":3081,"CCSCCCCCC":3082,"CCSCCCNC":3083,"CCSCCCCCCCCC":3084,"CCSCCCNCC":3085,"CCSCCCCS":3086,"CCSSS":3087,"CCSCCCCl":3088,"CCSOOO":3089,"CCSCCOCCOCC":3090,"CCSCCCCSCC":3091,"CCSCCCCCCCCCCSCCC":3092,"CCCCCCCCCP":3093,"153":3094,"155":3095,"1585":3096,"OCCONC":3097,"OCCOOC":3098,"OCCOCCCCCCCC":3099,"OCCOOCC":3100,"OCCOCCCCCCCCCCCCCCCCCC":3101,"OCCOCCCS":3102,"OCCOCCNS":3103,"OCCOCCCCS":3104,"OCCOCCCCCCCCCCCCCCCCCCCCCC":3105,"OCCOCCCCBr":3106,"OCCOCCCCOCCOC":3107,"OSS":3108,"OSc":3109,"OCCNP":3110,"OCCNCO":3111,"OCCNNC":3112,"OCCNCCCCC":3113,"OCCNCCc":3114,"OCCNCCCF":3115,"OCCNCCNCCO":3116,"*)#":3117,"*)-":3118,"CNCCF":3119,"CNCCI":3120,"CNCCBr":3121,"CNCCCOCCO":3122,"CCCOB":3123,"CCCONC":3124,"CCCOCOC":3125,"CCCOCCCCCCC":3126,"CCCOCCCS":3127,"CCCOCOCCC":3128,"CCCOCCNc":3129,"CCCOCCOCCC":3130,"CCCOOCCCCOC":3131,"CCCOCCOCCOCCOCCO":3132,"CCCCCCCCCCCSC":3133,"OCCOCCI":3134,"OCCOCCNC":3135,"OCCOCCCl":3136,"OCCOCCBr":3137,"OCCOCCOP":3138,"OCCOCCCOCCO":3139,"OCCOCCOCCCl":3140,"OCCOCCOCCOCCN":3141,"FCI":3142,"ONP":3143,"ONCCCC":3144,"CCCCCCCCCCCCCCCS":3145,"CCCCCCCCCCCOc":3146,"CCCCCCCCCCSCC":3147,"CCCCCCCCCCCOCC":3148,"NOCS":3149,"NCCNN":3150,"NCCNP":3151,"NCCNCCOC":3152,"NCCNCCCN":3153,"CCCCCCCCCCCCCS":3154,"CCCCCCCCCCCCOCCOCC":3155,"CCCCCCCCCCCCSc":3156,"CCCCCCCCCCCCNCCCN":3157,"CCCCCCCCCCCCSCc":3158,"CCCCCCCCCCCCCNS":3159,"CCCCCCCCCCCCCOCCC":3160,"CCCCCCCCCCCCCOCCOCC":3161,"CCCCCCCCCCCCOCCOCCO":3162,"CCCCCCCCCCCCCCNCCN":3163,"CCCCCCCCCCCCCOCCCN":3164,"CCCCCCCCCCCCSSC":3165,"CCCCCCCCCCCCCCOCCO":3166,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCC":3167,"CCCCCCCCCCCCOCCOCCN":3168,"CCCCCCCCCCCCCNCCNC":3169,"CCCCCCCCCCCCOCCOCCOCCOCCO":3170,"CCCCCCCCCCCCCCOCCOCCOCCOCCOCC":3171,"CCCCCCCCCCCCOCCOCCOCCOC":3172,"CCCCCCCCCCCCOCCOCCOCCOCCOCCO":3173,"CCCCCCCCCCCCCCOCCOCCOCCO":3174,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCC":3175,"CCCCCCCCCCCCCCNCCCC":3176,"CCCCCCCCCCCCOCCOP":3177,"CCCCCCCCCCCCNCCCNCC":3178,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO":3179,"CCCCCCCCCCCCCCOCCCO":3180,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCC":3181,"CCCCCCCCCCCCCOCCOS":3182,"CCCCCCCCCCCCOCCOCCOS":3183,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCO":3184,"CCCCCCCCCCCCCCF":3185,"CCCCCCCCCCCCCCI":3186,"CCCCCCCCCCCCCCP":3187,"CCCCCCCCCCCCCCl":3188,"CCCCCCCCCCCCCCCl":3189,"CCCCCCCCCCCCCCSCC":3190,"CCCCCCCCCCCCCCCOS":3191,"CCCCCCCCCCCCCCOCCCCCCCCCCCCCC":3192,"OBO":3193,"OBOBO":3194,"OCCCSCC":3195,"OCCCSCCNC":3196,"OCCCSCCN":3197,"OCCCSCCCOC":3198,"COCCNCCC":3199,"COCCNCCN":3200,"COCCNCCOC":3201,"COCCNCCO":3202,"COCCNCCCCSCC":3203,"COCCNCCOCCOCCOCCN":3204,"OCCCCF":3205,"OCCCCCCCN":3206,"OCCCCCOP":3207,"OCCCCOCc":3208,"OCCCCCCNCC":3209,"OCCCCOCCO":3210,"OCCCCCSc":3211,"OCCCCCOCc":3212,"OCCCCCOCCO":3213,"OCCCCCCNCc":3214,"CCCCCCCCCCCCCCCCCCI":3215,"CCCCCCCCCCCCCCCCCCCl":3216,"NCCCCF":3217,"NCCCCP":3218,"NCCCCS":3219,"NCCCCCl":3220,"NCCCCCSC":3221,"NCCCCOCc":3222,"NCCCCCNCC":3223,"NCCCCCNS":3224,"NCCCCCNCCCN":3225,"NCCCCOCCI":3226,"NCCCCCOCCOCCC":3227,"1721":3228,"457":3229,"4545":3230,"NCCCNO":3231,"NCCCNCCCCCCCC":3232,"NCCCNCCCNC":3233,"NCCCNCCCCCCCCC":3234,"NCCCNCCCCCNC":3235,"NCCCNCCNCCCN":3236,"COSN":3237,"COSOC":3238,"3191":3239,"-])(*)":3240,"-])(*)*":3241,"OOSC":3242,"CCCCOCSSCCNC":3243,"OCCOCN":3244,"OCCOCNC":3245,"CSCCB":3246,"CSCCBr":3247,"CSCCCOc":3248,"CSCCSCCSC":3249,"CSCCSCCSCC":3250,"CSCCSCCSCCS":3251,"CCCSO":3252,"CCCSNC":3253,"CCCSCCO":3254,"CCCSON":3255,"CCCSCCCSC":3256,"CCCSCCON":3257,"CCCSSCCCS":3258,"CCCSCCCCCCCCCBr":3259,"CCCSSSSC":3260,"CCCSSCCCSC":3261,"[*])\\":3262,"LiH":3263,")*)(*)*)=":3264,"NCCONC":3265,"COCCCF":3266,"COCCCI":3267,"COCCCBr":3268,"246":3269,"CPC":3270,"CPP":3271,"CPc":3272,"CPCC":3273,"CPOC":3274,"CPCc":3275,"CPCCP":3276,"+]=*":3277,"CNCCCF":3278,"OCCOCCOCCOCCS":3279,"OCCOCCOCCOCCCl":3280,"OCCOCCOCCOCCOCc":3281,"OCCOCCOCCOCCOCCNC":3282,"OCCOCCOCCOCCOCCBr":3283,"OCCOCCOCCOCCOCCOS":3284,"OCCOCCOCCOCCOCCOCCOCCNC":3285,"OCCOCCOCCOCCOCCOCCOS":3286,"CCCCCNN":3287,"CCCCCNNC":3288,"CCCCCNOCc":3289,"NCCSN":3290,"NCCSCCO":3291,"NCCSSCCC":3292,"CCNSSNCCC":3293,"CNCCNCCC":3294,"CNCCNCCCN":3295,"CNCCNCCO":3296,"CNCCNCCNCCC":3297,"NiH":3298,"190":3299,"191":3300,"193":3301,"194":3302,"198":3303,"199":3304,"569":3305,")*)*)*)*)":3306,")*)*)*)(*)*)=":3307,"*])[*])":3308,"SCCCBr":3309,"OCCCNCCCC":3310,"OCCCNCCCCN":3311,"OCCCCCCI":3312,"OCCCCCCCO":3313,"OCCCCCCBr":3314,"OCCCCCCCOP":3315,"CCSCCBr":3316,"CCSCCOP":3317,"CCSCCSCCN":3318,"CCSCCSCCSCC":3319,"3535":3320,"*)(\\":3321,"*)(*)[":3322,"*)(*)*)*)*)*":3323,"*)(*)*)(*)*":3324,"+])[*])[":3325,"220":3326,"222":3327,"226":3328,"CCCCSN":3329,"CCCCSNC":3330,"CCCCSCSC":3331,"CCCCSCCCCCCCCCCC":3332,"CCCCSCCCCCN":3333,"COCCOCCI":3334,"COCCOCCS":3335,"COCCOCCn":3336,"COCCOCCCN":3337,"COCCOCCBr":3338,"COCCOCCCNCC":3339,"COCCOCCON":3340,"COCCOCCOCCNC":3341,"COCCOCCSS":3342,"COCCOCCOCCBr":3343,"COCCOCCOCCOCCOCCOCCOCCO":3344,"COCCOCCOCCn":3345,"COCCOCCOCCOCCOCCOCCOCCOCCOCCO":3346,"COCCOCCOCCOCCOCCN":3347,"CCCCCCNN":3348,"CCCCCCNP":3349,"CCCCCCNCCOC":3350,"CCCCCCNCCCCCC":3351,"CCCCCCNCCCCCCC":3352,"CCCCCCNCCCCCBr":3353,"CCCCCCCCCCCCCCCCCCCCP":3354,"CCCCCCCCCCCCCCCCCCCCOCC":3355,"CCCCCCCCCCCCCCCCCCCCBr":3356,"CCCCCCCCCCCCCCCCCCCCCCNC":3357,"(\\[*])[*])":3358,"SSP":3359,"SSSCC":3360,"SSCOCC":3361,"SSSSc":3362,"SSSSS":3363,"SSCCCCCCCCCCCN":3364,"SSCCCCCCCCCCCCCCCCO":3365,"SSCSSS":3366,"OCCCOOC":3367,"OCCCOCCCCl":3368,"OCCCOCCOCCCCl":3369,"CNCCOCCN":3370,"CCCCCCCCCCCCCCCCCCCCCCO":3371,"CCCCCCCCCCCCCCCCCCCCCCc":3372,"CCCCCCCCCCCCCCCCCCCCCCBr":3373,"CCPP":3374,"CCCCCCCCCCCCCCCCCCCCCCCCO":3375,"CCCCCCCCCCCCCCCCCCCCCCCCCCN":3376,"CCCCCCCCCCCCCCCCCCCCCCCCCCOC":3377,"CCCCCCCCCCCCCCCCCCCCCCCCCCO":3378,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3379,"NPN":3380,"NPOCCOC":3381,"NPOCCCN":3382,"COCCON":3383,"COCCOCOC":3384,"COCCOCCCBr":3385,"COCCOCCCCCCBr":3386,"CSCCCBr":3387,"OCCCCCCCCO":3388,"OCCCCCCCCS":3389,"OCCCCCCCCCO":3390,"OCCCCCCCCCl":3391,"OCCCCCCCCCS":3392,"OCCCCCCCCOP":3393,"OCCCCCCCCCCCN":3394,"OCCCCCCCCCCOCC":3395,"OCCCCCCCCCSCCCC":3396,"204":3397,"205":3398,"206":3399,"207":3400,"208":3401,"209":3402,"OCCOCCOCCCC":3403,"OCCOCCOCCC":3404,"OCCOCCOCCCCOCC":3405,"OCCOCCOCCCCOCCOCCOC":3406,"(*)(=[":3407,"CCCCCOB":3408,"CCCCCONC":3409,"CCCCCOCCCC":3410,"CCCCCOCCCCC":3411,"CCCCCOCCCN":3412,"CCCCCOOOO":3413,"coccc":3414,"NCCCCCCS":3415,"NCCCCCCc":3416,"NCCCCCCn":3417,"NCCCCCCOP":3418,"NCCCCCCOCCCC":3419,"NCCCCCCSc":3420,"ccnnn":3421,"*)*)*)[":3422,"678":3423,"TeH":3424,"ClCCI":3425,"nnnnn":3426,"CCNCCNCCC":3427,"NOCCBr":3428,"NOCCCON":3429,"COCCCNN":3430,"COCCCNCCCC":3431,"COCCCNCCOC":3432,"COCCCNCCCOC":3433,"CCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3434,"CCCOCCBr":3435,"CCCOCCCOS":3436,"NCCCCNO":3437,"NCCCCNCCCC":3438,"NCCCCNCCN":3439,"NCCCCNCCCCN":3440,"SCCNCCO":3441,"occo":3442,"4681":3443,"CSCCNCCNS":3444,"CCCCCCCNCCCCCCC":3445,"CCCCCCCNCCCCCCCCCCC":3446,"NCCCOOC":3447,"OCCCCCCCF":3448,"OCCCCCCCS":3449,"OCCCCCCCBr":3450,"OCCOCCOCCOCCOCCOCCOCCOCCOC":3451,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3452,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3453,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCC":3454,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3455,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOP":3456,"CNNCN":3457,"OCCCCCCCCCCCl":3458,"OCCCCCCCCCCBr":3459,"SCCSCCOCC":3460,"SCCSCCO":3461,"CCOCCNN":3462,"CNCCCCBr":3463,"CNCCCCNCC":3464,"CNCCCCSC":3465,"BrCCI":3466,")*)=*":3467,"COCCCCBr":3468,"COCCCCCCNC":3469,"COCCCCCNCC":3470,"758":3471,"OCCSCCCN":3472,"OCCSSCC":3473,"OCCSSc":3474,"OCCOCCNCCOCCO":3475,"CCCCCCCCCCCCNCCCCCCCCCCCC":3476,"CCCCCCCCCCCCNCCNCCNCC":3477,"OCCCCCCCCCBr":3478,"OCCCCCCCCCCCCCCCCO":3479,"OCCCCCCCCCCCCCCCCBr":3480,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3481,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3482,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3483,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3484,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3485,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3486,"OCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC":3487,"OCCCCCCCCCCCCCCCCSSCCCCCCCCCCCCCCCCO":3488,"CCCCCCCCCCCCCCCCCCOCN":3489,"CCCCCCCCCCCCCCCCCCOCc":3490,"OCCCCCCCCCCCCNCc":3491,"SCCCCP":3492,"SCCCCBr":3493,"SCCCCCS":3494,"CCCCCCNCl":3495,"CNCCCNCCCNC":3496,"CNCCCNCCNCCCNC":3497,"CCCCCCOCCNCC":3498,"NCCOCCOCCOCC":3499,"NCCOCCOCCOCCOC":3500,"NCCOCCOCCOCCOCCO":3501,"NCCOCCOCCOCCOCCN":3502,"NCCOCCOCCOCCP":3503,"NCCOCCOCCOCCOCCOCCN":3504,"CNCCNCN":3505,"CCCCCCCCCCNCCCCCCCCCC":3506,"NCCCSCCCN":3507,"CCCCCCCCCCCCOCCC":3508,"CCCCCCCCCCCCOCCCNC":3509,"CCCCCCCCCCCCOCCCCCCCCCCCC":3510,"CCCCCCCCCCCCOCCCCCCCCCCCCc":3511,"NNCCF":3512,"NNCCON":3513,"NNCCCOCc":3514,"OCCCCCCCCCCCCCCc":3515,"OCCCCCCCCCCCCCCBr":3516,"OCCOCCOCCOCCOCCN":3517,"CCCCOCCCNCC":3518,"CCCCOCCCNS":3519,"NCCSCCSC":3520,"OCCCCCCCCCCCCCBr":3521,"NCCOCCP":3522,"CCOCCOCCOCCOCCOCCOCCOCCOCCO":3523,"(#*)":3524,"OCCCCON":3525,"OCCCCOS":3526,"OCCCCOOC":3527,"OCCCCOCCC":3528,"285":3529,"*)*)(*)=":3530,"NCCCCCCCCS":3531,"NCCCCCCCCCN":3532,"NCCCCCCCCCCCN":3533,"NCCCCCCCCCCCO":3534,"NCCCCCCCCNP":3535,"CCSSOC":3536,"CCSSSCC":3537,"NCCCCCNO":3538,"NCCCCCNCCCNC":3539,"NCCOCCOCCC":3540,"NCCOCCOCCNS":3541,"NCCOCCOCCCCCCCl":3542,"NCCCCCCNCCCCCCN":3543,"NCCCCON":3544,"NCCCCOCCC":3545,"NCCCCOCCCCOCCCCN":3546,"CCCCCCCCCNCCCNC":3547,"*)*)*)*)=":3548,"*)*)*)=*)":3549,"NCNCNCN":3550,"CCCCCSSCCCCC":3551,"CCCCNCCCNCC":3552,"NCCNCCS":3553,"NCCNCCCOC":3554,"COCCCCCCCCCCCCCCCCCCCCOC":3555,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3556,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3557,"*)*)*)*)*)*":3558,"*)*)*)*)*)*)":3559,"*)*)*)*)*)*)(":3560,"684":3561,"NCCCCCCCNC":3562,"NCCNCCNCCNCCNC":3563,"NCCNCCNCCNCCNCCN":3564,"NCCNCCNCCNCCNCCNCCN":3565,"CSSCS":3566,"479":3567,"COCOCOCOC":3568,"COCOCCCCCCCCCCCCCNC":3569,"CCCSCCCO":3570,"CCCSCCSC":3571,"CCCSCCSCCS":3572,"CCCCCCCCCCOB":3573,"CCCCCCCCCCOCCCC":3574,"CCCCCCCCCCOOC":3575,"CCCCCCCCCCOCCCCCCCCCCOP":3576,"CSCCCCNS":3577,"CSCCCCSCC":3578,"CSCCCCCCNCC":3579,"CSCCCCCNCC":3580,"CSCCCCCNS":3581,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3582,"CCCCCCCCCCCCCCCCNCCCCCCCCCCCCCCCC":3583,"FSI":3584,"[*-":3585,"[*+]":3586,"[*++]":3587,"OCPOCOC":3588,"(*)(*)(=":3589,"(*)(*)[":3590,"(*)(*)*":3591,"(*)(*)*)":3592,"(*)(*)(*)[":3593,"NCONCCCOOC":3594,"SCCCCCCS":3595,"CSCCOOCCO":3596,"OCCCCCCCCCCCCCCCBr":3597,"OCCCOCCCOCCCO":3598,"CCCNCCNCCCNCC":3599,"OCCOCCCCCCOCCOC":3600,"CCCCCCCCSCCCCCCCC":3601,"CCCCCCCCSNS":3602,"CCCCCCCCSOS":3603,"CCCCCCCCSCCOCCO":3604,"CCCCCCCCSCSP":3605,"CCCCCCCCCCCCSCCCCCCCCCCCCCCCCCCCCCCC":3606,"CCCCCCCCCCCCSCCOCCO":3607,"CCCCCCCCOCCCNCCC":3608,"BrCCCB":3609,"NCCCNCCCCNCCC":3610,"SOSC":3611,"OCCSCCCO":3612,"OCCSCCCl":3613,"OCCSCCSCCSCCS":3614,"OCCSCCSCCSCCO":3615,"NCCCCCCCCNCCCCCCCCNC":3616,"CSCCSCCNC":3617,"CSCCSCCCSCCSC":3618,"CCOCCOCCOCCOCCNCC":3619,"CCCCCCCOCCCCCCC":3620,"CCCCCCCOOCCCCCC":3621,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3622,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3623,"OCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3624,"9669":3625,"COOSC":3626,"CCCCCCCCCCCCCCCCCCOCCOP":3627,"CCCCCCCCCCCCCCCCCCOCCOCCO":3628,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCO":3629,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCO":3630,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3631,"CCCCCCOCCOCc":3632,"CCCCCCOCCOCCO":3633,"OCCOCCOCCI":3634,"/*)\\*":3635,"SCSCS":3636,"CNCCCCNCCC":3637,"CCCCCCCCCCCNCCCCCCCCCCC":3638,"CCCCCCCCCCCON":3639,"CCCCCCCCCCCOCCOCCOCC":3640,"CCNCCCCCCNCC":3641,"CCCCOCCOCCSC":3642,"CCCCOCCOCCOCc":3643,"CCCCOCCOCCSCCSCCS":3644,"CNCCCCCI":3645,"ClCCCNCCCl":3646,"CCCOCCOCCOCCC":3647,"CCCOCCOCCOCCCN":3648,"CCCOCCOCCOCCOCCOCCOCCOCCN":3649,"CCCCCCCCCCOCCOS":3650,"CCCCCCCCCCOCCOCCOCCOCCOCCO":3651,"CCCCCCCCCCOCCOCCOCCC":3652,"NCCCNCCCl":3653,"NCCCOCCOCCCN":3654,"CCCCCCCCCCCCCCNCCCCCCCCCCCCCC":3655,"OCCCNCCCl":3656,"OCCCNCCSC":3657,"OCCCNCCCOB":3658,"BrCCCCOCc":3659,"BrCCCCCOCc":3660,"SCCSCCCl":3661,"CNCCCCCCOCCCOC":3662,"*)*)*)*)*)*)*)*)*)*)[":3663,"ssss":3664,"CCCCCCCCCCCCCNCCCCCCCCCCCCC":3665,"CNCCNCCNCCNCCNCCNC":3666,"NBN":3667,"NBNBN":3668,"NCCCCCCCCCCCS":3669,"NCCCCCCCCCCCSSCCCCCCCCCCCN":3670,"SCNCS":3671,"SOONC":3672,"CCCCCOCCPCC":3673,"CCCCCCCCNCCCNCCCN":3674,"CCCCCCCCNCCCNCCCNCCCN":3675,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3676,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3677,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCS":3678,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3679,"CCCCCCCSCCCCCCC":3680,"CCCCCCCSCCCCOC":3681,"CCCOCCOCCCCCCCl":3682,"COCCOCCOCCOB":3683,"COCCOCCOCCOCCOCCOCCC":3684,"COCCOCCNCCOCCOCCN":3685,"COCCOCCNCCOCCOCCOCCN":3686,"(*)*)*)=":3687,"CNCCCCCCOCCCCC":3688,"+][*])=":3689,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCO":3690,"CCCOCCCCCCNCC":3691,"OCCOCCOCCOCCOCCOCCNC":3692,"OCCOCCOCCOCCOCCOCCOP":3693,"OCCOCCOCCOCCOCCOCCOCO":3694,"SBSBS":3695,"\\*)\\*":3696,"CCCCOCCOCCCS":3697,"]([*])([*])":3698,"]([*])([*])[*]":3699,"]([*])([*])[":3700,"CCCCCCCCCOCCOP":3701,"NCCOCCOCCOCCOCCOCCOCCOCCOCCNC":3702,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3703,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3704,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCC":3705,"CSCCCONN":3706,"CCOCCOCCOCCCCCC":3707,"CCOCCOCCOCCNCC":3708,"CCCCCCCOCCCNCCCN":3709,"CCCCCCCCCCCCCCCCCCCCCCNCCCCCCCCCCCCCCCCCCCCCC":3710,"(*)*)(*)*)(*)*":3711,"BBB":3712,"NCCCCCCCCCCCCNc":3713,")(*)*)(*)*)(*)*)=":3714,")(*)*)(*)*)(*)*)(*)*":3715,")(*)*)(*)*)(*)*)(*)*)=":3716,"NCCOCCOCCOCCOCCOCCNC":3717,"NCCOCCOCCOCCOCCOCCSC":3718,"CSCCCSCc":3719,"CSCCCSCCCSCCCSC":3720,"(-*)-*":3721,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCCC":3722,"COCCOCCOCCOCCOCCOCCOCCC":3723,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3724,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCN":3725,"COCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3726,"23456789":3727,"CNCCCCCCNCCCCCCCCNCCCCCCNCC":3728,"PCCPc":3729,"SCCOCCOCCS":3730,"](*)(*)[":3731,"](*)(*)*)(*)=":3732,"CCCCCCCCCCSSCCCCCCCCCCC":3733,"CCCCCCCCCCSSCCCCCCCCCCc":3734,"OCCOCOCCOc":3735,"OCCOCOCCSCC":3736,"OCCSCCSCCO":3737,"NCCOCCOCCOCCOCCOCCOCCOCCOCCC":3738,"+](*)#[":3739,"CCOCCOCCOCCOCCOCCOCCC":3740,"CCCCCCCCCCCCCCCCCCOCCCCCCCCCCCCCCCCCC":3741,"CCCCCCCCCCCCCCCCCCSCCCCl":3742,"CCOCCCCOCCCCO":3743,"CCCCOCCCCCCNCc":3744,"OCCNCCCNCCO":3745,"NCCCNCCCNCCCNCCCN":3746,"OOOOOOC":3747,"*)(*)*)(*)*)(*)*)=":3748,"*)(*)*)(*)*)(*)*)(*)*)=":3749,"OCCCCCCCCCCCSSCCCCCCCCCCCOC":3750,"OCCCCCCCCCCCSSCCCCCCCCCCCO":3751,"(*)*)(*)*)(*)*)(*)*)(*)*)=":3752,"(*)*)(*)*)(*)*)(*)*)(*)*)(*)*":3753,"(*)*)(*)*)*)[":3754,"6868":3755,"=*)=*":3756,"ICCCCCCCCI":3757,"ICCOCCOCCI":3758,"NCCCCCCCCCCCCCCCI":3759,"SNCCCCCNCCSCC":3760,"SCCCCCNCCNC":3761,"SCCOCCOCCOCCOCCOCCS":3762,"SCCOCCOCCOCCS":3763,"SNSNSNS":3764,"(=*)*)=*)(":3765,"COCCCCCOCOOC":3766,"CCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3767,")(*)*)(*)*)*":3768,")(*)*)=*)":3769,"CNCCCCCCCCCCCCNCc":3770,"CNCCOCCOCCNCc":3771,"ClCCOCCOCCCl":3772,"ClCCNCCCl":3773,"ClCCOCCOCCOCCCl":3774,"ClCCSSCCCl":3775,"CCCCCCCCOCCCCCOCCC":3776,"CCCCCCCCSSSSSSSSS":3777,"CCNCCOCCOCCCOC":3778,"OCCCOCCOCCOCCOCCOCCOCCOCCOCCOCO":3779,"NCCOCCCCCCOCCO":3780,"NCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOC":3781,"NCCOCCOCCOCCOCCOCCOCCOCCOCCN":3782,"CSCCOCCSCC":3783,"CSOCCOCCOCCOSC":3784,"CSCCCCCCCCCCCOCCOCCOCCOCC":3785,"+](\\[*])=":3786,"CCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCNC":3787,"CCOCCSCCSCCSCCSCCOCC":3788,"CCOCCPCCPCCO":3789,"CCCCCCSSCCCCCC":3790,"CCCCCCCCCCCCCCCCSSCCCCCCCCCCCCCCCC":3791,"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOC":3792,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCO":3793,"CCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3794,"CCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3795,"CCOOCCCCCCOOCC":3796,"SCCSCCCSCCS":3797,"COCCSCCNCCC":3798,"COCCCOCCCCOCCCOC":3799,"CCSCCCNCCCOCC":3800,"CCSSSOC":3801,"CCSCCOCCOCCSCC":3802,"158591":3803,"CCCCCCCCCCCCCOCCOCCOCCOS":3804,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3805,"CCCCCCCCCCCCCCOCCOCCOCCOS":3806,"CCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCO":3807,"CSCCSCCSCCSCCSCCS":3808,"CPCCPCCOCCPCCPCCO":3809,"COCCOCCSSCCOCCO":3810,"OCCOCCOCCCCOCCCOCCOC":3811,"OCCSCCSCCSCCSCCO":3812,"CCCCCCCCCCCCCCCCCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCOCCCS":3813,"CCCCOCCOCCSCCSCCSCCOCCOCCCC":3814,"CCCCCCCCSSSSSSSSSCCCCCCC":3815}
diff --git a/chebai/preprocessing/collate.py b/chebai/preprocessing/collate.py
index 181b3afd..8e0a703d 100644
--- a/chebai/preprocessing/collate.py
+++ b/chebai/preprocessing/collate.py
@@ -1,5 +1,5 @@
-from torch.nn.utils.rnn import pad_sequence
import torch
+from torch.nn.utils.rnn import pad_sequence
from chebai.preprocessing.structures import XYData
diff --git a/chebai/preprocessing/collect_all.py b/chebai/preprocessing/collect_all.py
index f82ce71c..62e140f8 100644
--- a/chebai/preprocessing/collect_all.py
+++ b/chebai/preprocessing/collect_all.py
@@ -2,6 +2,9 @@
import os
import sys
+import pytorch_lightning as pl
+import torch
+import torch.nn.functional as F
from pytorch_lightning import loggers as pl_loggers
from pytorch_lightning.callbacks import ModelCheckpoint
from pytorch_lightning.metrics import F1
@@ -9,9 +12,6 @@
from torch import nn
from torch_geometric import nn as tgnn
from torch_geometric.data import DataLoader
-import pytorch_lightning as pl
-import torch
-import torch.nn.functional as F
from data import ClassificationData, JCIClassificationData
diff --git a/chebai/preprocessing/datasets/base.py b/chebai/preprocessing/datasets/base.py
index 97d322b2..1d7da9d5 100644
--- a/chebai/preprocessing/datasets/base.py
+++ b/chebai/preprocessing/datasets/base.py
@@ -1,14 +1,14 @@
-from typing import List, Union
import os
import random
import typing
+from typing import List, Union
-from lightning.pytorch.core.datamodule import LightningDataModule
-from lightning_utilities.core.rank_zero import rank_zero_info
-from torch.utils.data import DataLoader
import lightning as pl
import torch
import tqdm
+from lightning.pytorch.core.datamodule import LightningDataModule
+from lightning_utilities.core.rank_zero import rank_zero_info
+from torch.utils.data import DataLoader
from chebai.preprocessing import reader as dr
diff --git a/chebai/preprocessing/datasets/chebi.py b/chebai/preprocessing/datasets/chebi.py
index 961e94d2..93d7be65 100644
--- a/chebai/preprocessing/datasets/chebi.py
+++ b/chebai/preprocessing/datasets/chebi.py
@@ -9,21 +9,23 @@
"JCI_500_COLUMNS_INT",
]
-from abc import ABC
-from collections import OrderedDict
import os
import pickle
import queue
+import random
+from abc import ABC
+from collections import OrderedDict
+from typing import List, Union
-from iterstrat.ml_stratifiers import (
- MultilabelStratifiedKFold,
- MultilabelStratifiedShuffleSplit,
-)
import fastobo
import networkx as nx
import pandas as pd
import requests
import torch
+from iterstrat.ml_stratifiers import (
+ MultilabelStratifiedKFold,
+ MultilabelStratifiedShuffleSplit,
+)
from chebai.preprocessing import reader as dr
from chebai.preprocessing.datasets.base import XYBaseDataModule
@@ -118,11 +120,17 @@ class _ChEBIDataExtractor(XYBaseDataModule, ABC):
chebi_version will be used for training, validation and test. Defaults to None.
single_class (int, optional): The ID of the single class to predict. If not set, all available labels will be
predicted. Defaults to None.
+ dynamic_data_split_seed (int, optional): The seed for random data splitting. Defaults to 42.
+ splits_file_path (str, optional): Path to the splits CSV file. Defaults to None.
**kwargs: Additional keyword arguments (passed to XYBaseDataModule).
Attributes:
single_class (int): The ID of the single class to predict.
chebi_version_train (int): The version of ChEBI to use for training and validation.
+ dynamic_data_split_seed (int): The seed for random data splitting, default is 42.
+ dynamic_df_train (pd.DataFrame): DataFrame to store the training data split.
+ dynamic_df_test (pd.DataFrame): DataFrame to store the test data split.
+ dynamic_df_val (pd.DataFrame): DataFrame to store the validation data split.
"""
def __init__(
@@ -134,6 +142,66 @@ def __init__(
# use different version of chebi for training and validation (if not None)
# (still uses self.chebi_version for test set)
self.chebi_version_train = chebi_version_train
+ self.dynamic_data_split_seed = int(kwargs.get("seed", 42)) # default is 42
+ # Class variables to store the dynamics splits
+ self.dynamic_df_train = None
+ self.dynamic_df_test = None
+ self.dynamic_df_val = None
+
+ if self.chebi_version_train is not None:
+ # Instantiate another same class with "chebi_version" as "chebi_version_train", if train_version is given
+ # This is to get the data from respective directory related to "chebi_version_train"
+ _init_kwargs = kwargs
+ _init_kwargs["chebi_version"] = self.chebi_version_train
+ self._chebi_version_train_obj = self.__class__(
+ single_class=self.single_class,
+ **_init_kwargs,
+ )
+ # Path of csv file which contains a list of chebi ids & their assignment to a dataset (either train, validation or test).
+ self.splits_file_path = self._validate_splits_file_path(
+ kwargs.get("splits_file_path", None)
+ )
+
+ @staticmethod
+ def _validate_splits_file_path(splits_file_path=None):
+ """
+ Validates the provided splits file path.
+
+ Args:
+ splits_file_path (str or None): Path to the splits CSV file.
+
+ Returns:
+ str or None: Validated splits file path if checks pass, None if splits_file_path is None.
+
+ Raises:
+ FileNotFoundError: If the splits file does not exist.
+ ValueError: If the splits file is empty or missing required columns ('id' and/or 'split'), or not a CSV file.
+ """
+ if splits_file_path is None:
+ return None
+
+ if not os.path.isfile(splits_file_path):
+ raise FileNotFoundError(f"File {splits_file_path} does not exist")
+
+ file_size = os.path.getsize(splits_file_path)
+ if file_size == 0:
+ raise ValueError(f"File {splits_file_path} is empty")
+
+ # Check if the file has a CSV extension
+ if not splits_file_path.lower().endswith(".csv"):
+ raise ValueError(f"File {splits_file_path} is not a CSV file")
+
+ # Read the first row of CSV file into a DataFrame
+ splits_df = pd.read_csv(splits_file_path, nrows=1)
+
+ # Check if 'id' and 'split' columns are in the DataFrame
+ required_columns = {"id", "split"}
+ if not required_columns.issubset(splits_df.columns):
+ raise ValueError(
+ f"CSV file {splits_file_path} is missing required columns ('id' and/or 'split')."
+ )
+
+ return splits_file_path
def extract_class_hierarchy(self, chebi_path):
"""
@@ -194,6 +262,9 @@ def graph_to_raw_dataset(self, g, split_name=None):
def save_raw(self, data: pd.DataFrame, filename: str):
pd.to_pickle(data, open(os.path.join(self.raw_dir, filename), "wb"))
+ def save_processed(self, data: pd.DataFrame, filename: str):
+ pd.to_pickle(data, open(os.path.join(self.processed_dir_main, filename), "wb"))
+
def _load_dict(self, input_file_path):
"""
Loads a dictionary from a pickled file, yielding individual dictionaries for each row.
@@ -220,81 +291,168 @@ def _get_data_size(input_file_path):
with open(input_file_path, "rb") as f:
return len(pd.read_pickle(f))
- def _setup_pruned_test_set(self):
- """Create test set with same leaf nodes, but use classes that appear in train set"""
+ def _setup_pruned_test_set(
+ self, df_test_chebi_version: pd.DataFrame
+ ) -> pd.DataFrame:
+ """Create a test set with the same leaf nodes, but use only classes that appear in the training set"""
# TODO: find a more efficient way to do this
filename_old = "classes.txt"
- filename_new = f"classes_v{self.chebi_version_train}.txt"
- dataset = torch.load(os.path.join(self.processed_dir, "test.pt"))
- with open(os.path.join(self.raw_dir, filename_old), "r") as file:
+ # filename_new = f"classes_v{self.chebi_version_train}.txt"
+ # dataset = torch.load(os.path.join(self.processed_dir, "test.pt"))
+
+ # Load original classes (from the current ChEBI version - chebi_version)
+ with open(os.path.join(self.processed_dir_main, filename_old), "r") as file:
orig_classes = file.readlines()
- with open(os.path.join(self.raw_dir, filename_new), "r") as file:
+
+ # Load new classes (from the training ChEBI version - chebi_version_train)
+ with open(
+ os.path.join(
+ self._chebi_version_train_obj.processed_dir_main, filename_old
+ ),
+ "r",
+ ) as file:
new_classes = file.readlines()
+
+ # Create a mapping which give index of a class from chebi_version, if the corresponding
+ # class exists in chebi_version_train, Size = Number of classes in chebi_version
mapping = [
None if or_class not in new_classes else new_classes.index(or_class)
for or_class in orig_classes
]
- for row in dataset:
+
+ # Iterate over each data instance in the test set which is derived from chebi_version
+ for _, row in df_test_chebi_version.iterrows():
+ # Size = Number of classes in chebi_version_train
new_labels = [False for _ in new_classes]
for ind, label in enumerate(row["labels"]):
+ # If the chebi_version class exists in the chebi_version_train and has a True label,
+ # set the corresponding label in new_labels to True
if mapping[ind] is not None and label:
new_labels[mapping[ind]] = label
+ # Update the labels from test instance from chebi_version to the new labels, which are compatible to both versions
row["labels"] = new_labels
- torch.save(
- dataset,
- os.path.join(self.processed_dir, self.processed_file_names_dict["test"]),
- )
+
+ # torch.save(
+ # chebi_ver_test_data,
+ # os.path.join(self.processed_dir, self.processed_file_names_dict["test"]),
+ # )
+ return df_test_chebi_version
def setup_processed(self):
- print("Transform splits")
+ print("Transform data")
os.makedirs(self.processed_dir, exist_ok=True)
- for k in self.processed_file_names_dict.keys():
- processed_name = (
- "test.pt" if k == "test" else self.processed_file_names_dict[k]
+ # -------- Commented the code for Data Handling Restructure for Issue No.10
+ # -------- https://github.com/ChEB-AI/python-chebai/issues/10
+ # for k in self.processed_file_names_dict.keys():
+ # processed_name = (
+ # "test.pt" if k == "test" else self.processed_file_names_dict[k]
+ # )
+ # if not os.path.isfile(os.path.join(self.processed_dir, processed_name)):
+ # print("transform", k)
+ # torch.save(
+ # self._load_data_from_file(
+ # os.path.join(self.raw_dir, self.raw_file_names_dict[k])
+ # ),
+ # os.path.join(self.processed_dir, processed_name),
+ # )
+ # # create second test set with classes used in train
+ # if self.chebi_version_train is not None and not os.path.isfile(
+ # os.path.join(self.processed_dir, self.processed_file_names_dict["test"])
+ # ):
+ # print("transform test (select classes)")
+ # self._setup_pruned_test_set()
+ #
+ # processed_name = self.processed_file_names_dict[k]
+ # if not os.path.isfile(os.path.join(self.processed_dir, processed_name)):
+ # print(
+ # "Missing encoded data, transform processed data into encoded data",
+ # k,
+ # )
+ # torch.save(
+ # self._load_data_from_file(
+ # os.path.join(
+ # self.processed_dir_main, self.raw_file_names_dict[k]
+ # )
+ # ),
+ # os.path.join(self.processed_dir, processed_name),
+ # )
+
+ # Transform the processed data into encoded data
+ processed_name = self.processed_file_names_dict["data"]
+ if not os.path.isfile(os.path.join(self.processed_dir, processed_name)):
+ print(
+ f"Missing encoded data related to version {self.chebi_version}, transform processed data into encoded data:",
+ processed_name,
)
- if not os.path.isfile(os.path.join(self.processed_dir, processed_name)):
- print("transform", k)
- torch.save(
- self._load_data_from_file(
- os.path.join(self.raw_dir, self.raw_file_names_dict[k])
- ),
- os.path.join(self.processed_dir, processed_name),
- )
- # create second test set with classes used in train
+ torch.save(
+ self._load_data_from_file(
+ os.path.join(
+ self.processed_dir_main,
+ self.raw_file_names_dict["data"],
+ )
+ ),
+ os.path.join(self.processed_dir, processed_name),
+ )
+
+ # Transform the data related to "chebi_version_train" to encoded data, if it doesn't exist
if self.chebi_version_train is not None and not os.path.isfile(
- os.path.join(self.processed_dir, self.processed_file_names_dict["test"])
+ os.path.join(
+ self._chebi_version_train_obj.processed_dir,
+ self._chebi_version_train_obj.raw_file_names_dict["data"],
+ )
):
- print("transform test (select classes)")
- self._setup_pruned_test_set()
+ print(
+ f"Missing encoded data related to train version: {self.chebi_version_train}"
+ )
+ print("Call the setup method related to it")
+ self._chebi_version_train_obj.setup()
+
+ def get_test_split(self, df: pd.DataFrame, seed: int = None):
+ """
+ Split the input DataFrame into training and testing sets based on multilabel stratified sampling.
+
+ This method uses MultilabelStratifiedShuffleSplit to split the data such that the distribution of labels
+ in the training and testing sets is approximately the same. The split is based on the "labels" column
+ in the DataFrame.
- def get_test_split(self, df: pd.DataFrame):
- print("Get test data split")
+ Parameters:
+ ----------
+ df : pd.DataFrame
+ The input DataFrame containing the data to be split. It must contain a column named "labels"
+ with the multilabel data.
- df_list = df.values.tolist()
- df_list = [row[3:] for row in df_list]
+ seed : int, optional
+ The random seed to be used for reproducibility. Default is None.
+
+ Returns:
+ -------
+ df_train : pd.DataFrame
+ The training set split from the input DataFrame.
+
+ df_test : pd.DataFrame
+ The testing set split from the input DataFrame.
+ """
+ print("\nGet test data split")
+
+ labels_list = df["labels"].tolist()
test_size = 1 - self.train_split - (1 - self.train_split) ** 2
msss = MultilabelStratifiedShuffleSplit(
- n_splits=1, test_size=test_size, random_state=0
+ n_splits=1, test_size=test_size, random_state=seed
)
- train_split = []
- test_split = []
- for train_split, test_split in msss.split(
- df_list,
- df_list,
- ):
- train_split = train_split
- test_split = test_split
- break
- df_train = df.iloc[train_split]
- df_test = df.iloc[test_split]
+ train_indices, test_indices = next(msss.split(labels_list, labels_list))
+
+ df_train = df.iloc[train_indices]
+ df_test = df.iloc[test_indices]
return df_train, df_test
- def get_train_val_splits_given_test(self, df: pd.DataFrame, test_df: pd.DataFrame):
+ def get_train_val_splits_given_test(
+ self, df: pd.DataFrame, test_df: pd.DataFrame, seed: int = None
+ ):
"""
Split the dataset into train and validation sets, given a test set.
- Use test set (e.g., loaded from another chebi version or generated in get_test_split), avoid overlap
+ Use test set (e.g., loaded from another chebi version or generated in get_test_split), to avoid overlap
Args:
df (pd.DataFrame): The original dataset.
@@ -306,20 +464,22 @@ def get_train_val_splits_given_test(self, df: pd.DataFrame, test_df: pd.DataFram
"""
print(f"Split dataset into train / val with given test set")
- df_trainval = df
- test_ids = test_df["id"].tolist()
- mask = [trainval_id not in test_ids for trainval_id in df_trainval["id"]]
- df_trainval = df_trainval[mask]
- df_trainval_list = df_trainval.values.tolist()
- df_trainval_list = [row[3:] for row in df_trainval_list]
+ test_ids = test_df["ident"].tolist()
+ # ---- list comprehension degrades performance, dataframe operations are faster
+ # mask = [trainval_id not in test_ids for trainval_id in df_trainval["ident"]]
+ # df_trainval = df_trainval[mask]
+ df_trainval = df[~df["ident"].isin(test_ids)]
+ labels_list_trainval = df_trainval["labels"].tolist()
if self.use_inner_cross_validation:
folds = {}
- kfold = MultilabelStratifiedKFold(n_splits=self.inner_k_folds)
+ kfold = MultilabelStratifiedKFold(
+ n_splits=self.inner_k_folds, random_state=seed
+ )
for fold, (train_ids, val_ids) in enumerate(
kfold.split(
- df_trainval_list,
- df_trainval_list,
+ labels_list_trainval,
+ labels_list_trainval,
)
):
df_validation = df_trainval.iloc[val_ids]
@@ -334,28 +494,29 @@ def get_train_val_splits_given_test(self, df: pd.DataFrame, test_df: pd.DataFram
# scale val set size by 1/self.train_split to compensate for (hypothetical) test set size (1-self.train_split)
test_size = ((1 - self.train_split) ** 2) / self.train_split
msss = MultilabelStratifiedShuffleSplit(
- n_splits=1, test_size=test_size, random_state=0
+ n_splits=1, test_size=test_size, random_state=seed
)
- train_split = []
- validation_split = []
- for train_split, validation_split in msss.split(
- df_trainval_list, df_trainval_list
- ):
- train_split = train_split
- validation_split = validation_split
- df_validation = df_trainval.iloc[validation_split]
- df_train = df_trainval.iloc[train_split]
- return {
- self.raw_file_names_dict["train"]: df_train,
- self.raw_file_names_dict["validation"]: df_validation,
- }
+ train_indices, validation_indices = next(
+ msss.split(labels_list_trainval, labels_list_trainval)
+ )
+
+ df_validation = df_trainval.iloc[validation_indices]
+ df_train = df_trainval.iloc[train_indices]
+ return df_train, df_validation
@property
- def processed_dir(self):
- res = os.path.join(
+ def processed_dir_main(self):
+ return os.path.join(
self.base_dir,
+ self._name,
"processed",
+ )
+
+ @property
+ def processed_dir(self):
+ res = os.path.join(
+ self.processed_dir_main,
*self.identifier,
)
if self.single_class is None:
@@ -365,22 +526,26 @@ def processed_dir(self):
@property
def base_dir(self):
- return os.path.join("data", self._name, f"chebi_v{self.chebi_version}")
+ return os.path.join("data", f"chebi_v{self.chebi_version}")
@property
def processed_file_names_dict(self) -> dict:
train_v_str = (
f"_v{self.chebi_version_train}" if self.chebi_version_train else ""
)
- res = {"test": f"test{train_v_str}.pt"}
+ # res = {"test": f"test{train_v_str}.pt"}
+ res = {}
+
for set in ["train", "validation"]:
+ # TODO: code will be modified into CV issue for dynamic splits
if self.use_inner_cross_validation:
for i in range(self.inner_k_folds):
res[f"fold_{i}_{set}"] = os.path.join(
self.fold_dir, f"fold_{i}_{set}{train_v_str}.pt"
)
- else:
- res[set] = f"{set}{train_v_str}.pt"
+ # else:
+ # res[set] = f"{set}{train_v_str}.pt"
+ res["data"] = "data.pt"
return res
@property
@@ -388,18 +553,21 @@ def raw_file_names_dict(self) -> dict:
train_v_str = (
f"_v{self.chebi_version_train}" if self.chebi_version_train else ""
)
- res = {
- "test": f"test.pkl"
- } # no extra raw test version for chebi_version_train - use default test set and only
+ # res = {
+ # "test": f"test.pkl"
+ # } # no extra raw test version for chebi_version_train - use default test set and only
# adapt processed file
+ res = {}
for set in ["train", "validation"]:
+ # TODO: code will be modified into CV issue for dynamic splits
if self.use_inner_cross_validation:
for i in range(self.inner_k_folds):
res[f"fold_{i}_{set}"] = os.path.join(
self.fold_dir, f"fold_{i}_{set}{train_v_str}.pkl"
)
- else:
- res[set] = f"{set}{train_v_str}.pkl"
+ # else:
+ # res[set] = f"{set}{train_v_str}.pkl"
+ res["data"] = "data.pkl"
return res
@property
@@ -436,7 +604,7 @@ def prepare_data(self, *args, **kwargs):
Prepares the data for the Chebi dataset.
This method checks for the presence of raw data in the specified directory.
- If the raw data is missing, it fetches the ontology and creates a test test set.
+ If the raw data is missing, it fetches the ontology and creates a test set.
If the test set already exists, it loads it from the file.
Then, it creates the train/validation split based on the test set.
@@ -447,44 +615,221 @@ def prepare_data(self, *args, **kwargs):
Returns:
None
"""
- print("Check for raw data in", self.raw_dir)
+ print("Check for processed data in", self.processed_dir_main)
if any(
- not os.path.isfile(os.path.join(self.raw_dir, f))
+ not os.path.isfile(os.path.join(self.processed_dir_main, f))
for f in self.raw_file_names
):
- os.makedirs(self.raw_dir, exist_ok=True)
+ os.makedirs(self.processed_dir_main, exist_ok=True)
print("Missing raw data. Go fetch...")
+
+ # -------- Commented the code for Data Handling Restructure for Issue No.10
+ # -------- https://github.com/ChEB-AI/python-chebai/issues/10
# missing test set -> create
- if not os.path.isfile(
- os.path.join(self.raw_dir, self.raw_file_names_dict["test"])
- ):
- chebi_path = self._load_chebi(self.chebi_version)
- g = self.extract_class_hierarchy(chebi_path)
- df = self.graph_to_raw_dataset(g, self.raw_file_names_dict["test"])
- _, test_df = self.get_test_split(df)
- self.save_raw(test_df, self.raw_file_names_dict["test"])
- # load test_split from file
- else:
- with open(
- os.path.join(self.raw_dir, self.raw_file_names_dict["test"]), "rb"
- ) as input_file:
- test_df = pd.read_pickle(input_file)
- # create train/val split based on test set
- chebi_path = self._load_chebi(
- self.chebi_version_train
- if self.chebi_version_train is not None
- else self.chebi_version
- )
+ # if not os.path.isfile(
+ # os.path.join(self.raw_dir, self.raw_file_names_dict["test"])
+ # ):
+ # chebi_path = self._load_chebi(self.chebi_version)
+ # g = self.extract_class_hierarchy(chebi_path)
+ # df = self.graph_to_raw_dataset(g, self.raw_file_names_dict["test"])
+ # _, test_df = self.get_test_split(df)
+ # self.save_raw(test_df, self.raw_file_names_dict["test"])
+ # # load test_split from file
+ # else:
+ # with open(
+ # os.path.join(self.raw_dir, self.raw_file_names_dict["test"]), "rb"
+ # ) as input_file:
+ # test_df = pickle.load(input_file)
+ # # create train/val split based on test set
+ # chebi_path = self._load_chebi(
+ # self.chebi_version_train
+ # if self.chebi_version_train is not None
+ # else self.chebi_version
+ # )
+ # g = self.extract_class_hierarchy(chebi_path)
+ # if self.use_inner_cross_validation:
+ # df = self.graph_to_raw_dataset(
+ # g, self.raw_file_names_dict[f"fold_0_train"]
+ # )
+ # else:
+ # df = self.graph_to_raw_dataset(g, self.raw_file_names_dict["train"])
+ # train_val_dict = self.get_train_val_splits_given_test(df, test_df)
+ # for name, df in train_val_dict.items():
+ # self.save_raw(df, name)
+
+ # Data from chebi_version
+ chebi_path = self._load_chebi(self.chebi_version)
g = self.extract_class_hierarchy(chebi_path)
- if self.use_inner_cross_validation:
- df = self.graph_to_raw_dataset(
- g, self.raw_file_names_dict[f"fold_0_train"]
+ df = self.graph_to_raw_dataset(g, self.raw_file_names_dict["data"])
+ self.save_processed(df, filename=self.raw_file_names_dict["data"])
+
+ if self.chebi_version_train is not None:
+ if not os.path.isfile(
+ os.path.join(
+ self._chebi_version_train_obj.processed_dir_main,
+ self._chebi_version_train_obj.raw_file_names_dict["data"],
+ )
+ ):
+ print(
+ f"Missing processed data related to train version: {self.chebi_version_train}"
+ )
+ print("Call the prepare_data method related to it")
+ # Generate the "chebi_version_train" data if it doesn't exist
+ self._chebi_version_train_obj.prepare_data(*args, **kwargs)
+
+ def _generate_dynamic_splits(self):
+ """Generate data splits during run-time and saves in class variables"""
+ print("Generate dynamic splits...")
+ # Load encoded data derived from "chebi_version"
+ try:
+ filename = self.processed_file_names_dict["data"]
+ data_chebi_version = torch.load(os.path.join(self.processed_dir, filename))
+ except FileNotFoundError:
+ raise FileNotFoundError(
+ f"File data.pt doesn't exists. "
+ f"Please call 'prepare_data' and/or 'setup' methods to generate the dataset files"
+ )
+
+ df_chebi_version = pd.DataFrame(data_chebi_version)
+ train_df_chebi_ver, df_test_chebi_ver = self.get_test_split(
+ df_chebi_version, seed=self.dynamic_data_split_seed
+ )
+
+ if self.chebi_version_train is not None:
+ # Load encoded data derived from "chebi_version_train"
+ try:
+ filename_train = (
+ self._chebi_version_train_obj.processed_file_names_dict["data"]
+ )
+ data_chebi_train_version = torch.load(
+ os.path.join(
+ self._chebi_version_train_obj.processed_dir, filename_train
+ )
+ )
+ except FileNotFoundError:
+ raise FileNotFoundError(
+ f"File data.pt doesn't exists related to chebi_version_train {self.chebi_version_train}."
+ f"Please call 'prepare_data' and/or 'setup' methods to generate the dataset files"
)
+
+ df_chebi_train_version = pd.DataFrame(data_chebi_train_version)
+ # Get train/val split of data based on "chebi_version_train", but
+ # using test set from "chebi_version"
+ df_train, df_val = self.get_train_val_splits_given_test(
+ df_chebi_train_version,
+ df_test_chebi_ver,
+ seed=self.dynamic_data_split_seed,
+ )
+ # Modify test set from "chebi_version" to only include the labels that
+ # exists in "chebi_version_train", all other entries remains same.
+ df_test = self._setup_pruned_test_set(df_test_chebi_ver)
+ else:
+ # Get all splits based on "chebi_version"
+ df_train, df_val = self.get_train_val_splits_given_test(
+ train_df_chebi_ver,
+ df_test_chebi_ver,
+ seed=self.dynamic_data_split_seed,
+ )
+ df_test = df_test_chebi_ver
+
+ # Generate splits.csv file to store ids of each corresponding split
+ split_assignment_list: List[pd.DataFrame] = [
+ pd.DataFrame({"id": df_train["ident"], "split": "train"}),
+ pd.DataFrame({"id": df_val["ident"], "split": "validation"}),
+ pd.DataFrame({"id": df_test["ident"], "split": "test"}),
+ ]
+ combined_split_assignment = pd.concat(split_assignment_list, ignore_index=True)
+ combined_split_assignment.to_csv(
+ os.path.join(self.processed_dir_main, "splits.csv")
+ )
+
+ # Store the splits in class variables
+ self.dynamic_df_train = df_train
+ self.dynamic_df_val = df_val
+ self.dynamic_df_test = df_test
+
+ def _retrieve_splits_from_csv(self):
+ print(f"Loading splits from {self.splits_file_path}...")
+ splits_df = pd.read_csv(self.splits_file_path)
+
+ filename = self.processed_file_names_dict["data"]
+ data_chebi_version = torch.load(os.path.join(self.processed_dir, filename))
+ df_chebi_version = pd.DataFrame(data_chebi_version)
+
+ train_ids = splits_df[splits_df["split"] == "train"]["id"]
+ validation_ids = splits_df[splits_df["split"] == "validation"]["id"]
+ test_ids = splits_df[splits_df["split"] == "test"]["id"]
+
+ self.dynamic_df_train = df_chebi_version[
+ df_chebi_version["ident"].isin(train_ids)
+ ]
+ self.dynamic_df_val = df_chebi_version[
+ df_chebi_version["ident"].isin(validation_ids)
+ ]
+ self.dynamic_df_test = df_chebi_version[
+ df_chebi_version["ident"].isin(test_ids)
+ ]
+
+ @property
+ def dynamic_split_dfs(self):
+ if any(
+ split is None
+ for split in [
+ self.dynamic_df_test,
+ self.dynamic_df_val,
+ self.dynamic_df_train,
+ ]
+ ):
+ if self.splits_file_path is None:
+ # Generate splits based on given seed, create csv file to records the splits
+ self._generate_dynamic_splits()
else:
- df = self.graph_to_raw_dataset(g, self.raw_file_names_dict["train"])
- train_val_dict = self.get_train_val_splits_given_test(df, test_df)
- for name, df in train_val_dict.items():
- self.save_raw(df, name)
+ # If user has provided splits file path, use it to get the splits from the data
+ self._retrieve_splits_from_csv()
+ return {
+ "train": self.dynamic_df_train,
+ "validation": self.dynamic_df_val,
+ "test": self.dynamic_df_test,
+ }
+
+ def load_processed_data(self, kind: str = None, filename: str = None) -> List:
+ """
+ Load processed data from a file.
+
+ Args:
+ kind (str, optional): The kind of dataset to load such as "train", "val" or "test". Defaults to None.
+ filename (str, optional): The name of the file to load the dataset from. Defaults to None.
+
+ Returns:
+ List: The loaded processed data.
+
+ Raises:
+ ValueError: If both kind and filename are None.
+ FileNotFoundError: If the specified file does not exist.
+ """
+ if kind is None and filename is None:
+ raise ValueError(
+ "Either kind or filename is required to load the correct dataset, both are None"
+ )
+
+ # If both kind and filename are given, use filename
+ if kind is not None and filename is None:
+ try:
+ if self.use_inner_cross_validation and kind != "test":
+ filename = self.processed_file_names_dict[
+ f"fold_{self.fold_index}_{kind}"
+ ]
+ else:
+ data_df = self.dynamic_split_dfs[kind]
+ return data_df.to_dict(orient="records")
+ except KeyError:
+ kind = f"{kind}"
+
+ # If filename is provided
+ try:
+ return torch.load(os.path.join(self.processed_dir, filename))
+ except FileNotFoundError:
+ raise FileNotFoundError(f"File {filename} doesn't exist")
class JCIExtendedBase(_ChEBIDataExtractor):
@@ -554,12 +899,13 @@ def select_classes(self, g, split_name, *args, **kwargs):
)
)
filename = "classes.txt"
- if (
- self.chebi_version_train is not None
- and self.raw_file_names_dict["test"] != split_name
- ):
- filename = f"classes_v{self.chebi_version_train}.txt"
- with open(os.path.join(self.raw_dir, filename), "wt") as fout:
+ # if (
+ # self.chebi_version_train
+ # is not None
+ # # and self.raw_file_names_dict["test"] != split_name
+ # ):
+ # filename = f"classes_v{self.chebi_version_train}.txt"
+ with open(os.path.join(self.processed_dir_main, filename), "wt") as fout:
fout.writelines(str(node) + "\n" for node in nodes)
return nodes
@@ -595,15 +941,20 @@ class ChEBIOver100SELFIES(ChEBIOverXSELFIES, ChEBIOver100):
class ChEBIOverXPartial(ChEBIOverX):
- """Dataset that doesn't use the full ChEBI, but extracts are part of ChEBI"""
+ """Dataset that doesn't use the full ChEBI, but extracts a part of ChEBI (subclasses of a given top class)"""
def __init__(self, top_class_id: int, **kwargs):
self.top_class_id = top_class_id
super().__init__(**kwargs)
@property
- def base_dir(self):
- return os.path.join(super().base_dir, f"partial_{self.top_class_id}")
+ def processed_dir_main(self):
+ return os.path.join(
+ self.base_dir,
+ self._name,
+ f"partial_{self.top_class_id}",
+ "processed",
+ )
def extract_class_hierarchy(self, chebi_path):
with open(chebi_path, encoding="utf-8") as chebi:
diff --git a/chebai/preprocessing/datasets/pubchem.py b/chebai/preprocessing/datasets/pubchem.py
index 000ab8f1..5b18add0 100644
--- a/chebai/preprocessing/datasets/pubchem.py
+++ b/chebai/preprocessing/datasets/pubchem.py
@@ -12,16 +12,19 @@
import random
import shutil
import tempfile
-from scipy import spatial
+import time
+from datetime import datetime
+import numpy as np
import pandas as pd
-from sklearn.model_selection import train_test_split
import requests
import torch
-import time
-import numpy as np
import tqdm
-from datetime import datetime
+from rdkit import Chem, DataStructs
+from rdkit.Chem import AllChem
+from scipy import spatial
+from sklearn.cluster import KMeans
+from sklearn.model_selection import train_test_split
from chebai.preprocessing import reader as dr
from chebai.preprocessing.datasets.base import DataLoader, XYBaseDataModule
@@ -31,9 +34,6 @@
ChEBIOverX,
_ChEBIDataExtractor,
)
-from rdkit import Chem, DataStructs
-from rdkit.Chem import AllChem
-from sklearn.cluster import KMeans
class PubChem(XYBaseDataModule):
diff --git a/chebai/preprocessing/datasets/tox21.py b/chebai/preprocessing/datasets/tox21.py
index 8208ffe4..ba101ff5 100644
--- a/chebai/preprocessing/datasets/tox21.py
+++ b/chebai/preprocessing/datasets/tox21.py
@@ -1,17 +1,17 @@
-from tempfile import NamedTemporaryFile, TemporaryDirectory
-from urllib import request
import csv
import gzip
import os
import random
import shutil
import zipfile
+from tempfile import NamedTemporaryFile, TemporaryDirectory
+from urllib import request
-from rdkit import Chem
-from sklearn.model_selection import GroupShuffleSplit, train_test_split
import numpy as np
import pysmiles
import torch
+from rdkit import Chem
+from sklearn.model_selection import GroupShuffleSplit, train_test_split
from chebai.preprocessing import reader as dr
from chebai.preprocessing.datasets.base import MergedDataset, XYBaseDataModule
diff --git a/chebai/preprocessing/migration/__init__.py b/chebai/preprocessing/migration/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/chebai/preprocessing/migration/chebi_data_migration.py b/chebai/preprocessing/migration/chebi_data_migration.py
new file mode 100644
index 00000000..6ea2d7e2
--- /dev/null
+++ b/chebai/preprocessing/migration/chebi_data_migration.py
@@ -0,0 +1,327 @@
+import argparse
+import os
+import shutil
+from typing import Dict, List, Optional, Tuple, Type
+
+import pandas as pd
+import torch
+from jsonargparse import CLI
+
+from chebai.preprocessing.datasets.chebi import ChEBIOverXPartial, _ChEBIDataExtractor
+
+
+class ChebiDataMigration:
+ """
+ A class to handle migration of ChEBI dataset to a new structure.
+
+ Attributes:
+ __MODULE_PATH (str): The path to the module containing ChEBI classes.
+ __DATA_ROOT_DIR (str): The root directory for data.
+ _chebi_cls (_ChEBIDataExtractor): The ChEBI class instance.
+ """
+
+ __MODULE_PATH: str = "chebai.preprocessing.datasets.chebi"
+ __DATA_ROOT_DIR: str = "data"
+
+ def __init__(self, datamodule: _ChEBIDataExtractor):
+ self._chebi_cls = datamodule
+
+ @classmethod
+ def from_args(cls, class_name: str, chebi_version: int, single_class: int = None):
+ chebi_cls: _ChEBIDataExtractor = ChebiDataMigration._dynamic_import_chebi_cls(
+ class_name, chebi_version, single_class
+ )
+ return cls(chebi_cls)
+
+ @classmethod
+ def _dynamic_import_chebi_cls(
+ cls, class_name: str, chebi_version: int, single_class: int
+ ) -> _ChEBIDataExtractor:
+ """
+ Dynamically import the ChEBI class.
+
+ Args:
+ class_name (str): The name of the ChEBI class.
+ chebi_version (int): The version of the ChEBI dataset.
+ single_class (int): The ID of the single class to predict.
+
+ Returns:
+ _ChEBIDataExtractor: An instance of the dynamically imported class.
+ """
+ class_name = class_name.strip()
+ module = __import__(cls.__MODULE_PATH, fromlist=[class_name])
+ _class = getattr(module, class_name)
+ return _class(**{"chebi_version": chebi_version, "single_class": single_class})
+
+ def migrate(self) -> None:
+ """
+ Start the migration process for the ChEBI dataset.
+ """
+ os.makedirs(self._chebi_cls.base_dir, exist_ok=True)
+ print("Migration started.....")
+ old_raw_data_exists = self._migrate_old_raw_data()
+
+ # Either we can combine `.pt` split files to form `data.pt` file
+ # self._migrate_old_processed_data()
+ # OR
+ # we can transform `data.pkl` to `data.pt` file (this seems efficient along with less code)
+ if old_raw_data_exists:
+ self._chebi_cls.setup_processed()
+ else:
+ self._migrate_old_processed_data()
+ print("Migration completed.....")
+
+ def _migrate_old_raw_data(self) -> bool:
+ """
+ Migrate old raw data files to the new data folder structure.
+ """
+ print("-" * 50)
+ print("Migrating old raw data....")
+
+ self._copy_file(self._old_raw_dir, self._chebi_cls.raw_dir, "chebi.obo")
+ self._copy_file(
+ self._old_raw_dir, self._chebi_cls.processed_dir_main, "classes.txt"
+ )
+
+ old_splits_file_names_raw = {
+ "train": "train.pkl",
+ "validation": "validation.pkl",
+ "test": "test.pkl",
+ }
+
+ data_file_path = os.path.join(self._chebi_cls.processed_dir_main, "data.pkl")
+ if os.path.isfile(data_file_path):
+ print(f"File {data_file_path} already exists in new data-folder structure")
+ return True
+
+ data_df_split_ass_df = self._combine_pkl_splits(
+ self._old_raw_dir, old_splits_file_names_raw
+ )
+ if data_df_split_ass_df is not None:
+ data_df = data_df_split_ass_df[0]
+ split_ass_df = data_df_split_ass_df[1]
+ self._chebi_cls.save_processed(data_df, "data.pkl")
+ print(f"File {data_file_path} saved to new data-folder structure")
+
+ split_file = os.path.join(self._chebi_cls.processed_dir_main, "splits.csv")
+ split_ass_df.to_csv(split_file) # overwrites the files with same name
+ print(f"File {split_file} saved to new data-folder structure")
+ return True
+ return False
+
+ def _migrate_old_processed_data(self) -> None:
+ """
+ Migrate old processed data files to the new data folder structure.
+ """
+ print("-" * 50)
+ print("Migrating old processed data.....")
+
+ data_file_path = os.path.join(self._chebi_cls.processed_dir, "data.pt")
+ if os.path.isfile(data_file_path):
+ print(f"File {data_file_path} already exists in new data-folder structure")
+ return
+
+ old_splits_file_names = {
+ "train": "train.pt",
+ "validation": "validation.pt",
+ "test": "test.pt",
+ }
+
+ data_df = self._combine_pt_splits(
+ self._old_processed_dir, old_splits_file_names
+ )
+ if data_df is not None:
+ torch.save(data_df, data_file_path)
+ print(f"File {data_file_path} saved to new data-folder structure")
+
+ def _combine_pt_splits(
+ self, old_dir: str, old_splits_file_names: Dict[str, str]
+ ) -> Optional[pd.DataFrame]:
+ """
+ Combine old `.pt` split files into a single DataFrame.
+
+ Args:
+ old_dir (str): The directory containing the old split files.
+ old_splits_file_names (Dict[str, str]): A dictionary of split names and file names.
+
+ Returns:
+ pd.DataFrame: The combined DataFrame.
+ """
+ if not self._check_if_old_splits_exists(old_dir, old_splits_file_names):
+ print(
+ f"Missing at least one of [{', '.join(old_splits_file_names.values())}] in {old_dir}"
+ )
+ return None
+
+ print("Combining `.pt` splits...")
+ df_list: List[pd.DataFrame] = []
+ for split, file_name in old_splits_file_names.items():
+ file_path = os.path.join(old_dir, file_name)
+ file_df = pd.DataFrame(torch.load(file_path))
+ df_list.append(file_df)
+
+ return pd.concat(df_list, ignore_index=True)
+
+ def _combine_pkl_splits(
+ self, old_dir: str, old_splits_file_names: Dict[str, str]
+ ) -> Optional[Tuple[pd.DataFrame, pd.DataFrame]]:
+ """
+ Combine old `.pkl` split files into a single DataFrame and create split assignments.
+
+ Args:
+ old_dir (str): The directory containing the old split files.
+ old_splits_file_names (Dict[str, str]): A dictionary of split names and file names.
+
+ Returns:
+ Tuple[pd.DataFrame, pd.DataFrame]: The combined DataFrame and split assignments DataFrame.
+ """
+ if not self._check_if_old_splits_exists(old_dir, old_splits_file_names):
+ print(
+ f"Missing at least one of [{', '.join(old_splits_file_names.values())}] in {old_dir}"
+ )
+ return None
+
+ df_list: List[pd.DataFrame] = []
+ split_assignment_list: List[pd.DataFrame] = []
+
+ print("Combining `.pkl` splits...")
+ for split, file_name in old_splits_file_names.items():
+ file_path = os.path.join(old_dir, file_name)
+ file_df = pd.read_pickle(file_path)
+ df_list.append(file_df)
+
+ # Create split assignment for the current DataFrame
+ split_assignment = pd.DataFrame({"id": file_df["id"], "split": split})
+ split_assignment_list.append(split_assignment)
+
+ # Concatenate all dataframes and split assignments
+ combined_df = pd.concat(df_list, ignore_index=True)
+ combined_split_assignment = pd.concat(split_assignment_list, ignore_index=True)
+
+ return combined_df, combined_split_assignment
+
+ @staticmethod
+ def _check_if_old_splits_exists(
+ old_dir: str, old_splits_file_names: Dict[str, str]
+ ) -> bool:
+ """
+ Check if the old split files exist in the specified directory.
+
+ Args:
+ old_dir (str): The directory containing the old split files.
+ old_splits_file_names (Dict[str, str]): A dictionary of split names and file names.
+
+ """
+ return all(
+ os.path.isfile(os.path.join(old_dir, file))
+ for file in old_splits_file_names.values()
+ )
+
+ @staticmethod
+ def _copy_file(old_file_dir: str, new_file_dir: str, file_name: str) -> None:
+ """
+ Copy a file from the old directory to the new directory.
+
+ Args:
+ old_file_dir (str): The directory containing the old file.
+ new_file_dir (str): The directory to copy the file to.
+ file_name (str): The name of the file to copy.
+
+ Raises:
+ FileNotFoundError: If the file does not exist in the old directory.
+ """
+ os.makedirs(new_file_dir, exist_ok=True)
+ new_file_path = os.path.join(new_file_dir, file_name)
+ old_file_path = os.path.join(old_file_dir, file_name)
+
+ if os.path.isfile(new_file_path):
+ print(
+ f"Skipping {old_file_path} (file already exists at new location {new_file_path})"
+ )
+ return
+
+ if os.path.isfile(old_file_path):
+ shutil.copy2(os.path.abspath(old_file_path), os.path.abspath(new_file_path))
+ print(f"Copied {old_file_path} to {new_file_path}")
+ else:
+ print(f"Skipping expected file {old_file_path} (not found)")
+
+ @property
+ def _old_base_dir(self) -> str:
+ """
+ Get the base directory for the old data structure.
+
+ Returns:
+ str: The base directory for the old data.
+ """
+ if isinstance(self._chebi_cls, ChEBIOverXPartial):
+ return os.path.join(
+ self.__DATA_ROOT_DIR,
+ self._chebi_cls._name,
+ f"chebi_v{self._chebi_cls.chebi_version}",
+ f"partial_{self._chebi_cls.top_class_id}",
+ )
+ return os.path.join(
+ self.__DATA_ROOT_DIR,
+ self._chebi_cls._name,
+ f"chebi_v{self._chebi_cls.chebi_version}",
+ )
+
+ @property
+ def _old_processed_dir(self) -> str:
+ """
+ Get the processed directory for the old data structure.
+
+ Returns:
+ str: The processed directory for the old data.
+ """
+ res = os.path.join(
+ self._old_base_dir,
+ "processed",
+ *self._chebi_cls.identifier,
+ )
+ if self._chebi_cls.single_class is None:
+ return res
+ else:
+ return os.path.join(res, f"single_{self._chebi_cls.single_class}")
+
+ @property
+ def _old_raw_dir(self) -> str:
+ """
+ Get the raw directory for the old data structure.
+
+ Returns:
+ str: The raw directory for the old data.
+ """
+ return os.path.join(self._old_base_dir, "raw")
+
+
+class Main:
+
+ def migrate(
+ self,
+ datamodule: Optional[_ChEBIDataExtractor] = None,
+ class_name: Optional[str] = None,
+ chebi_version: Optional[int] = None,
+ single_class: Optional[int] = None,
+ ):
+ """
+ Migrate ChEBI dataset to new structure and handle splits.
+
+ Args:
+ datamodule (Optional[_ChEBIDataExtractor]): The datamodule instance. If not provided, class_name and
+ chebi_version are required.
+ class_name (Optional[str]): The name of the ChEBI class.
+ chebi_version (Optional[int]): The version of the ChEBI dataset.
+ single_class (Optional[int]): The ID of the single class to predict.
+ """
+ if datamodule is not None:
+ ChebiDataMigration(datamodule).migrate()
+ else:
+ ChebiDataMigration.from_args(
+ class_name, chebi_version, single_class
+ ).migrate()
+
+
+if __name__ == "__main__":
+ CLI(Main)
diff --git a/chebai/preprocessing/reader.py b/chebai/preprocessing/reader.py
index 3c2ee548..120011df 100644
--- a/chebai/preprocessing/reader.py
+++ b/chebai/preprocessing/reader.py
@@ -1,9 +1,9 @@
import os
-from pysmiles.read_smiles import _tokenize
-from transformers import RobertaTokenizerFast
import deepsmiles
import selfies as sf
+from pysmiles.read_smiles import _tokenize
+from transformers import RobertaTokenizerFast
from chebai.preprocessing.collate import DefaultCollater, RaggedCollater
diff --git a/chebai/preprocessing/structures.py b/chebai/preprocessing/structures.py
index 37a55870..eb54fd41 100644
--- a/chebai/preprocessing/structures.py
+++ b/chebai/preprocessing/structures.py
@@ -1,6 +1,6 @@
-from torch.utils.data.dataset import T_co
import networkx as nx
import torch
+from torch.utils.data.dataset import T_co
class XYData(torch.utils.data.Dataset):
diff --git a/chebai/result/analyse_sem.py b/chebai/result/analyse_sem.py
index d99b13e9..b77b8e85 100644
--- a/chebai/result/analyse_sem.py
+++ b/chebai/result/analyse_sem.py
@@ -1,19 +1,23 @@
-import pandas as pd
+import gc
+import os
import sys
import traceback
from datetime import datetime
-from chebai.loss.semantic import DisjointLoss
-from chebai.preprocessing.datasets.chebi import ChEBIOver100
-from chebai.preprocessing.datasets.pubchem import Hazardous
-import os
+
+import pandas as pd
import torch
-from torchmetrics.functional.classification import multilabel_auroc
-from torchmetrics.functional.classification import multilabel_f1_score
import wandb
+
+from torchmetrics.functional.classification import multilabel_auroc, multilabel_f1_score
import gc
from typing import List, Union
+
from utils import *
+from chebai.loss.semantic import DisjointLoss
+from chebai.preprocessing.datasets.chebi import ChEBIOver100
+from chebai.preprocessing.datasets.pubchem import Hazardous
+
DEVICE = "cpu" # torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
diff --git a/chebai/result/base.py b/chebai/result/base.py
index 7983167d..1b8a9940 100644
--- a/chebai/result/base.py
+++ b/chebai/result/base.py
@@ -1,6 +1,6 @@
-from typing import Iterable
import abc
import multiprocessing as mp
+from typing import Iterable
import torch
import tqdm
diff --git a/chebai/result/classification.py b/chebai/result/classification.py
index b3c6ec36..69ccacce 100644
--- a/chebai/result/classification.py
+++ b/chebai/result/classification.py
@@ -1,18 +1,17 @@
import os
-from torchmetrics.classification import (
- MultilabelF1Score,
- MultilabelPrecision,
- MultilabelRecall,
-)
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import torch
import tqdm
+from torchmetrics.classification import (
+ MultilabelF1Score,
+ MultilabelPrecision,
+ MultilabelRecall,
+)
-from chebai.callbacks.epoch_metrics import MacroF1
-
+from chebai.callbacks.epoch_metrics import BalancedAccuracy, MacroF1
from chebai.models import ChebaiBaseNet
from chebai.models.electra import Electra
from chebai.preprocessing.datasets import XYBaseDataModule
@@ -39,9 +38,11 @@ def print_metrics(preds, labels, device, classes=None, top_k=10, markdown_output
"""Prints relevant metrics, including micro and macro F1, recall and precision, best k classes and worst classes."""
f1_micro = MultilabelF1Score(preds.shape[1], average="micro").to(device=device)
my_f1_macro = MacroF1(preds.shape[1]).to(device=device)
+ my_bal_acc = BalancedAccuracy(preds.shape[1]).to(device=device)
print(f"Macro-F1: {my_f1_macro(preds, labels):3f}")
print(f"Micro-F1: {f1_micro(preds, labels):3f}")
+ print(f"Balanced Accuracy: {my_bal_acc(preds, labels):3f}")
precision_macro = MultilabelPrecision(preds.shape[1], average="macro").to(
device=device
)
@@ -57,13 +58,13 @@ def print_metrics(preds, labels, device, classes=None, top_k=10, markdown_output
print(f"Micro-Recall: {recall_micro(preds, labels):3f}")
if markdown_output:
print(
- f"| Model | Macro-F1 | Micro-F1 | Macro-Precision | Micro-Precision | Macro-Recall | Micro-Recall |"
+ f"| Model | Macro-F1 | Micro-F1 | Macro-Precision | Micro-Precision | Macro-Recall | Micro-Recall | Balanced Accuracy"
)
- print(f"| --- | --- | --- | --- | --- | --- | --- |")
+ print(f"| --- | --- | --- | --- | --- | --- | --- | --- |")
print(
f"| | {my_f1_macro(preds, labels):3f} | {f1_micro(preds, labels):3f} | {precision_macro(preds, labels):3f} | "
f"{precision_micro(preds, labels):3f} | {recall_macro(preds, labels):3f} | "
- f"{recall_micro(preds, labels):3f} |"
+ f"{recall_micro(preds, labels):3f} | {my_bal_acc(preds, labels):3f} |"
)
classwise_f1_fn = MultilabelF1Score(preds.shape[1], average=None).to(device=device)
diff --git a/chebai/result/molplot.py b/chebai/result/molplot.py
index 9fd19589..8fdbc77d 100644
--- a/chebai/result/molplot.py
+++ b/chebai/result/molplot.py
@@ -1,7 +1,11 @@
+import abc
from os import makedirs
from tempfile import NamedTemporaryFile
-import abc
+import networkx as nx
+import numpy as np
+import pandas as pd
+import torch
from matplotlib import cm, colors
from matplotlib import pyplot as plt
from matplotlib import rc
@@ -11,10 +15,6 @@
from pysmiles.read_smiles import _tokenize
from rdkit import Chem
from rdkit.Chem.Draw import MolToMPL, rdMolDraw2D
-import networkx as nx
-import numpy as np
-import pandas as pd
-import torch
from chebai.preprocessing.datasets import JCI_500_COLUMNS, JCI_500_COLUMNS_INT
from chebai.result.base import ResultProcessor
diff --git a/chebai/result/pretraining.py b/chebai/result/pretraining.py
index 20822d12..7c469674 100644
--- a/chebai/result/pretraining.py
+++ b/chebai/result/pretraining.py
@@ -6,9 +6,9 @@
import torch
import tqdm
+import chebai.models.electra as electra
from chebai.loss.pretraining import ElectraPreLoss
from chebai.result.base import ResultProcessor
-import chebai.models.electra as electra
def visualise_loss(logs_path):
diff --git a/chebai/result/utils.py b/chebai/result/utils.py
index 57912614..08860d76 100644
--- a/chebai/result/utils.py
+++ b/chebai/result/utils.py
@@ -1,11 +1,14 @@
+import os
+
+import torch
+import tqdm
+import wandb
import wandb.util as wandb_util
-from chebai.models.electra import Electra
+
from chebai.models.base import ChebaiBaseNet
+from chebai.models.electra import Electra
from chebai.preprocessing.datasets.base import XYBaseDataModule
-import os
-import wandb
-import tqdm
-import torch
+from chebai.preprocessing.datasets.chebi import _ChEBIDataExtractor
def get_checkpoint_from_wandb(
@@ -39,10 +42,12 @@ def get_checkpoint_from_wandb(
def evaluate_model(
model: ChebaiBaseNet,
data_module: XYBaseDataModule,
+ # No need to provide "filename" parameter for Chebi dataset, "kind" parameter should be provided
filename=None,
buffer_dir=None,
batch_size: int = 32,
skip_existing_preds=False,
+ kind: str = "test",
):
"""Runs model on test set of data_module (or, if filename is not None, on data set found in that file).
If buffer_dir is set, results will be saved in buffer_dir. Returns tensors with predictions and labels.
@@ -50,7 +55,12 @@ def evaluate_model(
model.eval()
collate = data_module.reader.COLLATER()
- data_list = data_module.load_processed_data("test", filename)
+ if isinstance(data_module, _ChEBIDataExtractor):
+ # As the dynamic split change is implemented only for chebi-dataset as of now
+ data_df = data_module.dynamic_split_dfs[kind]
+ data_list = data_df.to_dict(orient="records")
+ else:
+ data_list = data_module.load_processed_data("test", filename)
data_list = data_list[: data_module.data_limit]
preds_list = []
labels_list = []
diff --git a/chebai/train.py b/chebai/train.py
index 060db560..f6638733 100644
--- a/chebai/train.py
+++ b/chebai/train.py
@@ -3,16 +3,16 @@
import os
import pickle
-from model import ChEBIRecNN
-from molecule import Molecule
-from pytorch_lightning import loggers as pl_loggers
-from sklearn.metrics import f1_score
-from torch.utils import data
import numpy as np
import pandas as pd
import pytorch_lightning as pl
import torch
import torch.nn as nn
+from model import ChEBIRecNN
+from molecule import Molecule
+from pytorch_lightning import loggers as pl_loggers
+from sklearn.metrics import f1_score
+from torch.utils import data
BATCH_SIZE = 100
NUM_EPOCHS = 100
diff --git a/chebai/trainer/CustomTrainer.py b/chebai/trainer/CustomTrainer.py
index 85593a4d..61115b83 100644
--- a/chebai/trainer/CustomTrainer.py
+++ b/chebai/trainer/CustomTrainer.py
@@ -1,15 +1,15 @@
-from typing import List, Optional
import logging
+from typing import List, Optional
+import pandas as pd
+import torch
from lightning import LightningModule, Trainer
from lightning.fabric.utilities.types import _PATH
from lightning.pytorch.loggers import WandbLogger
from torch.nn.utils.rnn import pad_sequence
-import pandas as pd
-import torch
-from chebai.preprocessing.reader import CLS_TOKEN, ChemDataReader
from chebai.loggers.custom import CustomLogger
+from chebai.preprocessing.reader import CLS_TOKEN, ChemDataReader
log = logging.getLogger(__name__)
diff --git a/configs/data/chebi100.yml b/configs/data/chebi100.yml
index ac8246dd..ebc59974 100644
--- a/configs/data/chebi100.yml
+++ b/configs/data/chebi100.yml
@@ -1 +1 @@
-class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100
\ No newline at end of file
+class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100
diff --git a/configs/data/chebi100_SELFIES.yml b/configs/data/chebi100_SELFIES.yml
index fbdfeafa..0f62bcbc 100644
--- a/configs/data/chebi100_SELFIES.yml
+++ b/configs/data/chebi100_SELFIES.yml
@@ -1 +1 @@
-class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100SELFIES
\ No newline at end of file
+class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100SELFIES
diff --git a/configs/data/chebi100_deepSMILES.yml b/configs/data/chebi100_deepSMILES.yml
index 943f0e17..901db031 100644
--- a/configs/data/chebi100_deepSMILES.yml
+++ b/configs/data/chebi100_deepSMILES.yml
@@ -1 +1 @@
-class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100DeepSMILES
\ No newline at end of file
+class_path: chebai.preprocessing.datasets.chebi.ChEBIOver100DeepSMILES
diff --git a/configs/data/chebi100_mixed.yml b/configs/data/chebi100_mixed.yml
index 48f2757f..3b92a774 100644
--- a/configs/data/chebi100_mixed.yml
+++ b/configs/data/chebi100_mixed.yml
@@ -1,4 +1,4 @@
class_path: chebai.preprocessing.datasets.pubchem.LabeledUnlabeledMixed
init_args:
labeled: chebi100.yml
- unlabeled: pubchem_dissimilar.yml
\ No newline at end of file
+ unlabeled: pubchem_dissimilar.yml
diff --git a/configs/data/chebi50_mixed.yml b/configs/data/chebi50_mixed.yml
index deb1aa6d..0586cc5d 100644
--- a/configs/data/chebi50_mixed.yml
+++ b/configs/data/chebi50_mixed.yml
@@ -1 +1 @@
-class_path: chebai.preprocessing.datasets.pubchem.PubToxAndChebi50
\ No newline at end of file
+class_path: chebai.preprocessing.datasets.pubchem.PubToxAndChebi50
diff --git a/configs/data/tox21_moleculenet.yml b/configs/data/tox21_moleculenet.yml
index 41c1c5c6..5579a829 100644
--- a/configs/data/tox21_moleculenet.yml
+++ b/configs/data/tox21_moleculenet.yml
@@ -1,3 +1,3 @@
class_path: chebai.preprocessing.datasets.tox21.Tox21MolNetChem
init_args:
- batch_size: 10
\ No newline at end of file
+ batch_size: 10
diff --git a/configs/default_prediction_callback.yml b/configs/default_prediction_callback.yml
index 127f4153..152b5d10 100644
--- a/configs/default_prediction_callback.yml
+++ b/configs/default_prediction_callback.yml
@@ -1,4 +1,4 @@
class_path: chebai.callbacks.prediction_callback.PredictionWriter
init_args:
output_dir: pred
- write_interval: epoch
\ No newline at end of file
+ write_interval: epoch
diff --git a/configs/loss/weighting_chebi100.yml b/configs/loss/weighting_chebi100.yml
index 07b87672..15471d38 100644
--- a/configs/loss/weighting_chebi100.yml
+++ b/configs/loss/weighting_chebi100.yml
@@ -3,4 +3,4 @@ init_args:
pos_weight:
class_path: chebai.CustomTensor
init_args:
- data: [0.7269214993582873, 0.8409484012184109, 0.27551414429639587, 1.2614226018276162, 0.06103657750778788, 1.1091819429863523, 0.004043529396179034, 1.4961058765862425, 0.5230288836846214, 1.4961058765862425, 0.6433255269320843, 0.41639192681688303, 0.1760124560689697, 1.0997017554394604, 0.9060922914536399, 0.15154900516656875, 0.1883822919274039, 0.03447618043580302, 0.6954870561427938, 1.5137071221931395, 0.24790964428982054, 1.1487955838072934, 0.030583576274403817, 0.015282706424327932, 0.7704497328527956, 0.03311843124489495, 0.8873455543890818, 0.615622513810607, 1.029320843091335, 0.21881820643948446, 0.6736392952168422, 0.10235887461131016, 0.03832740702604017, 0.11612374132348093, 0.19855726139879146, 0.2335119879971268, 0.007641807055082073, 0.615622513810607, 0.09054546473357977, 1.0633479784001394, 0.9125184779178501, 0.2992211753172485, 0.40588361320636235, 0.07559641914595586, 1.3687777168767752, 0.9974039177241617, 1.1091819429863523, 0.3092911187173482, 1.4621034703001916, 0.1745795188418139, 0.47477898666574486, 0.1967356351474264, 0.18224519176546297, 1.413902256993592, 0.4713007523311973, 0.06615172513440455, 0.49296975243837876, 0.21196887213577736, 0.5618563553992003, 0.5025980679156908, 0.11316192206369118, 0.7568535610965698, 0.22415523586483774, 0.48009367681498827, 0.01856371452696824, 0.8354876973143952, 0.1706433758440542, 1.4789092573151363, 0.1769808877392254, 0.023848953732422032, 0.41238815828979764, 1.0997017554394604, 1.413902256993592, 0.17270483944485485, 0.0967406807416668, 0.08922684146076065, 1.2371644748693928, 0.20719018580743456, 0.12764395375636595, 1.2739119345189789, 0.3496334385500458, 0.5743977919036467, 1.090382249037431, 1.3402615144418424, 0.6401249024199844, 1.3402615144418424, 0.2852884820097935, 0.05942960987825259, 0.14343935940514702, 0.08526514604798997, 0.08520867906385222, 0.28719889595182335, 0.8635241972242742, 0.0011988251251925615, 0.40588361320636235, 0.2985269266506192, 0.019120984601934444, 0.6276346604215457, 0.7524275168796307, 1.3543695303833354, 0.8300974541059153, 0.7148061410356492, 1.2614226018276162, 0.15190685405716275, 1.4456753414204142, 0.3048936146597556, 0.32166276346604217, 0.1376097383811945, 0.30345543723211527, 1.1696827762401534, 1.3687777168767752, 1.0997017554394604, 0.8520867906385222, 0.7893564747632936, 0.28340331582911205, 0.10940910321974223, 1.4456753414204142, 0.25630499080959535, 1.2866510538641687, 0.18566393273653226, 0.5821950469973614, 1.0997017554394604, 0.36761458681833387, 0.5569917982095968, 0.8409484012184109, 1.0376218176323941, 0.7524275168796307, 1.2614226018276162, 0.043704179818755726, 0.1373160142864641, 0.5230288836846214, 0.00117096018735363, 0.05611212620428123, 0.8195229642446934, 0.031974429767996235, 1.0546320113640726, 0.3910793476790786, 0.004047217935466542, 0.7394546286575682, 1.4961058765862425, 0.14392069953737904, 0.008958094088032923, 0.23099659853934804, 1.413902256993592, 1.213821748928461, 0.13075722092115535, 0.953074854714199, 1.0460577673692428, 0.7352291736366677, 0.35444932613337976, 1.2739119345189789, 0.35444932613337976, 0.761331984535011, 0.09799322573222914, 0.017727349874127427, 1.0722092115534738, 0.18354508614324802, 1.3985337542001832, 0.8300974541059153, 0.09645060373794367, 0.9821763769955486, 0.12047294511836784, 0.013122397285713091, 1.0131110660347784, 0.8409484012184109, 0.03119154069973742, 0.4765374273570995, 0.28978627339283075, 0.01912382660321297, 0.06924924940065492, 0.6338182531350585, 0.43467941008924615, 0.9190364670458347, 0.5769735667552326, 0.8195229642446934, 0.23915447097847, 0.002221965001665058, 0.03485914532278972, 0.26805230288836845, 0.6598210532636762, 0.16974288309553676, 0.12230523325705026, 0.20455501651258642, 0.5025980679156908, 0.4137141652296362, 0.12218908393771782, 0.5743977919036467, 0.0489220933028201, 0.016487071423169766, 0.019491759640420672, 0.05249494303811377, 0.02473377650642385, 0.01422185314318745, 0.022768555191367345, 0.20955228890295907, 0.02262044750112814, 1.3543695303833354, 0.033332928856584676, 1.326444385426978, 0.2992211753172485, 0.0017904968742891297, 0.9974039177241617, 0.54751108675071, 0.47830894195694, 0.13557966847883757, 1.138629251207229, 0.6369559672594894, 0.08670155349489007, 0.022688256989317028, 0.015679393783380072, 0.01524287470517911, 0.1883822919274039, 0.17746911087781636, 0.2026222132069557, 0.12431411148446074, 0.2249389954307987, 0.24230716645276246, 1.029320843091335, 1.1188270033601466, 1.3402615144418424, 0.6069108744642305, 1.029320843091335, 1.4296122820712984, 0.8935076762945615, 0.1552051934697429, 0.16328059059189956, 0.10195333231887231, 0.47830894195694, 0.26583699460003485, 0.07132212050244838, 0.6771847651916677, 0.08972462021367981, 0.10227750825629321, 0.8520867906385222, 1.1804138108845583, 0.15353831191696524, 0.14621034703001917, 1.225381956061113, 0.3333292885658468, 1.413902256993592, 0.5294860303967772, 0.15427470669834156, 1.3402615144418424, 0.6598210532636762, 0.5569917982095968, 0.3740264691465606, 0.37621375843981536, 0.0751987757956849, 0.649823764577863, 0.7991621452572476, 0.3806659922675055, 1.2866510538641687, 0.08184803141629571, 0.22533293412682462, 0.18512964803800988, 0.24601358582488883, 0.017105172213030692, 1.1188270033601466, 0.7269214993582873, 0.03403838766836425, 0.9747356468667944, 0.1862013102553066, 0.7704497328527956, 0.26365800284101815, 0.538347721282079, 1.090382249037431, 0.1802032288325166, 0.5273160056820363, 0.05383477212820789, 1.0051961358313817, 1.2491757804506491, 1.0812193729950996, 0.4873678234333972, 0.5902069054422792, 0.017734680273799704, 0.5718449128285193, 0.17041735812770445, 1.0812193729950996, 1.2866510538641687, 1.326444385426978, 0.05845756719055741, 0.48189178047347137, 0.6126909780305565, 0.1710972146095969, 0.5643206376597231, 0.5316739892000697, 0.04112019986782258, 0.43321584305190863, 0.039024903059271115, 0.7030880075760484, 0.8693588201784923, 0.07826344609879371, 0.7187994714324965, 0.03933509794754413, 1.5884580911903317, 1.0546320113640726, 0.21444184231069477, 0.2652888770853956, 0.004796820094188452, 0.7797885174934355, 0.8041569086651054, 0.22853482306645978, 0.010909369627473025, 0.7991621452572476, 0.10713164478469347, 0.09426015046623946, 0.7310517351500958, 0.6736392952168422, 0.005066951734195127, 0.7352291736366677, 0.5618563553992003, 0.020504399264767628, 0.034338165301952724, 0.0015163652212279981, 0.3100363985214864, 1.1286412753194461, 0.0023147034394706734, 0.0016863054441207976, 0.017833001439558818, 1.0812193729950996, 0.036315299290549496, 0.11539471335104651, 1.383495756843192, 0.4873678234333972, 0.46787311049606134, 0.20198603671337026, 1.090382249037431, 0.5451911245187155, 0.04614960738393718, 0.6843888584383876, 1.0812193729950996, 0.6185822374346964, 1.299647529155726, 0.10409798170422076, 0.49296975243837876, 0.2547823869037958, 0.8812678451124443, 0.01803295100019858, 1.0131110660347784, 0.001209235779274984, 0.8409484012184109, 0.0012497946107919151, 0.0027769646987334485, 0.014558169878526461, 0.014564761759838903, 0.5105758150254638, 0.008193142217678098, 0.007187191676148858, 0.015190685405716277, 1.2739119345189789, 0.5848413881200767, 1.0722092115534738, 1.4789092573151363, 0.5451911245187155, 0.8520867906385222, 0.005692390628961504, 0.5230288836846214, 0.005700461006885688, 0.016478625177563634, 0.3887163304725585, 1.0376218176323941, 0.016484959050149503, 0.010033931637402859, 0.01773223613373992, 0.00794032988067248, 0.0012141080951773235, 0.2180764498074862, 0.09391613531855246, 0.08459244272611234, 0.056038808966209434, 1.1696827762401534, 0.18539640545593208, 0.27433924389427905, 0.13864774287329404, 0.2985269266506192, 1.2614226018276162, 1.0051961358313817, 1.0460577673692428, 0.9323558361334555, 0.8812678451124443, 0.014738270949188644, 0.7704497328527956, 0.0027887618481135935, 0.022130221084695024, 0.01655708472351266, 0.5045690407310465, 0.07840652369678054, 0.8520867906385222, 0.047233885971518674, 1.2739119345189789, 0.13673231178152695, 0.09897315798955143, 0.31305378439517484, 1.159145093571323, 1.1286412753194461, 0.9125184779178501, 0.22772585024144576, 0.1273911934518979, 0.387545498151858, 0.7845433255269321, 1.029320843091335, 0.3852248664263978, 0.5594135016800733, 0.3729423344533822, 0.078026140319234, 0.05891259404139966, 0.6276346604215457, 0.09183804809879861, 0.09666799803637631, 0.8354876973143952, 0.06891542870188369, 0.06891542870188369, 0.1596341257895991, 0.5769735667552326, 0.5718449128285193, 1.5317274450763911, 0.05253781355100729, 1.4961058765862425, 1.4789092573151363, 1.1913435683927487, 0.11326153643170499, 0.0029835386756270578, 0.8464809564895847, 0.05275322074063832, 0.08081978981558847, 0.3333292885658468, 0.034991869835849024, 0.1889355438860747, 0.33246797257472055, 0.7991621452572476, 0.7030880075760484, 0.7108569358365573, 0.8300974541059153, 0.7148061410356492, 0.953074854714199, 0.9974039177241617, 0.953074854714199, 0.018012754499008382, 0.03763237946370777, 0.46116525228106403, 0.08258350795020337, 0.5294860303967772, 0.25888351184389713, 0.3200624512099922, 0.009566890132085424, 0.2068570826148181, 0.21881820643948446, 0.3249118822889315, 0.39589263195820573, 0.10219627115680449, 0.025233399761995855, 1.299647529155726, 0.1843339618716574, 1.3402615144418424, 0.06554513774142479, 0.7030880075760484, 0.3249118822889315, 0.9674068074166682, 0.25228452036552323, 0.8409484012184109, 0.8195229642446934, 1.3985337542001832, 0.1475517263605698, 0.4765374273570995, 0.10107235301368174, 0.6215705574223037, 0.6040615276357599, 1.4789092573151363, 1.0131110660347784, 1.0460577673692428, 1.0722092115534738, 0.5294860303967772, 1.3129092386369068, 0.28719889595182335, 0.22533293412682462, 0.706951128496796, 0.761331984535011, 0.32086061193620163, 0.761331984535011, 0.4391300525133681, 0.28216031882986153, 0.3946782373816468, 1.2491757804506491, 1.1487955838072934, 1.1188270033601466, 0.691747878421596, 0.10546320113640727, 0.13716962194713953, 0.489220933028201, 0.001681391286102438, 0.021312755571710595, 0.0156052280638468, 0.015396087757139746, 1.0211516300509276, 0.3041728259726167, 0.41910457780591814, 1.159145093571323, 0.006876441953204899, 0.006872401740541441, 0.13864774287329404, 0.07604320649315417, 0.05381225653969756, 0.7394546286575682, 0.08554860730479845, 0.9125184779178501, 0.13129092386369068, 0.10546320113640727, 1.3687777168767752, 0.41238815828979764, 0.04497207458455675, 0.21881820643948446, 1.4961058765862425, 0.46617791806672776, 0.7568535610965698, 1.4961058765862425, 1.3402615144418424, 1.0812193729950996, 1.383495756843192, 0.9747356468667944, 0.6215705574223037, 1.5317274450763911, 0.044659876913022166, 0.001852255922296684, 0.0019729977977767754, 0.129181832717286, 1.3985337542001832, 1.0546320113640726, 0.5338801053378293, 0.19494712937335887, 0.44520797711562926, 1.4456753414204142, 0.11246949771539935, 0.10713164478469347, 0.19825131800680565, 0.17086999387306356, 1.2024776204338024, 1.413902256993592, 1.413902256993592, 1.3129092386369068, 0.2985269266506192, 0.003683618351124191, 0.03282273096592267, 0.23099659853934804, 0.006007615697175929, 0.598442350634497, 0.33859238259583385, 0.023083083133551643, 0.040963102638146086, 0.17895007703256866, 0.47477898666574486, 0.9391613531855245, 0.9974039177241617, 0.40082587347793414, 0.54751108675071, 0.7704497328527956, 1.4456753414204142, 0.9674068074166682, 0.2615144418423107, 0.46617791806672776, 1.0722092115534738, 0.005503212377519969, 0.9460669513707122, 0.016121426561385398, 0.08092144992856407, 1.1487955838072934, 0.3829318612690978, 0.4837034037083341, 0.010034714193294093, 0.06996471201001461, 0.086121221811524, 0.19494712937335887, 0.30345543723211527, 1.213821748928461, 1.5690866510538641, 1.138629251207229, 0.23182901871426462, 1.1286412753194461, 1.3129092386369068, 0.14015806686973514, 0.9674068074166682, 0.649823764577863, 0.8693588201784923, 0.8812678451124443, 0.10235887461131016, 0.3200624512099922, 0.2827804513987184, 0.3729423344533822, 1.3402615144418424, 0.44063392255622214, 0.430318078215441, 1.0131110660347784, 1.0997017554394604, 0.10326252438717244, 0.5929267529327966, 1.0460577673692428, 0.5693146256036145, 0.3316110963567445, 0.8997559817231948, 0.5618563553992003, 1.2866510538641687, 1.3129092386369068, 1.3985337542001832, 0.17771423395913932, 1.0812193729950996, 0.8247763165795953, 0.21919098021536093, 1.2614226018276162, 1.1804138108845583, 1.2491757804506491, 1.0051961358313817, 0.8195229642446934, 0.7845433255269321, 0.28216031882986153, 0.9323558361334555, 1.1913435683927487, 1.1487955838072934, 0.5875118967416295, 0.5428907400270754, 1.4456753414204142, 0.5795725467856615, 1.2866510538641687, 1.0633479784001394, 0.22853482306645978, 0.07175967952393579, 1.138629251207229, 0.5498508777197302, 0.3863816978571077, 0.08107442053334396, 0.48009367681498827, 0.6531223623675982, 0.7568535610965698, 0.6701307572209212, 0.13035978255969288, 0.7480529382931213, 1.2371644748693928, 0.9821763769955486, 1.2866510538641687, 1.1804138108845583, 1.1804138108845583, 0.172242443623048, 0.5146604215456675, 0.4837034037083341, 0.7991621452572476, 1.1913435683927487, 0.6880486919059725, 0.010215570098167278, 0.7228376707102071, 1.4296122820712984, 1.3129092386369068, 0.5498508777197302, 1.2491757804506491, 0.680767753367285, 1.213821748928461, 0.05665570470559968, 0.5406096864975498, 0.706951128496796, 0.001250657141336504, 0.7845433255269321, 0.8464809564895847, 0.37621375843981536, 0.30345543723211527, 0.12789771907198494, 0.46617791806672776, 0.019036115606808235, 0.25630499080959535, 0.002561774124169574, 1.1091819429863523, 0.05827223975834097, 0.44520797711562926, 0.6564546193184534, 0.18566393273653226, 0.7187994714324965, 1.3402615144418424, 0.48009367681498827, 0.8464809564895847, 0.3232791592623539, 0.49870195886208085, 0.5105758150254638, 0.13746271942993255, 1.3543695303833354, 0.17796003511260977, 0.4514565101277785, 1.2371644748693928, 0.1760124560689697, 0.4421481284756593, 0.9391613531855245, 0.9674068074166682, 0.7480529382931213, 0.021803949396105214, 0.04333617561011009, 0.3282273096592267, 0.33246797257472055, 0.814336110040613, 0.3729423344533822, 0.6992668771000916, 0.020829707849508963, 0.5498508777197302, 1.4961058765862425, 1.413902256993592, 0.3593997357162482, 0.8520867906385222, 0.18921339027414244, 0.20921155347384857, 1.138629251207229, 0.0503778799476965, 0.18302290951126154, 1.413902256993592, 1.299647529155726, 0.7108569358365573, 0.5085577288000667, 0.9601873536299765, 0.5230288836846214, 1.0546320113640726, 0.7524275168796307, 0.5956717841963743, 0.615622513810607, 1.2491757804506491, 0.6433255269320843, 1.2614226018276162, 1.4961058765862425, 0.40846065202037096, 0.6245878902253246, 1.2024776204338024, 0.8935076762945615, 0.1736371192799148, 0.691747878421596, 0.9125184779178501, 0.20520750460353565, 1.213821748928461, 0.1955396738395393, 0.19524295202794667, 0.7148061410356492, 0.07869425405897056, 0.17746911087781636, 0.1784536829215213, 0.6992668771000916, 0.19613583138173302, 0.8354876973143952, 0.09904934979708765, 0.2985269266506192, 0.5105758150254638, 1.213821748928461, 1.1286412753194461, 0.9323558361334555, 0.1586499449894166, 0.25228452036552323, 0.061591721104077006, 0.5902069054422792, 0.6531223623675982, 0.02524330103716242, 0.010022207928526006, 0.2214545703724903, 0.043541490824506555, 1.413902256993592, 0.1213821748928461, 0.1326444385426978, 0.29783589209818717, 0.8464809564895847, 0.9060922914536399, 0.41238815828979764, 0.28655925475816674, 0.07352291736366678, 1.4789092573151363, 0.8409484012184109, 0.516727330869144, 0.3655258675750479, 0.35542846791827865, 1.3985337542001832, 1.5137071221931395, 1.0546320113640726, 0.1090382249037431, 0.1883822919274039, 1.3402615144418424, 0.489220933028201, 0.3934712702948528, 0.8693588201784923, 0.46958067659276226, 1.2024776204338024, 0.017396579960305147, 1.0376218176323941, 0.21956502625668406, 1.0997017554394604, 0.22415523586483774, 0.39589263195820573, 0.5718449128285193, 0.6771847651916677, 0.07050142760899554, 0.6992668771000916, 1.0211516300509276, 0.07061751118903231, 0.002227465771971969, 0.49486578994775715, 1.3402615144418424, 0.7942290455951658, 0.8520867906385222, 1.4961058765862425, 1.0812193729950996, 1.0633479784001394, 0.161234467902778, 1.1804138108845583, 0.9391613531855245, 0.5693146256036145, 0.1546455593586741, 1.4621034703001916, 1.4789092573151363, 0.39589263195820573, 1.1487955838072934, 0.22376540067202932, 0.11581017586536171, 0.9060922914536399, 0.3593997357162482, 1.326444385426978, 0.6771847651916677, 0.006941363044152831, 0.9674068074166682, 0.041252037635914354, 0.31381733021077285, 0.9256482401900493, 0.4873678234333972, 1.4961058765862425, 1.4296122820712984, 0.4274588218817836, 1.0546320113640726, 0.4246373115063263, 0.30132343181830645, 0.43763641287896893, 1.0211516300509276, 0.13909741122855876, 0.9391613531855245, 0.193772749075929, 0.054243299066786196, 0.4644949652939237, 1.4621034703001916, 0.21551943950823596, 0.13486908321427343, 0.7108569358365573, 1.029320843091335, 0.9601873536299765, 1.383495756843192, 1.213821748928461, 0.20294180660318117, 0.9190364670458347, 0.7437289328694616, 1.0633479784001394, 0.8520867906385222, 1.2371644748693928, 1.0546320113640726, 1.628672220081226, 0.3333292885658468, 0.7148061410356492, 0.09035470883877589, 0.8041569086651054, 0.5594135016800733, 0.02351765772005426]
\ No newline at end of file
+ data: [0.7269214993582873, 0.8409484012184109, 0.27551414429639587, 1.2614226018276162, 0.06103657750778788, 1.1091819429863523, 0.004043529396179034, 1.4961058765862425, 0.5230288836846214, 1.4961058765862425, 0.6433255269320843, 0.41639192681688303, 0.1760124560689697, 1.0997017554394604, 0.9060922914536399, 0.15154900516656875, 0.1883822919274039, 0.03447618043580302, 0.6954870561427938, 1.5137071221931395, 0.24790964428982054, 1.1487955838072934, 0.030583576274403817, 0.015282706424327932, 0.7704497328527956, 0.03311843124489495, 0.8873455543890818, 0.615622513810607, 1.029320843091335, 0.21881820643948446, 0.6736392952168422, 0.10235887461131016, 0.03832740702604017, 0.11612374132348093, 0.19855726139879146, 0.2335119879971268, 0.007641807055082073, 0.615622513810607, 0.09054546473357977, 1.0633479784001394, 0.9125184779178501, 0.2992211753172485, 0.40588361320636235, 0.07559641914595586, 1.3687777168767752, 0.9974039177241617, 1.1091819429863523, 0.3092911187173482, 1.4621034703001916, 0.1745795188418139, 0.47477898666574486, 0.1967356351474264, 0.18224519176546297, 1.413902256993592, 0.4713007523311973, 0.06615172513440455, 0.49296975243837876, 0.21196887213577736, 0.5618563553992003, 0.5025980679156908, 0.11316192206369118, 0.7568535610965698, 0.22415523586483774, 0.48009367681498827, 0.01856371452696824, 0.8354876973143952, 0.1706433758440542, 1.4789092573151363, 0.1769808877392254, 0.023848953732422032, 0.41238815828979764, 1.0997017554394604, 1.413902256993592, 0.17270483944485485, 0.0967406807416668, 0.08922684146076065, 1.2371644748693928, 0.20719018580743456, 0.12764395375636595, 1.2739119345189789, 0.3496334385500458, 0.5743977919036467, 1.090382249037431, 1.3402615144418424, 0.6401249024199844, 1.3402615144418424, 0.2852884820097935, 0.05942960987825259, 0.14343935940514702, 0.08526514604798997, 0.08520867906385222, 0.28719889595182335, 0.8635241972242742, 0.0011988251251925615, 0.40588361320636235, 0.2985269266506192, 0.019120984601934444, 0.6276346604215457, 0.7524275168796307, 1.3543695303833354, 0.8300974541059153, 0.7148061410356492, 1.2614226018276162, 0.15190685405716275, 1.4456753414204142, 0.3048936146597556, 0.32166276346604217, 0.1376097383811945, 0.30345543723211527, 1.1696827762401534, 1.3687777168767752, 1.0997017554394604, 0.8520867906385222, 0.7893564747632936, 0.28340331582911205, 0.10940910321974223, 1.4456753414204142, 0.25630499080959535, 1.2866510538641687, 0.18566393273653226, 0.5821950469973614, 1.0997017554394604, 0.36761458681833387, 0.5569917982095968, 0.8409484012184109, 1.0376218176323941, 0.7524275168796307, 1.2614226018276162, 0.043704179818755726, 0.1373160142864641, 0.5230288836846214, 0.00117096018735363, 0.05611212620428123, 0.8195229642446934, 0.031974429767996235, 1.0546320113640726, 0.3910793476790786, 0.004047217935466542, 0.7394546286575682, 1.4961058765862425, 0.14392069953737904, 0.008958094088032923, 0.23099659853934804, 1.413902256993592, 1.213821748928461, 0.13075722092115535, 0.953074854714199, 1.0460577673692428, 0.7352291736366677, 0.35444932613337976, 1.2739119345189789, 0.35444932613337976, 0.761331984535011, 0.09799322573222914, 0.017727349874127427, 1.0722092115534738, 0.18354508614324802, 1.3985337542001832, 0.8300974541059153, 0.09645060373794367, 0.9821763769955486, 0.12047294511836784, 0.013122397285713091, 1.0131110660347784, 0.8409484012184109, 0.03119154069973742, 0.4765374273570995, 0.28978627339283075, 0.01912382660321297, 0.06924924940065492, 0.6338182531350585, 0.43467941008924615, 0.9190364670458347, 0.5769735667552326, 0.8195229642446934, 0.23915447097847, 0.002221965001665058, 0.03485914532278972, 0.26805230288836845, 0.6598210532636762, 0.16974288309553676, 0.12230523325705026, 0.20455501651258642, 0.5025980679156908, 0.4137141652296362, 0.12218908393771782, 0.5743977919036467, 0.0489220933028201, 0.016487071423169766, 0.019491759640420672, 0.05249494303811377, 0.02473377650642385, 0.01422185314318745, 0.022768555191367345, 0.20955228890295907, 0.02262044750112814, 1.3543695303833354, 0.033332928856584676, 1.326444385426978, 0.2992211753172485, 0.0017904968742891297, 0.9974039177241617, 0.54751108675071, 0.47830894195694, 0.13557966847883757, 1.138629251207229, 0.6369559672594894, 0.08670155349489007, 0.022688256989317028, 0.015679393783380072, 0.01524287470517911, 0.1883822919274039, 0.17746911087781636, 0.2026222132069557, 0.12431411148446074, 0.2249389954307987, 0.24230716645276246, 1.029320843091335, 1.1188270033601466, 1.3402615144418424, 0.6069108744642305, 1.029320843091335, 1.4296122820712984, 0.8935076762945615, 0.1552051934697429, 0.16328059059189956, 0.10195333231887231, 0.47830894195694, 0.26583699460003485, 0.07132212050244838, 0.6771847651916677, 0.08972462021367981, 0.10227750825629321, 0.8520867906385222, 1.1804138108845583, 0.15353831191696524, 0.14621034703001917, 1.225381956061113, 0.3333292885658468, 1.413902256993592, 0.5294860303967772, 0.15427470669834156, 1.3402615144418424, 0.6598210532636762, 0.5569917982095968, 0.3740264691465606, 0.37621375843981536, 0.0751987757956849, 0.649823764577863, 0.7991621452572476, 0.3806659922675055, 1.2866510538641687, 0.08184803141629571, 0.22533293412682462, 0.18512964803800988, 0.24601358582488883, 0.017105172213030692, 1.1188270033601466, 0.7269214993582873, 0.03403838766836425, 0.9747356468667944, 0.1862013102553066, 0.7704497328527956, 0.26365800284101815, 0.538347721282079, 1.090382249037431, 0.1802032288325166, 0.5273160056820363, 0.05383477212820789, 1.0051961358313817, 1.2491757804506491, 1.0812193729950996, 0.4873678234333972, 0.5902069054422792, 0.017734680273799704, 0.5718449128285193, 0.17041735812770445, 1.0812193729950996, 1.2866510538641687, 1.326444385426978, 0.05845756719055741, 0.48189178047347137, 0.6126909780305565, 0.1710972146095969, 0.5643206376597231, 0.5316739892000697, 0.04112019986782258, 0.43321584305190863, 0.039024903059271115, 0.7030880075760484, 0.8693588201784923, 0.07826344609879371, 0.7187994714324965, 0.03933509794754413, 1.5884580911903317, 1.0546320113640726, 0.21444184231069477, 0.2652888770853956, 0.004796820094188452, 0.7797885174934355, 0.8041569086651054, 0.22853482306645978, 0.010909369627473025, 0.7991621452572476, 0.10713164478469347, 0.09426015046623946, 0.7310517351500958, 0.6736392952168422, 0.005066951734195127, 0.7352291736366677, 0.5618563553992003, 0.020504399264767628, 0.034338165301952724, 0.0015163652212279981, 0.3100363985214864, 1.1286412753194461, 0.0023147034394706734, 0.0016863054441207976, 0.017833001439558818, 1.0812193729950996, 0.036315299290549496, 0.11539471335104651, 1.383495756843192, 0.4873678234333972, 0.46787311049606134, 0.20198603671337026, 1.090382249037431, 0.5451911245187155, 0.04614960738393718, 0.6843888584383876, 1.0812193729950996, 0.6185822374346964, 1.299647529155726, 0.10409798170422076, 0.49296975243837876, 0.2547823869037958, 0.8812678451124443, 0.01803295100019858, 1.0131110660347784, 0.001209235779274984, 0.8409484012184109, 0.0012497946107919151, 0.0027769646987334485, 0.014558169878526461, 0.014564761759838903, 0.5105758150254638, 0.008193142217678098, 0.007187191676148858, 0.015190685405716277, 1.2739119345189789, 0.5848413881200767, 1.0722092115534738, 1.4789092573151363, 0.5451911245187155, 0.8520867906385222, 0.005692390628961504, 0.5230288836846214, 0.005700461006885688, 0.016478625177563634, 0.3887163304725585, 1.0376218176323941, 0.016484959050149503, 0.010033931637402859, 0.01773223613373992, 0.00794032988067248, 0.0012141080951773235, 0.2180764498074862, 0.09391613531855246, 0.08459244272611234, 0.056038808966209434, 1.1696827762401534, 0.18539640545593208, 0.27433924389427905, 0.13864774287329404, 0.2985269266506192, 1.2614226018276162, 1.0051961358313817, 1.0460577673692428, 0.9323558361334555, 0.8812678451124443, 0.014738270949188644, 0.7704497328527956, 0.0027887618481135935, 0.022130221084695024, 0.01655708472351266, 0.5045690407310465, 0.07840652369678054, 0.8520867906385222, 0.047233885971518674, 1.2739119345189789, 0.13673231178152695, 0.09897315798955143, 0.31305378439517484, 1.159145093571323, 1.1286412753194461, 0.9125184779178501, 0.22772585024144576, 0.1273911934518979, 0.387545498151858, 0.7845433255269321, 1.029320843091335, 0.3852248664263978, 0.5594135016800733, 0.3729423344533822, 0.078026140319234, 0.05891259404139966, 0.6276346604215457, 0.09183804809879861, 0.09666799803637631, 0.8354876973143952, 0.06891542870188369, 0.06891542870188369, 0.1596341257895991, 0.5769735667552326, 0.5718449128285193, 1.5317274450763911, 0.05253781355100729, 1.4961058765862425, 1.4789092573151363, 1.1913435683927487, 0.11326153643170499, 0.0029835386756270578, 0.8464809564895847, 0.05275322074063832, 0.08081978981558847, 0.3333292885658468, 0.034991869835849024, 0.1889355438860747, 0.33246797257472055, 0.7991621452572476, 0.7030880075760484, 0.7108569358365573, 0.8300974541059153, 0.7148061410356492, 0.953074854714199, 0.9974039177241617, 0.953074854714199, 0.018012754499008382, 0.03763237946370777, 0.46116525228106403, 0.08258350795020337, 0.5294860303967772, 0.25888351184389713, 0.3200624512099922, 0.009566890132085424, 0.2068570826148181, 0.21881820643948446, 0.3249118822889315, 0.39589263195820573, 0.10219627115680449, 0.025233399761995855, 1.299647529155726, 0.1843339618716574, 1.3402615144418424, 0.06554513774142479, 0.7030880075760484, 0.3249118822889315, 0.9674068074166682, 0.25228452036552323, 0.8409484012184109, 0.8195229642446934, 1.3985337542001832, 0.1475517263605698, 0.4765374273570995, 0.10107235301368174, 0.6215705574223037, 0.6040615276357599, 1.4789092573151363, 1.0131110660347784, 1.0460577673692428, 1.0722092115534738, 0.5294860303967772, 1.3129092386369068, 0.28719889595182335, 0.22533293412682462, 0.706951128496796, 0.761331984535011, 0.32086061193620163, 0.761331984535011, 0.4391300525133681, 0.28216031882986153, 0.3946782373816468, 1.2491757804506491, 1.1487955838072934, 1.1188270033601466, 0.691747878421596, 0.10546320113640727, 0.13716962194713953, 0.489220933028201, 0.001681391286102438, 0.021312755571710595, 0.0156052280638468, 0.015396087757139746, 1.0211516300509276, 0.3041728259726167, 0.41910457780591814, 1.159145093571323, 0.006876441953204899, 0.006872401740541441, 0.13864774287329404, 0.07604320649315417, 0.05381225653969756, 0.7394546286575682, 0.08554860730479845, 0.9125184779178501, 0.13129092386369068, 0.10546320113640727, 1.3687777168767752, 0.41238815828979764, 0.04497207458455675, 0.21881820643948446, 1.4961058765862425, 0.46617791806672776, 0.7568535610965698, 1.4961058765862425, 1.3402615144418424, 1.0812193729950996, 1.383495756843192, 0.9747356468667944, 0.6215705574223037, 1.5317274450763911, 0.044659876913022166, 0.001852255922296684, 0.0019729977977767754, 0.129181832717286, 1.3985337542001832, 1.0546320113640726, 0.5338801053378293, 0.19494712937335887, 0.44520797711562926, 1.4456753414204142, 0.11246949771539935, 0.10713164478469347, 0.19825131800680565, 0.17086999387306356, 1.2024776204338024, 1.413902256993592, 1.413902256993592, 1.3129092386369068, 0.2985269266506192, 0.003683618351124191, 0.03282273096592267, 0.23099659853934804, 0.006007615697175929, 0.598442350634497, 0.33859238259583385, 0.023083083133551643, 0.040963102638146086, 0.17895007703256866, 0.47477898666574486, 0.9391613531855245, 0.9974039177241617, 0.40082587347793414, 0.54751108675071, 0.7704497328527956, 1.4456753414204142, 0.9674068074166682, 0.2615144418423107, 0.46617791806672776, 1.0722092115534738, 0.005503212377519969, 0.9460669513707122, 0.016121426561385398, 0.08092144992856407, 1.1487955838072934, 0.3829318612690978, 0.4837034037083341, 0.010034714193294093, 0.06996471201001461, 0.086121221811524, 0.19494712937335887, 0.30345543723211527, 1.213821748928461, 1.5690866510538641, 1.138629251207229, 0.23182901871426462, 1.1286412753194461, 1.3129092386369068, 0.14015806686973514, 0.9674068074166682, 0.649823764577863, 0.8693588201784923, 0.8812678451124443, 0.10235887461131016, 0.3200624512099922, 0.2827804513987184, 0.3729423344533822, 1.3402615144418424, 0.44063392255622214, 0.430318078215441, 1.0131110660347784, 1.0997017554394604, 0.10326252438717244, 0.5929267529327966, 1.0460577673692428, 0.5693146256036145, 0.3316110963567445, 0.8997559817231948, 0.5618563553992003, 1.2866510538641687, 1.3129092386369068, 1.3985337542001832, 0.17771423395913932, 1.0812193729950996, 0.8247763165795953, 0.21919098021536093, 1.2614226018276162, 1.1804138108845583, 1.2491757804506491, 1.0051961358313817, 0.8195229642446934, 0.7845433255269321, 0.28216031882986153, 0.9323558361334555, 1.1913435683927487, 1.1487955838072934, 0.5875118967416295, 0.5428907400270754, 1.4456753414204142, 0.5795725467856615, 1.2866510538641687, 1.0633479784001394, 0.22853482306645978, 0.07175967952393579, 1.138629251207229, 0.5498508777197302, 0.3863816978571077, 0.08107442053334396, 0.48009367681498827, 0.6531223623675982, 0.7568535610965698, 0.6701307572209212, 0.13035978255969288, 0.7480529382931213, 1.2371644748693928, 0.9821763769955486, 1.2866510538641687, 1.1804138108845583, 1.1804138108845583, 0.172242443623048, 0.5146604215456675, 0.4837034037083341, 0.7991621452572476, 1.1913435683927487, 0.6880486919059725, 0.010215570098167278, 0.7228376707102071, 1.4296122820712984, 1.3129092386369068, 0.5498508777197302, 1.2491757804506491, 0.680767753367285, 1.213821748928461, 0.05665570470559968, 0.5406096864975498, 0.706951128496796, 0.001250657141336504, 0.7845433255269321, 0.8464809564895847, 0.37621375843981536, 0.30345543723211527, 0.12789771907198494, 0.46617791806672776, 0.019036115606808235, 0.25630499080959535, 0.002561774124169574, 1.1091819429863523, 0.05827223975834097, 0.44520797711562926, 0.6564546193184534, 0.18566393273653226, 0.7187994714324965, 1.3402615144418424, 0.48009367681498827, 0.8464809564895847, 0.3232791592623539, 0.49870195886208085, 0.5105758150254638, 0.13746271942993255, 1.3543695303833354, 0.17796003511260977, 0.4514565101277785, 1.2371644748693928, 0.1760124560689697, 0.4421481284756593, 0.9391613531855245, 0.9674068074166682, 0.7480529382931213, 0.021803949396105214, 0.04333617561011009, 0.3282273096592267, 0.33246797257472055, 0.814336110040613, 0.3729423344533822, 0.6992668771000916, 0.020829707849508963, 0.5498508777197302, 1.4961058765862425, 1.413902256993592, 0.3593997357162482, 0.8520867906385222, 0.18921339027414244, 0.20921155347384857, 1.138629251207229, 0.0503778799476965, 0.18302290951126154, 1.413902256993592, 1.299647529155726, 0.7108569358365573, 0.5085577288000667, 0.9601873536299765, 0.5230288836846214, 1.0546320113640726, 0.7524275168796307, 0.5956717841963743, 0.615622513810607, 1.2491757804506491, 0.6433255269320843, 1.2614226018276162, 1.4961058765862425, 0.40846065202037096, 0.6245878902253246, 1.2024776204338024, 0.8935076762945615, 0.1736371192799148, 0.691747878421596, 0.9125184779178501, 0.20520750460353565, 1.213821748928461, 0.1955396738395393, 0.19524295202794667, 0.7148061410356492, 0.07869425405897056, 0.17746911087781636, 0.1784536829215213, 0.6992668771000916, 0.19613583138173302, 0.8354876973143952, 0.09904934979708765, 0.2985269266506192, 0.5105758150254638, 1.213821748928461, 1.1286412753194461, 0.9323558361334555, 0.1586499449894166, 0.25228452036552323, 0.061591721104077006, 0.5902069054422792, 0.6531223623675982, 0.02524330103716242, 0.010022207928526006, 0.2214545703724903, 0.043541490824506555, 1.413902256993592, 0.1213821748928461, 0.1326444385426978, 0.29783589209818717, 0.8464809564895847, 0.9060922914536399, 0.41238815828979764, 0.28655925475816674, 0.07352291736366678, 1.4789092573151363, 0.8409484012184109, 0.516727330869144, 0.3655258675750479, 0.35542846791827865, 1.3985337542001832, 1.5137071221931395, 1.0546320113640726, 0.1090382249037431, 0.1883822919274039, 1.3402615144418424, 0.489220933028201, 0.3934712702948528, 0.8693588201784923, 0.46958067659276226, 1.2024776204338024, 0.017396579960305147, 1.0376218176323941, 0.21956502625668406, 1.0997017554394604, 0.22415523586483774, 0.39589263195820573, 0.5718449128285193, 0.6771847651916677, 0.07050142760899554, 0.6992668771000916, 1.0211516300509276, 0.07061751118903231, 0.002227465771971969, 0.49486578994775715, 1.3402615144418424, 0.7942290455951658, 0.8520867906385222, 1.4961058765862425, 1.0812193729950996, 1.0633479784001394, 0.161234467902778, 1.1804138108845583, 0.9391613531855245, 0.5693146256036145, 0.1546455593586741, 1.4621034703001916, 1.4789092573151363, 0.39589263195820573, 1.1487955838072934, 0.22376540067202932, 0.11581017586536171, 0.9060922914536399, 0.3593997357162482, 1.326444385426978, 0.6771847651916677, 0.006941363044152831, 0.9674068074166682, 0.041252037635914354, 0.31381733021077285, 0.9256482401900493, 0.4873678234333972, 1.4961058765862425, 1.4296122820712984, 0.4274588218817836, 1.0546320113640726, 0.4246373115063263, 0.30132343181830645, 0.43763641287896893, 1.0211516300509276, 0.13909741122855876, 0.9391613531855245, 0.193772749075929, 0.054243299066786196, 0.4644949652939237, 1.4621034703001916, 0.21551943950823596, 0.13486908321427343, 0.7108569358365573, 1.029320843091335, 0.9601873536299765, 1.383495756843192, 1.213821748928461, 0.20294180660318117, 0.9190364670458347, 0.7437289328694616, 1.0633479784001394, 0.8520867906385222, 1.2371644748693928, 1.0546320113640726, 1.628672220081226, 0.3333292885658468, 0.7148061410356492, 0.09035470883877589, 0.8041569086651054, 0.5594135016800733, 0.02351765772005426]
diff --git a/configs/metrics/balanced-accuracy.yml b/configs/metrics/balanced-accuracy.yml
index 66c402d0..eb079ed1 100644
--- a/configs/metrics/balanced-accuracy.yml
+++ b/configs/metrics/balanced-accuracy.yml
@@ -2,4 +2,4 @@ class_path: torchmetrics.MetricCollection
init_args:
metrics:
balanced-accuracy:
- class_path: chebai.callbacks.epoch_metrics.BalancedAccuracy
\ No newline at end of file
+ class_path: chebai.callbacks.epoch_metrics.BalancedAccuracy
diff --git a/configs/metrics/micro-macro-f1.yml b/configs/metrics/micro-macro-f1.yml
index 7273bd4c..9cae1093 100644
--- a/configs/metrics/micro-macro-f1.yml
+++ b/configs/metrics/micro-macro-f1.yml
@@ -6,4 +6,4 @@ init_args:
init_args:
average: micro
macro-f1:
- class_path: chebai.callbacks.epoch_metrics.MacroF1
\ No newline at end of file
+ class_path: chebai.callbacks.epoch_metrics.MacroF1
diff --git a/configs/model/electra-for-pretraining.yml b/configs/model/electra-for-pretraining.yml
index bbdb4ead..80acd9a1 100644
--- a/configs/model/electra-for-pretraining.yml
+++ b/configs/model/electra-for-pretraining.yml
@@ -17,4 +17,4 @@ init_args:
max_position_embeddings: 1800
num_attention_heads: 8
num_hidden_layers: 6
- type_vocab_size: 1
\ No newline at end of file
+ type_vocab_size: 1
diff --git a/configs/model/electra.yml b/configs/model/electra.yml
index c7117b9c..c3cf2fdf 100644
--- a/configs/model/electra.yml
+++ b/configs/model/electra.yml
@@ -8,3 +8,4 @@ init_args:
num_attention_heads: 8
num_hidden_layers: 6
type_vocab_size: 1
+ hidden_size: 256
diff --git a/configs/model/electra_pretraining.yml b/configs/model/electra_pretraining.yml
index 7b78e48d..f480a792 100644
--- a/configs/model/electra_pretraining.yml
+++ b/configs/model/electra_pretraining.yml
@@ -15,4 +15,4 @@ init_args:
max_position_embeddings: 1800
num_attention_heads: 8
num_hidden_layers: 6
- type_vocab_size: 1
\ No newline at end of file
+ type_vocab_size: 1
diff --git a/configs/training/csv_logger.yml b/configs/training/csv_logger.yml
index ed14c4e7..86a94baa 100644
--- a/configs/training/csv_logger.yml
+++ b/configs/training/csv_logger.yml
@@ -1,3 +1,3 @@
class_path: lightning.pytorch.loggers.CSVLogger
init_args:
- save_dir: logs
\ No newline at end of file
+ save_dir: logs
diff --git a/configs/training/default_trainer.yml b/configs/training/default_trainer.yml
index ea2d0be9..91aa4244 100644
--- a/configs/training/default_trainer.yml
+++ b/configs/training/default_trainer.yml
@@ -2,4 +2,4 @@ min_epochs: 100
max_epochs: 100
default_root_dir: &default_root_dir logs
logger: csv_logger.yml
-callbacks: default_callbacks.yml
\ No newline at end of file
+callbacks: default_callbacks.yml
diff --git a/configs/training/early_stop_callbacks.yml b/configs/training/early_stop_callbacks.yml
index d766fce7..75c4597d 100644
--- a/configs/training/early_stop_callbacks.yml
+++ b/configs/training/early_stop_callbacks.yml
@@ -16,4 +16,4 @@
min_delta: 0.0
patience: 3
verbose: False
- mode: "min"
\ No newline at end of file
+ mode: "min"
diff --git a/configs/training/pretraining_callbacks.yml b/configs/training/pretraining_callbacks.yml
index 3d29d5a0..0862433e 100644
--- a/configs/training/pretraining_callbacks.yml
+++ b/configs/training/pretraining_callbacks.yml
@@ -9,4 +9,4 @@
init_args:
filename: 'per_{epoch}_{val_loss:.4f}'
every_n_epochs: 25
- save_top_k: -1
\ No newline at end of file
+ save_top_k: -1
diff --git a/configs/training/pretraining_trainer.yml b/configs/training/pretraining_trainer.yml
index 7390b29f..6c56870d 100644
--- a/configs/training/pretraining_trainer.yml
+++ b/configs/training/pretraining_trainer.yml
@@ -4,4 +4,4 @@ max_epochs: 100
default_root_dir: &default_root_dir logs
logger: csv_logger.yml
-callbacks: pretraining_callbacks.yml
\ No newline at end of file
+callbacks: pretraining_callbacks.yml
diff --git a/configs/training/single_class_callbacks.yml b/configs/training/single_class_callbacks.yml
index 188f1fc5..73f4a720 100644
--- a/configs/training/single_class_callbacks.yml
+++ b/configs/training/single_class_callbacks.yml
@@ -10,4 +10,4 @@
filename: 'per_{epoch:02d}_{val_loss:.4f}_{val_f1:.4f}'
every_n_epochs: 25
save_top_k: -1
-# difference to default_callbacks.yml: no macro-f1
\ No newline at end of file
+# difference to default_callbacks.yml: no macro-f1
diff --git a/configs/training/wandb_logger.yml b/configs/training/wandb_logger.yml
index b7c51418..b0dd8870 100644
--- a/configs/training/wandb_logger.yml
+++ b/configs/training/wandb_logger.yml
@@ -3,4 +3,4 @@ init_args:
save_dir: logs
project: 'chebai'
entity: 'chebai'
- log_model: 'all'
\ No newline at end of file
+ log_model: 'all'
diff --git a/docs/source/experiment.rst b/docs/source/experiment.rst
index 81f36b31..59aced74 100644
--- a/docs/source/experiment.rst
+++ b/docs/source/experiment.rst
@@ -1 +1 @@
-.. autoclass:: chebai.experiments.Experiment
\ No newline at end of file
+.. autoclass:: chebai.experiments.Experiment
diff --git a/docs/source/model.rst b/docs/source/model.rst
index 81f36b31..59aced74 100644
--- a/docs/source/model.rst
+++ b/docs/source/model.rst
@@ -1 +1 @@
-.. autoclass:: chebai.experiments.Experiment
\ No newline at end of file
+.. autoclass:: chebai.experiments.Experiment
diff --git a/setup.cfg b/setup.cfg
index f28e0e9a..034dc5b8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -4,4 +4,4 @@ from_first = True
line_length = 79
known_first_party = chem
default_section = THIRDPARTY
-skip = .tox,.eggs,ci/bootstrap.py,ci/templates,build,dist
\ No newline at end of file
+skip = .tox,.eggs,ci/bootstrap.py,ci/templates,build,dist
diff --git a/tests/testChebiData.py b/tests/testChebiData.py
index aeab27e1..5bf8d388 100644
--- a/tests/testChebiData.py
+++ b/tests/testChebiData.py
@@ -1,7 +1,6 @@
import unittest
-import os
-import torch
-import yaml
+
+from chebai.preprocessing.datasets.chebi import ChEBIOver50
class TestChebiData(unittest.TestCase):
@@ -10,48 +9,28 @@ class TestChebiData(unittest.TestCase):
def setUpClass(cls) -> None:
cls.getDataSplitsOverlaps()
- @classmethod
- def getChebiDataConfig(cls):
- """Import the respective class and instantiate with given version from the config"""
- CONFIG_FILE_NAME = "chebi50.yml"
- with open(
- os.path.join("configs", "data", f"{CONFIG_FILE_NAME}"), "r"
- ) as yaml_file:
- config = yaml.safe_load(yaml_file)
-
- class_path = config["class_path"]
- init_args = config.get("init_args", {})
-
- module, class_name = class_path.rsplit(".", 1)
- module = __import__(module, fromlist=[class_name])
- class_ = getattr(module, class_name)
-
- return class_(**init_args)
-
@classmethod
def getDataSplitsOverlaps(cls):
"""Get the overlap between data splits"""
- processed_path = os.path.join(
- os.getcwd(), cls.getChebiDataConfig().processed_dir
- )
- print(f"Checking Data from - {processed_path}")
+ chebi_class_obj = ChEBIOver50()
+ # Get the raw/processed data if missing
+ chebi_class_obj.prepare_data()
+ chebi_class_obj.setup()
- train_set = torch.load(os.path.join(processed_path, "train.pt"))
- val_set = torch.load(os.path.join(processed_path, "validation.pt"))
- test_set = torch.load(os.path.join(processed_path, "test.pt"))
+ train_set = chebi_class_obj.dynamic_split_dfs["train"]
+ val_set = chebi_class_obj.dynamic_split_dfs["validation"]
+ test_set = chebi_class_obj.dynamic_split_dfs["test"]
train_smiles, train_smiles_ids = cls.get_features_ids(train_set)
val_smiles, val_smiles_ids = cls.get_features_ids(val_set)
test_smiles, test_smiles_ids = cls.get_features_ids(test_set)
# ----- Get the overlap between data splits based on smiles tokens/features -----
-
cls.overlaps_train_val = cls.get_overlaps(train_smiles, val_smiles)
cls.overlaps_train_test = cls.get_overlaps(train_smiles, test_smiles)
cls.overlaps_val_test = cls.get_overlaps(val_smiles, test_smiles)
# ----- Get the overlap between data splits based on IDs -----
-
cls.overlaps_train_val_ids = cls.get_overlaps(train_smiles_ids, val_smiles_ids)
cls.overlaps_train_test_ids = cls.get_overlaps(
train_smiles_ids, test_smiles_ids
@@ -59,12 +38,10 @@ def getDataSplitsOverlaps(cls):
cls.overlaps_val_test_ids = cls.get_overlaps(val_smiles_ids, test_smiles_ids)
@staticmethod
- def get_features_ids(data_split):
+ def get_features_ids(data_split_df):
"""Returns SMILES features/tokens and SMILES IDs from the data"""
- smiles_features, smiles_ids = [], []
- for entry in data_split:
- smiles_features.append(entry["features"])
- smiles_ids.append(entry["ident"])
+ smiles_features = data_split_df["features"].tolist()
+ smiles_ids = data_split_df["ident"].tolist()
return smiles_features, smiles_ids
diff --git a/tests/testChebiDynamicDataSplits.py b/tests/testChebiDynamicDataSplits.py
new file mode 100644
index 00000000..d928c394
--- /dev/null
+++ b/tests/testChebiDynamicDataSplits.py
@@ -0,0 +1,148 @@
+import hashlib
+import unittest
+
+import numpy as np
+import pandas as pd
+
+from chebai.preprocessing.datasets.chebi import ChEBIOver50
+
+
+class TestChebiDynamicDataSplits(unittest.TestCase):
+ """Test dynamic splits implementation's consistency"""
+
+ @classmethod
+ def setUpClass(cls):
+ cls.chebi_50_v231 = ChEBIOver50(chebi_version=231)
+ cls.chebi_50_v231_vt200 = ChEBIOver50(
+ chebi_version=231, chebi_version_train=200
+ )
+ cls._generate_chebi_class_data(cls.chebi_50_v231)
+ cls._generate_chebi_class_data(cls.chebi_50_v231_vt200)
+
+ def testDynamicDataSplitsConsistency(self):
+ """Test Dynamic Data Splits consistency across every run"""
+
+ # Dynamic Data Splits in Run 1
+ train_hash_1, val_hash_1, test_hash_1 = self._get_hashed_splits()
+
+ self.chebi_50_v231.dynamic_df_train = None
+ # Dynamic Data Splits in Run 2
+ train_hash_2, val_hash_2, test_hash_2 = self._get_hashed_splits()
+
+ # Check all splits are matching in both runs
+ self.assertEqual(train_hash_1, train_hash_2, "Train data hashes do not match.")
+ self.assertEqual(val_hash_1, val_hash_2, "Validation data hashes do not match.")
+ self.assertEqual(test_hash_1, test_hash_2, "Test data hashes do not match.")
+
+ def test_same_ids_and_in_test_sets(self):
+ """Check if test sets of both classes have same IDs"""
+
+ v231_ids = set(self.chebi_50_v231.dynamic_split_dfs["test"]["ident"])
+ v231_vt200_ids = set(
+ self.chebi_50_v231_vt200.dynamic_split_dfs["test"]["ident"]
+ )
+
+ self.assertEqual(
+ v231_ids, v231_vt200_ids, "Test sets do not have the same IDs."
+ )
+
+ def test_labels_vector_size_in_test_sets(self):
+ """Check if test sets of both classes have different size/shape of labels"""
+
+ v231_labels_shape = len(
+ self.chebi_50_v231.dynamic_split_dfs["test"]["labels"].iloc[0]
+ )
+ v231_vt200_label_shape = len(
+ self.chebi_50_v231_vt200.dynamic_split_dfs["test"]["labels"].iloc[0]
+ )
+
+ self.assertEqual(
+ v231_labels_shape,
+ v231_vt200_label_shape,
+ "Test sets have the different size of labels",
+ )
+
+ def test_no_overlaps_in_chebi_v231_vt200(self):
+ """Test the overlaps for the ChEBIOver50(chebi_version=231, chebi_version_train=200)"""
+ train_set = self.chebi_50_v231_vt200.dynamic_split_dfs["train"]
+ val_set = self.chebi_50_v231_vt200.dynamic_split_dfs["validation"]
+ test_set = self.chebi_50_v231_vt200.dynamic_split_dfs["test"]
+
+ train_set_ids = train_set["ident"].tolist()
+ val_set_ids = val_set["ident"].tolist()
+ test_set_ids = test_set["ident"].tolist()
+
+ # ----- Get the overlap between data splits based on IDs -----
+ self.overlaps_train_val_ids = self.get_overlaps(train_set_ids, val_set_ids)
+ self.overlaps_train_test_ids = self.get_overlaps(train_set_ids, test_set_ids)
+ self.overlaps_val_test_ids = self.get_overlaps(val_set_ids, test_set_ids)
+
+ self.assertEqual(
+ len(self.overlaps_train_val_ids),
+ 0,
+ "Duplicate entities present in Train and Validation set based on IDs",
+ )
+ self.assertEqual(
+ len(self.overlaps_train_test_ids),
+ 0,
+ "Duplicate entities present in Train and Test set based on IDs",
+ )
+ self.assertEqual(
+ len(self.overlaps_val_test_ids),
+ 0,
+ "Duplicate entities present in Validation and Test set based on IDs",
+ )
+
+ def _get_hashed_splits(self):
+ """Returns hashed dynamic data splits"""
+
+ # Get the raw/processed data if missing
+ chebi_class_obj = self.chebi_50_v231
+
+ # Get dynamic splits from class variables
+ train_data = chebi_class_obj.dynamic_split_dfs["train"]
+ val_data = chebi_class_obj.dynamic_split_dfs["validation"]
+ test_data = chebi_class_obj.dynamic_split_dfs["test"]
+
+ # Get hashes for each split
+ train_hash = self.compute_hash(train_data)
+ val_hash = self.compute_hash(val_data)
+ test_hash = self.compute_hash(test_data)
+
+ return train_hash, val_hash, test_hash
+
+ @staticmethod
+ def compute_hash(data):
+ """Returns hash for the given data partition"""
+ data_for_hashing = data.map(TestChebiDynamicDataSplits.convert_to_hashable)
+ return hashlib.md5(
+ pd.util.hash_pandas_object(data_for_hashing, index=True).values
+ ).hexdigest()
+
+ @staticmethod
+ def convert_to_hashable(item):
+ """To Convert lists and numpy arrays within the DataFrame to tuples for hashing"""
+ if isinstance(item, list):
+ return tuple(item)
+ elif isinstance(item, np.ndarray):
+ return tuple(item.tolist())
+ else:
+ return item
+
+ @staticmethod
+ def _generate_chebi_class_data(chebi_class_obj):
+ # Get the raw/processed data if missing
+ chebi_class_obj.prepare_data()
+ chebi_class_obj.setup()
+
+ @staticmethod
+ def get_overlaps(list_1, list_2):
+ overlap = []
+ for element in list_1:
+ if element in list_2:
+ overlap.append(element)
+ return overlap
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/testCustomBalancedAccuracyMetric.py b/tests/testCustomBalancedAccuracyMetric.py
index b420fd83..d257114e 100644
--- a/tests/testCustomBalancedAccuracyMetric.py
+++ b/tests/testCustomBalancedAccuracyMetric.py
@@ -1,8 +1,10 @@
+import os
+import random
import unittest
+
import torch
-import os
+
from chebai.callbacks.epoch_metrics import BalancedAccuracy
-import random
class TestCustomBalancedAccuracyMetric(unittest.TestCase):
diff --git a/tests/testCustomMacroF1Metric.py b/tests/testCustomMacroF1Metric.py
index 6e208fa4..685f2901 100644
--- a/tests/testCustomMacroF1Metric.py
+++ b/tests/testCustomMacroF1Metric.py
@@ -1,9 +1,11 @@
+import os
+import random
import unittest
+
import torch
-import os
-from chebai.callbacks.epoch_metrics import MacroF1
from torchmetrics.classification import MultilabelF1Score
-import random
+
+from chebai.callbacks.epoch_metrics import MacroF1
class TestCustomMacroF1Metric(unittest.TestCase):
diff --git a/tests/testPubChemData.py b/tests/testPubChemData.py
index 40f91e2d..00dc8579 100644
--- a/tests/testPubChemData.py
+++ b/tests/testPubChemData.py
@@ -1,6 +1,8 @@
-import unittest
import os
+import unittest
+
import torch
+
from chebai.preprocessing.datasets.pubchem import PubChem
diff --git a/tests/testTox21MolNetData.py b/tests/testTox21MolNetData.py
index 484ed533..91e34e3d 100644
--- a/tests/testTox21MolNetData.py
+++ b/tests/testTox21MolNetData.py
@@ -1,6 +1,8 @@
-import unittest
import os
+import unittest
+
import torch
+
from chebai.preprocessing.datasets.tox21 import Tox21MolNetChem
diff --git a/tutorials/eval_model_basic.ipynb b/tutorials/eval_model_basic.ipynb
index 1bfa0f72..bc54464b 100644
--- a/tutorials/eval_model_basic.ipynb
+++ b/tutorials/eval_model_basic.ipynb
@@ -2,21 +2,28 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 2,
"id": "initial_id",
"metadata": {
- "collapsed": true,
"ExecuteTime": {
"end_time": "2024-04-02T13:47:31.150545Z",
"start_time": "2024-04-02T13:47:27.181585Z"
}
},
"outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "C:\\Users\\HP\\anaconda3\\envs\\env_chebai\\lib\\site-packages\\tqdm\\auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+ " from .autonotebook import tqdm as notebook_tqdm\n"
+ ]
+ },
{
"name": "stdout",
"output_type": "stream",
"text": [
- "cuda:0\n"
+ "cpu\n"
]
}
],
@@ -41,16 +48,39 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 3,
"id": "bdb5fc6919cf72be",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-02T13:47:35.484307Z",
"start_time": "2024-04-02T13:47:35.477111Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Check for processed data in data\\chebi_v231\\ChEBI50\\processed\\smiles_token\n",
+ "Cross-validation enabled: False\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Check for processed data in data\\chebi_v231\\ChEBI50\\processed\n",
+ "saving 771 tokens to C:\\Users\\HP\\Desktop\\github-aditya0by0\\python-chebai\\chebai\\preprocessing\\bin\\smiles_token\\tokens.txt...\n",
+ "first 10 tokens: ['[*-]', '[Al-]', '[F-]', '.', '[H]', '[N]', '(', ')', '[Ag+]', 'C']\n",
+ "Get test data split\n",
+ "Split dataset into train / val with given test set\n"
+ ]
+ }
+ ],
"source": [
"# specify the checkpoint name\n",
"checkpoint_name = \"my_trained_model\"\n",
@@ -59,77 +89,126 @@
"buffer_dir = os.path.join(\"results_buffer\", checkpoint_name, kind)\n",
"# make sure to use the same data module and model class that were used during training\n",
"data_module = ChEBIOver50(\n",
- " chebi_version=227,\n",
+ " chebi_version=231,\n",
")\n",
+ "# load chebi data if missing and perform dynamic splits\n",
+ "data_module.prepare_data()\n",
+ "data_module.setup()\n",
+ "\n",
"model_class = Electra"
]
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 5,
"id": "fa1276b47def696c",
"metadata": {
- "collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-02T13:47:38.418564Z",
"start_time": "2024-04-02T13:47:37.861168Z"
+ },
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
}
},
"outputs": [
{
- "ename": "FileNotFoundError",
- "evalue": "[Errno 2] No such file or directory: 'C:/Users/Simon Flügel/Desktop/chebai/tutorials/logs/best_epoch=99_val_loss=0.0096_val_macro-f1=0.5358_val_micro-f1=0.8968.ckpt'",
- "output_type": "error",
- "traceback": [
- "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[1;32mIn[3], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# evaluates model, stores results in buffer_dir\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mmodel_class\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_from_checkpoint\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcheckpoint_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m preds, labels \u001b[38;5;241m=\u001b[39m evaluate_model(\n\u001b[0;32m 4\u001b[0m model,\n\u001b[0;32m 5\u001b[0m data_module,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 8\u001b[0m batch_size\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m,\n\u001b[0;32m 9\u001b[0m )\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\lightning\\pytorch\\core\\module.py:1552\u001b[0m, in \u001b[0;36mLightningModule.load_from_checkpoint\u001b[1;34m(cls, checkpoint_path, map_location, hparams_file, strict, **kwargs)\u001b[0m\n\u001b[0;32m 1471\u001b[0m \u001b[38;5;129m@_restricted_classmethod\u001b[39m\n\u001b[0;32m 1472\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_from_checkpoint\u001b[39m(\n\u001b[0;32m 1473\u001b[0m \u001b[38;5;28mcls\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1478\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any,\n\u001b[0;32m 1479\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Self:\n\u001b[0;32m 1480\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"Primary way of loading a model from a checkpoint. When Lightning saves a checkpoint it stores the arguments\u001b[39;00m\n\u001b[0;32m 1481\u001b[0m \u001b[38;5;124;03m passed to ``__init__`` in the checkpoint under ``\"hyper_parameters\"``.\u001b[39;00m\n\u001b[0;32m 1482\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1550\u001b[0m \n\u001b[0;32m 1551\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m-> 1552\u001b[0m loaded \u001b[38;5;241m=\u001b[39m \u001b[43m_load_from_checkpoint\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1553\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[0;32m 1554\u001b[0m \u001b[43m \u001b[49m\u001b[43mcheckpoint_path\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1555\u001b[0m \u001b[43m \u001b[49m\u001b[43mmap_location\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1556\u001b[0m \u001b[43m \u001b[49m\u001b[43mhparams_file\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1557\u001b[0m \u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1558\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1559\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1560\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m cast(Self, loaded)\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\lightning\\pytorch\\core\\saving.py:61\u001b[0m, in \u001b[0;36m_load_from_checkpoint\u001b[1;34m(cls, checkpoint_path, map_location, hparams_file, strict, **kwargs)\u001b[0m\n\u001b[0;32m 59\u001b[0m map_location \u001b[38;5;241m=\u001b[39m map_location \u001b[38;5;129;01mor\u001b[39;00m _default_map_location\n\u001b[0;32m 60\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m pl_legacy_patch():\n\u001b[1;32m---> 61\u001b[0m checkpoint \u001b[38;5;241m=\u001b[39m \u001b[43mpl_load\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcheckpoint_path\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmap_location\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmap_location\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;66;03m# convert legacy checkpoints to the new format\u001b[39;00m\n\u001b[0;32m 64\u001b[0m checkpoint \u001b[38;5;241m=\u001b[39m _pl_migrate_checkpoint(\n\u001b[0;32m 65\u001b[0m checkpoint, checkpoint_path\u001b[38;5;241m=\u001b[39m(checkpoint_path \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(checkpoint_path, (\u001b[38;5;28mstr\u001b[39m, Path)) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 66\u001b[0m )\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\lightning\\fabric\\utilities\\cloud_io.py:54\u001b[0m, in \u001b[0;36m_load\u001b[1;34m(path_or_url, map_location)\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mhub\u001b[38;5;241m.\u001b[39mload_state_dict_from_url(\n\u001b[0;32m 50\u001b[0m \u001b[38;5;28mstr\u001b[39m(path_or_url),\n\u001b[0;32m 51\u001b[0m map_location\u001b[38;5;241m=\u001b[39mmap_location, \u001b[38;5;66;03m# type: ignore[arg-type]\u001b[39;00m\n\u001b[0;32m 52\u001b[0m )\n\u001b[0;32m 53\u001b[0m fs \u001b[38;5;241m=\u001b[39m get_filesystem(path_or_url)\n\u001b[1;32m---> 54\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mfs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath_or_url\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrb\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m f:\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mload(f, map_location\u001b[38;5;241m=\u001b[39mmap_location)\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\fsspec\\spec.py:1307\u001b[0m, in \u001b[0;36mAbstractFileSystem.open\u001b[1;34m(self, path, mode, block_size, cache_options, compression, **kwargs)\u001b[0m\n\u001b[0;32m 1305\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 1306\u001b[0m ac \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mautocommit\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_intrans)\n\u001b[1;32m-> 1307\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_open\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1308\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1309\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1310\u001b[0m \u001b[43m \u001b[49m\u001b[43mblock_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mblock_size\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1311\u001b[0m \u001b[43m \u001b[49m\u001b[43mautocommit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mac\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1312\u001b[0m \u001b[43m \u001b[49m\u001b[43mcache_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1313\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 1314\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1315\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m compression \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 1316\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfsspec\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcompression\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m compr\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\fsspec\\implementations\\local.py:180\u001b[0m, in \u001b[0;36mLocalFileSystem._open\u001b[1;34m(self, path, mode, block_size, **kwargs)\u001b[0m\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mauto_mkdir \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[0;32m 179\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmakedirs(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent(path), exist_ok\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m--> 180\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mLocalFileOpener\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\fsspec\\implementations\\local.py:302\u001b[0m, in \u001b[0;36mLocalFileOpener.__init__\u001b[1;34m(self, path, mode, autocommit, fs, compression, **kwargs)\u001b[0m\n\u001b[0;32m 300\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompression \u001b[38;5;241m=\u001b[39m get_compression(path, compression)\n\u001b[0;32m 301\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mblocksize \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mDEFAULT_BUFFER_SIZE\n\u001b[1;32m--> 302\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_open\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\fsspec\\implementations\\local.py:307\u001b[0m, in \u001b[0;36mLocalFileOpener._open\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 305\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mf \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mf\u001b[38;5;241m.\u001b[39mclosed:\n\u001b[0;32m 306\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mautocommit \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mw\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m--> 307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mf \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 308\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompression:\n\u001b[0;32m 309\u001b[0m compress \u001b[38;5;241m=\u001b[39m compr[\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompression]\n",
- "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:/Users/Simon Flügel/Desktop/chebai/tutorials/logs/best_epoch=99_val_loss=0.0096_val_macro-f1=0.5358_val_micro-f1=0.8968.ckpt'"
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|████████████████████████████████| 10/10 [00:06<00:00, 1.54it/s]\n"
]
}
],
"source": [
"# evaluates model, stores results in buffer_dir\n",
"model = model_class.load_from_checkpoint(checkpoint_path)\n",
- "preds, labels = evaluate_model(\n",
- " model,\n",
- " data_module,\n",
- " buffer_dir=buffer_dir,\n",
- " filename=data_module.processed_file_names_dict[kind],\n",
- " batch_size=10,\n",
- ")"
+ "if buffer_dir is None:\n",
+ " preds, labels = evaluate_model(\n",
+ " model,\n",
+ " data_module,\n",
+ " buffer_dir=buffer_dir,\n",
+ " # No need to provide this parameter for Chebi dataset, \"kind\" parameter should be provided\n",
+ " # filename=data_module.processed_file_names_dict[kind],\n",
+ " batch_size=10,\n",
+ " kind=kind,\n",
+ " )\n",
+ "else:\n",
+ " evaluate_model(\n",
+ " model,\n",
+ " data_module,\n",
+ " buffer_dir=buffer_dir,\n",
+ " # No need to provide this parameter for Chebi dataset, \"kind\" parameter should be provided\n",
+ " # filename=data_module.processed_file_names_dict[kind],\n",
+ " batch_size=10,\n",
+ " kind=kind,\n",
+ " )\n",
+ " # load data from buffer_dir\n",
+ " preds, labels = load_results_from_buffer(buffer_dir, device=DEVICE)"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"id": "201f750c475b4677",
"metadata": {
- "collapsed": false
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ }
},
"outputs": [],
"source": [
- "# load data from buffer_dir\n",
- "load_results_from_buffer(buffer_dir, device=DEVICE)\n",
- "with open(os.path.join(data_module.raw_dir, \"classes.txt\"), \"r\") as f:\n",
+ "# Load classes from the classes.txt\n",
+ "with open(os.path.join(data_module.processed_dir_main, \"classes.txt\"), \"r\") as f:\n",
" classes = [line.strip() for line in f.readlines()]"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 8,
"id": "e567cd2fb1718baf",
"metadata": {
- "collapsed": false
+ "collapsed": false,
+ "jupyter": {
+ "outputs_hidden": false
+ }
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Macro-F1: 0.290936\n",
+ "Micro-F1: 0.890380\n",
+ "Balanced Accuracy: 0.507610\n",
+ "Macro-Precision: 0.021964\n",
+ "Micro-Precision: 0.908676\n",
+ "Macro-Recall: 0.020987\n",
+ "Micro-Recall: 0.872807\n",
+ "Top 10 classes (F1-score):\n",
+ "1. 23367 - F1: 1.000000\n",
+ "2. 33259 - F1: 1.000000\n",
+ "3. 36914 - F1: 1.000000\n",
+ "4. 24431 - F1: 1.000000\n",
+ "5. 33238 - F1: 1.000000\n",
+ "6. 36357 - F1: 1.000000\n",
+ "7. 37577 - F1: 1.000000\n",
+ "8. 24867 - F1: 1.000000\n",
+ "9. 33579 - F1: 0.974026\n",
+ "10. 24866 - F1: 0.973684\n",
+ "Found 63 classes with F1-score == 0 (and non-zero labels): 17792, 22563, 22632, 22712, 24062, 24834, 25108, 25693, 25697, 25698, 25699, 25806, 26151, 26217, 26218, 26421, 26469, 29347, 32988, 33240, 33256, 33296, 33299, 33304, 33597, 33598, 33635, 33655, 33659, 33661, 33670, 33671, 33836, 33976, 35217, 35273, 35479, 35618, 36364, 36562, 36916, 36962, 36963, 37141, 37143, 37622, 37929, 37960, 38101, 38104, 38166, 38835, 39203, 46850, 47704, 47916, 48592, 50047, 50995, 72544, 79389, 83565, 139358\n"
+ ]
+ }
+ ],
"source": [
"# output relevant metrics\n",
"print_metrics(\n",
@@ -145,21 +224,21 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
- "version": 2
+ "version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
- "pygments_lexer": "ipython2",
- "version": "3.8.13"
+ "pygments_lexer": "ipython3",
+ "version": "3.10.14"
}
},
"nbformat": 4,