gbyuvd commited on
Commit
c2f7900
·
verified ·
1 Parent(s): 99ed969

Update to use proper gbyuvd's tokenizer for ChemFIE-SA

Browse files
Files changed (3) hide show
  1. ChemQ3MTP.py +7 -2
  2. demo_eval-SA.ipynb +20 -112
  3. train_ppokl_withsa.py +15 -15
ChemQ3MTP.py CHANGED
@@ -42,14 +42,19 @@ def is_valid_smiles(smiles: str) -> bool:
42
  return Chem.MolFromSmiles(smiles.strip()) is not None
43
 
44
  # SA Classifier
45
- from transformers import pipeline
46
 
47
  # Optional: lazy load so we don’t reload every time
48
  _sa_classifier = None
49
  def get_sa_classifier():
50
  global _sa_classifier
51
  if _sa_classifier is None:
52
- _sa_classifier = pipeline("text-classification", model="gbyuvd/synthaccess-chemselfies")
 
 
 
 
 
53
  return _sa_classifier
54
 
55
 
 
42
  return Chem.MolFromSmiles(smiles.strip()) is not None
43
 
44
  # SA Classifier
45
+ from transformers import pipeline, AutoTokenizer
46
 
47
  # Optional: lazy load so we don’t reload every time
48
  _sa_classifier = None
49
  def get_sa_classifier():
50
  global _sa_classifier
51
  if _sa_classifier is None:
52
+ sa_tokenizer = AutoTokenizer.from_pretrained("gbyuvd/synthaccess-chemselfies")
53
+ _sa_classifier = pipeline(
54
+ "text-classification",
55
+ model="gbyuvd/synthaccess-chemselfies",
56
+ tokenizer=sa_tokenizer
57
+ )
58
  return _sa_classifier
59
 
60
 
demo_eval-SA.ipynb CHANGED
@@ -2,103 +2,10 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 3,
6
  "id": "44a2331f",
7
  "metadata": {},
8
  "outputs": [
9
- {
10
- "data": {
11
- "application/vnd.jupyter.widget-view+json": {
12
- "model_id": "3018b4637c064818ba53df02f86f52e0",
13
- "version_major": 2,
14
- "version_minor": 0
15
- },
16
- "text/plain": [
17
- "config.json: 0%| | 0.00/759 [00:00<?, ?B/s]"
18
- ]
19
- },
20
- "metadata": {},
21
- "output_type": "display_data"
22
- },
23
- {
24
- "name": "stderr",
25
- "output_type": "stream",
26
- "text": [
27
- "d:\\ProgramData\\miniconda3\\Lib\\site-packages\\huggingface_hub\\file_download.py:143: UserWarning: `huggingface_hub` cache-system uses symlinks by default to efficiently store duplicated files but your machine does not support them in C:\\Users\\mori\\.cache\\huggingface\\hub\\models--gbyuvd--synthaccess-chemselfies. Caching files will still work but in a degraded version that might require more space on your disk. This warning can be disabled by setting the `HF_HUB_DISABLE_SYMLINKS_WARNING` environment variable. For more details, see https://huggingface.co/docs/huggingface_hub/how-to-cache#limitations.\n",
28
- "To support symlinks on Windows, you either need to activate Developer Mode or to run Python as an administrator. In order to activate developer mode, see this article: https://docs.microsoft.com/en-us/windows/apps/get-started/enable-your-device-for-development\n",
29
- " warnings.warn(message)\n"
30
- ]
31
- },
32
- {
33
- "data": {
34
- "application/vnd.jupyter.widget-view+json": {
35
- "model_id": "1a85faccd7a34c1abe3cea650d2f7aef",
36
- "version_major": 2,
37
- "version_minor": 0
38
- },
39
- "text/plain": [
40
- "model.safetensors: 0%| | 0.00/44.5M [00:00<?, ?B/s]"
41
- ]
42
- },
43
- "metadata": {},
44
- "output_type": "display_data"
45
- },
46
- {
47
- "data": {
48
- "application/vnd.jupyter.widget-view+json": {
49
- "model_id": "a137227d00fb452d85fe479446538c75",
50
- "version_major": 2,
51
- "version_minor": 0
52
- },
53
- "text/plain": [
54
- "tokenizer_config.json: 0.00B [00:00, ?B/s]"
55
- ]
56
- },
57
- "metadata": {},
58
- "output_type": "display_data"
59
- },
60
- {
61
- "data": {
62
- "application/vnd.jupyter.widget-view+json": {
63
- "model_id": "6c601ab728b8447596de0e8425607c2d",
64
- "version_major": 2,
65
- "version_minor": 0
66
- },
67
- "text/plain": [
68
- "vocab.txt: 0.00B [00:00, ?B/s]"
69
- ]
70
- },
71
- "metadata": {},
72
- "output_type": "display_data"
73
- },
74
- {
75
- "data": {
76
- "application/vnd.jupyter.widget-view+json": {
77
- "model_id": "4a3dff08f8d34759a729baf714c53109",
78
- "version_major": 2,
79
- "version_minor": 0
80
- },
81
- "text/plain": [
82
- "tokenizer.json: 0.00B [00:00, ?B/s]"
83
- ]
84
- },
85
- "metadata": {},
86
- "output_type": "display_data"
87
- },
88
- {
89
- "data": {
90
- "application/vnd.jupyter.widget-view+json": {
91
- "model_id": "503d8f553b804a60a2ddf554a1f2dd55",
92
- "version_major": 2,
93
- "version_minor": 0
94
- },
95
- "text/plain": [
96
- "special_tokens_map.json: 0%| | 0.00/695 [00:00<?, ?B/s]"
97
- ]
98
- },
99
- "metadata": {},
100
- "output_type": "display_data"
101
- },
102
  {
103
  "name": "stderr",
104
  "output_type": "stream",
@@ -110,30 +17,32 @@
110
  "source": [
111
  "from FastChemTokenizerHF import FastChemTokenizerSelfies\n",
112
  "from ChemQ3MTP import ChemQ3MTP\n",
113
- "from transformers import pipeline\n",
114
  "from tqdm import tqdm\n",
115
  "import torch, random\n",
116
  "\n",
117
- "# --- Load tokenizer ---\n",
118
- "tokenizer = FastChemTokenizerSelfies.from_pretrained(\"../selftok_core\")\n",
119
  "\n",
120
  "# --- Load model checkpoint ---\n",
121
  "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
122
  "model = ChemQ3MTP.from_pretrained('./model_step_7000').to(device)\n",
123
- "model.tokenizer = tokenizer\n",
124
  "model.eval()\n",
125
  "\n",
126
- "# --- Load SA classifier ---\n",
 
127
  "sa_classifier = pipeline(\n",
128
- " \"text-classification\", \n",
129
- " model=\"gbyuvd/synthaccess-chemselfies\", \n",
130
- " device=0 if device==\"cuda\" else -1\n",
 
131
  ")\n"
132
  ]
133
  },
134
  {
135
  "cell_type": "code",
136
- "execution_count": 4,
137
  "id": "00cc536e",
138
  "metadata": {},
139
  "outputs": [
@@ -141,14 +50,14 @@
141
  "name": "stderr",
142
  "output_type": "stream",
143
  "text": [
144
- "Generating: 100%|██████████| 10/10 [00:07<00:00, 1.39it/s]"
145
  ]
146
  },
147
  {
148
  "name": "stdout",
149
  "output_type": "stream",
150
  "text": [
151
- "Sample SELFIES: ['[Branch1] [C] [=Branch1] [C] [=C] [N] [Branch1] [Branch2] [C] [=C] [C] [=C] [S] [Ring1] [Branch1] [N] [=C] [C] [=C] [C] [=C] [C] [C] [Ring1] [=Branch1]', '[=N+1] [=C] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1] [C] [=C] [C] [=C] [Ring1] [=Branch2] [C] [C] [Ring1] [=N] [N] [C] [=Branch1] [C] [=O] [C] [N] [C] [=Branch1] [C] [=O] [C@H1] [C] [C] [C]', '[Branch1] [P] [C] [=C] [C] [=C] [Branch1] [=Branch1] [C] [C] [C] [Ring1] [Branch1] [C] [=C] [Ring1] [=Branch2] [N] [C] [=C] [C] [=C] [C] [=C] [Ring1]', '[=Branch2] [Ring1] [C] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1] [C] [N] [Branch1] [P] [C] [C] [C] [C] [C] [C] [=Branch1] [C] [=C] [C] [C] [Ring1] [Ring2] [O] [Ring1] [=C]', '[N] [=C] [S] [Ring1] [Branch1] [N] [C] [C] [C] [/C] [=C] [\\\\C] [C] [N] [Branch2] [Branch1] [#Branch2] [C] [=C] [C] [=C] [C] [=C] [C] [=C] [C] [S] [C]']\n"
152
  ]
153
  },
154
  {
@@ -177,14 +86,13 @@
177
  " all_samples.extend(selfies_list)\n",
178
  " return all_samples\n",
179
  "\n",
180
- "# Generate 100 samples\n",
181
- "selfies_samples = generate_batch(model, tokenizer, total_samples=100)\n",
182
  "print(\"Sample SELFIES:\", selfies_samples[:5])\n"
183
  ]
184
  },
185
  {
186
  "cell_type": "code",
187
- "execution_count": 5,
188
  "id": "07390f52",
189
  "metadata": {},
190
  "outputs": [
@@ -192,14 +100,14 @@
192
  "name": "stderr",
193
  "output_type": "stream",
194
  "text": [
195
- "Classifying (SA): 100%|██████████| 7/7 [00:02<00:00, 2.55it/s]"
196
  ]
197
  },
198
  {
199
  "name": "stdout",
200
  "output_type": "stream",
201
  "text": [
202
- "SA Evaluation: {'total': 100, 'easy_count': 41, 'easy_fraction': 0.41, 'avg_score': 0.8243998199701309, 'details': [{'label': 'Hard', 'score': 0.9941728711128235}, {'label': 'Easy', 'score': 0.9988667964935303}, {'label': 'Easy', 'score': 0.795113205909729}, {'label': 'Hard', 'score': 0.9659070372581482}, {'label': 'Easy', 'score': 0.6729217767715454}]}\n"
203
  ]
204
  },
205
  {
@@ -234,13 +142,13 @@
234
  },
235
  {
236
  "cell_type": "code",
237
- "execution_count": 6,
238
  "id": "08c991b0",
239
  "metadata": {},
240
  "outputs": [
241
  {
242
  "data": {
243
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq8AAAHUCAYAAAAUbMECAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZXFJREFUeJzt3XdYFFfbBvB7actSlQ6CgFFUsMfYYgQ0FiyxxRKNgi32rommiSaxRpK8SdQURX1jS2JMsZsoahRj19jLi0iiCFZ6f74/+FhdOggsI/fvuua6Zs6cnfPszOzy7HDmjEpEBERERERECmCg7wCIiIiIiIqLySsRERERKQaTVyIiIiJSDCavRERERKQYTF6JiIiISDGYvBIRERGRYjB5JSIiIiLFYPJKRERERIrB5JWIiIiIFIPJK1E+/vrrL/Tu3Rs1a9aEWq2Go6MjWrdujenTp5dru4cPH0ZwcDAePnyYZ52Hhwe6d+9eZm0lJSUhODgYYWFhedatXr0aKpUKN27cKLP2AODXX3+FSqWCra0tUlNTy3Tb+nTjxg2oVCqsXr1aWxYcHAyVSoW7d+8W+Xo/Pz/4+fnplKlUKgQHB2uXw8LCoFKpdI7X9u3bdeqUlfT0dHz11Vd44YUXYGNjAzMzM7i7u6Nnz57YsmVLmbdX3jw8PKBSqaBSqWBgYABra2vUr18fQ4cOxe7du/N9Te79XxylPR6528r5/B0/frzE2yrIrVu3EBwcjNOnT+dZl3OuEikFk1eiXLZt24Y2bdogLi4Oixcvxu7du/HZZ5/hxRdfxKZNm8q17cOHD2Pu3Ln5Jq9lLSkpCXPnzs03ee3WrRvCw8Ph7Oxcpm2uXLkSAHD//n38/PPPZbptfXJ2dkZ4eDi6detWqtcvW7YMy5YtK7ROs2bNEB4ejmbNmmnLtm/fjrlz55aqzcIMGTIEEydOhL+/P7777jv89ttvePfdd2FkZIRdu3aVeXsV4cUXX0R4eDgOHz6MzZs3Y8KECYiIiEDnzp3x6quvIj09Xad+eHg4Ro4cWaI2Sns8StNWSd26dQtz587NN3kdOXIkwsPDy7V9orJkpO8AiCqbxYsXw9PTE7t27YKR0eOPyMCBA7F48WI9RlZx7O3tYW9vX6bbjI6Oxvbt29G+fXscPnwYK1euxIABA8q0DX1Rq9Vo1apVqV/v7e1dZB0rK6unaqO4IiIisGnTJrz//vs6iViHDh0watQoZGVllXsMOUQEKSkp0Gg0T72tatWq6ey/l19+GePHj0dwcDDmzp2Ld999F4sWLdKuL+99/eR7q4jjWhhXV1e4urrqNQaikuCVV6Jc7t27Bzs7O53ENYeBweOPzIgRI2BjY4OkpKQ89dq3bw8fHx/tskqlwoQJE/Df//4X9evXh5mZGRo3boytW7dq6wQHB2PmzJkAAE9PT+2/OXNfGd25cyeaNWsGjUaDevXqYdWqVXnaj46OxujRo+Hq6goTExN4enpi7ty5yMjIAJD9b+6c5HTu3LnatoKCggAU3G1g586d6NChA6ytrWFmZob69etjwYIFhezNx9asWYOMjAxMnToVffr0wR9//IHIyMg89R4+fIjp06ejVq1aUKvVcHBwQNeuXXHp0iVtndTUVMybNw/169eHqakpbG1t4e/vj8OHD2vriAiWLVuGJk2aQKPRoHr16nj11Vfxv//9T6e9U6dOoXv37nBwcIBarYaLiwu6deuGf/75R1vnhx9+QMuWLbXvu1atWhg+fLh2fX7dBnJERUWhT58+sLKygrW1NV5//XXExsbq1Mmv20BuubsNBAUF4csvvwQA7fHLOWYdOnRAvXr1ICI62xAR1K5du9ArxPfu3QOAAq+6P/kZAIp3vO7fv49x48ahRo0aMDExQa1atfDOO+/k6TqS8zlZsWIF6tevD7VajTVr1gAArl69ikGDBmmPU/369bXv/2kEBwfDx8cHX3zxBVJSUnRiefJf+UlJSZgxYwY8PT1hamoKGxsbNG/eHBs2bABQ+PEo6r0V1EXhwYMHGDZsGGxsbGBubo4ePXrkOX89PDy0n9snPXlOhYWF4YUXXgAADBs2TBtbTpv5dRvIysrC4sWLUa9ePe1xHTp0qM7nIqedBg0a4NixY3jppZe0n4+FCxdW6A8dqmKEiHSMHDlSAMjEiRPlyJEjkpaWlm+9M2fOCAD55ptvdMrPnz8vAOTLL7/UlgEQDw8PadGihXz//feyfft28fPzEyMjI7l+/bqIiERFRcnEiRMFgPz0008SHh4u4eHh8ujRIxERcXd3F1dXV/H29pa1a9fKrl27pF+/fgJA9u/fr23r9u3b4ubmJu7u7vLVV1/J77//Lh988IGo1WoJCgoSEZGUlBTZuXOnAJARI0Zo27p27ZqIiISGhgoAiYiI0G7322+/FZVKJX5+frJ+/Xr5/fffZdmyZTJu3Lhi7VcvLy9xdnaWjIwM+f333wWABAcH69SJi4sTHx8fMTc3l3nz5smuXbtk8+bNMnnyZNm7d6+IiKSnp4u/v78YGRnJjBkzZPv27fLrr7/K22+/LRs2bNBua9SoUWJsbCzTp0+XnTt3yvr166VevXri6Ogo0dHRIiKSkJAgtra20rx5c/n+++9l//79smnTJhkzZoxcuHBBREQOHz4sKpVKBg4cKNu3b5e9e/dKaGioDBkyRNtWRESEAJDQ0FBt2Zw5cwSAuLu7y8yZM2XXrl0SEhIi5ubm0rRpU53zytfXV3x9fXX2BQCZM2eOdnnfvn0CQPbt2yciIteuXZNXX31VAGiPX3h4uKSkpMgvv/wiAGTPnj0629y2bZsAkG3bthV4nBISEqRatWri5OQkX331lc45kFtxjldycrI0atRIzM3N5eOPP5bdu3fLe++9J0ZGRtK1a9c877lGjRrSqFEjWb9+vezdu1fOnTsn58+fF2tra2nYsKGsXbtWdu/eLdOnTxcDA4M851B+3N3dpVu3bgWunzVrlgCQgwcP6sTy5P4fPXq0mJmZSUhIiOzbt0+2bt0qCxculM8//1xECj8ehb23/NrK+fy5ubnJ8OHDZceOHfL111+Lg4ODuLm5yYMHD3TeW2BgYJ739OQ59ejRI+023333XW1sUVFRIvL4XH3SG2+8IQBkwoQJsnPnTlmxYoXY29uLm5ubxMbG6rRja2srderUkRUrVsiePXtk3LhxAkDWrFlT8EEhegpMXolyuXv3rrRt21YACAAxNjaWNm3ayIIFCyQ+Pl6nrq+vrzRp0kSnbOzYsWJlZaVTF4A4OjpKXFyctiw6OloMDAxkwYIF2rIlS5bkSRpzuLu7i6mpqURGRmrLkpOTxcbGRkaPHq0tGz16tFhYWOjUExH5+OOPBYCcP39eRERiY2Pz/NHMkTt5jY+PFysrK2nbtq1kZWUVsOcKduDAAQEgs2bNEhGRrKws8fT0FHd3d53tzZs3L9+k60lr167N90fDk8LDwwWALF26VKc8KipKNBqNvPnmmyIicvz4cQEgP//8c4HbytlvDx8+LLBOYcnr1KlTdequW7dOAMh3332nLStN8ioiMn78+DxJh4hIZmam1KpVS3r27KlTHhAQIM8991yRx3Dbtm1iZ2en/QzY2tpKv3795Ndff9WpV5zjtWLFCgEg33//vU75okWLBIDs3r1b5z1bW1vL/fv3dep27txZXF1dtT/kckyYMEFMTU3z1M+tqOR1+fLlAkA2bdqkE8uT+79BgwbSq1evQtsp6HjkbC+/95ZfWzmfv969e+vUO3TokACQDz/8UOe9FZW8iogcO3YszzmaI3fyevHiRQGQ54fpX3/9JQDk7bff1mkHgPz11186db29vaVz58552iIqC+w2QJSLra0tDh48iGPHjmHhwoXo2bMnrly5gtmzZ6Nhw4Y6d49PnjwZp0+fxqFDhwAAcXFx+O9//4vAwEBYWFjobNff3x+WlpbaZUdHRzg4OOT7r/OCNGnSBDVr1tQum5qawsvLS2cbW7duhb+/P1xcXJCRkaGdAgICAAD79+8v2Q5B9o1kcXFxGDduXKnuSs65USvnX+05XRQiIyPxxx9/aOvt2LEDXl5eePnllwvc1o4dO2Bqaqrzb/vctm7dCpVKhddff11nHzg5OaFx48baf73Xrl0b1atXx1tvvYUVK1bgwoULebaV8+/W/v374/vvv8e///5bovc+ePBgneX+/fvDyMgI+/btK9F2SsLAwAATJkzA1q1bcfPmTQDA9evXsXPnzmIdw65du+LmzZvYsmULZsyYAR8fH/z888945ZVXMGHCBG294hyvvXv3wtzcHK+++qpOec6/up88/kB2l5vq1atrl1NSUvDHH3+gd+/eMDMz0zmeXbt2RUpKCo4cOVKs/VIQydW9Ij8tWrTAjh07MGvWLISFhSE5ObnE7eR+b0XJfe60adMG7u7u5XruANBuP3d3hBYtWqB+/fp5jpmTkxNatGihU9aoUaMSfbcRlQSTV6ICNG/eHG+99RZ++OEH3Lp1C1OnTsWNGzd0btrq2bMnPDw8tH3dVq9ejcTERIwfPz7P9mxtbfOUqdXqEv0RLM427ty5g99++w3GxsY6U04f3OIM3ZRbTh/N0tzUER8fjx9++AEtWrSAvb09Hj58iIcPH6J3795QqVTaxDannaLaiI2NhYuLS56+l0+6c+cORASOjo559sORI0e0+8Da2hr79+9HkyZN8Pbbb8PHxwcuLi6YM2eO9u7zdu3a4eeff0ZGRgaGDh0KV1dXNGjQQNvXsShOTk46y0ZGRrC1tdX2LS0vw4cPh0ajwYoVKwAAX375JTQaTaFJ/5M0Gg169eqFJUuWYP/+/bh27Rq8vb3x5Zdf4vz58wCKd7zu3bsHJyenPAmzg4MDjIyM8uyH3H1t7927h4yMDHz++ed5jmXXrl0BlO6cflJOkuXi4lJgnf/85z9466238PPPP8Pf3x82Njbo1asXrl69Wux2Sjp6R+5zJ6esvM+dwvo9u7i45Gm/LL7biEqCow0QFYOxsTHmzJmDTz75BOfOndOWGxgYYPz48Xj77bexdOlSLFu2DB06dEDdunX1FqudnR0aNWqEjz76KN/1hf2BLkjOzV25b9Yojg0bNiApKQlHjx7N96rTli1b8ODBA1SvXh329vZFtmFvb48///wTWVlZBSawdnZ2UKlUOHjwINRqdZ71T5Y1bNgQGzduhIjg7NmzWL16NebNmweNRoNZs2YByP6R0rNnT6SmpuLIkSNYsGABBg0aBA8PD7Ru3brQeKOjo1GjRg3tckZGBu7du5fvH/yyZG1tjcDAQHz77beYMWMGQkNDMWjQIFSrVq1U26tZsybeeOMNTJkyBefPn4ePj0+xjpetrS3++usviIhOAhsTE4OMjAzY2dnp1M+d5FavXh2GhoYYMmRIvj8KgewbHEtLRPDbb7/B3NwczZs3L7Ceubk55s6di7lz5+LOnTvaq7A9evTQuTmtMCX9r0V0dHS+ZbVr19Yum5qa5jtm8t27d/Ps2+LKOTdv376d58fJrVu3Sr1dorLCK69Eudy+fTvf8osXLwLIm/yNHDkSJiYmGDx4MC5fvqzzb9WSykmqnuaKRffu3XHu3Dk899xzaN68eZ4pJ/6StNWmTRtYW1tjxYoVxfoX65NWrlwJS0tL/PHHH9i3b5/OtGTJEqSmpmLdunUAgICAAFy5cgV79+4tcHsBAQFISUnJ987+HN27d4eI4N9//813HzRs2DDPa1QqFRo3boxPPvkE1apVw8mTJ/PUUavV8PX11Q6pdOrUqSLff857y/H9998jIyOjyNEFiqOoYzhp0iTcvXsXr776Kh4+fFisczM+Ph4JCQn5rsv9GSjO8erQoQMSEhLyjOu7du1a7frCmJmZwd/fH6dOnUKjRo3yPZ5P80Ng7ty5uHDhAiZPngxTU9NivcbR0RFBQUF47bXXcPnyZe2II2Xx+X1S7nPn8OHDiIyM1Dl3PDw8cPbsWZ16V65cweXLl3XKShJb+/btAQDfffedTvmxY8dw8eLFIo8ZUXnjlVeiXDp37gxXV1f06NED9erVQ1ZWFk6fPo2lS5fCwsICkydP1qlfrVo1DB06FMuXL4e7uzt69OhR6rZzkqrPPvsMgYGBMDY2Rt26dXX6yhZl3rx52LNnD9q0aYNJkyahbt26SElJwY0bN7B9+3asWLECrq6usLS0hLu7O3755Rd06NABNjY2sLOzg4eHR55tWlhYYOnSpRg5ciRefvlljBo1Co6Ojrh27RrOnDmDL774It9Yzp07h6NHj2Ls2LHaP4hPevHFF7F06VKsXLkSEyZMwJQpU7Bp0yb07NkTs2bNQosWLZCcnIz9+/eje/fu8Pf3x2uvvYbQ0FCMGTMGly9fhr+/P7KysvDXX3+hfv36GDhwIF588UW88cYbGDZsGI4fP4527drB3Nwct2/fxp9//omGDRti7Nix2Lp1K5YtW4ZevXqhVq1aEBH89NNPePjwITp27AgAeP/99/HPP/+gQ4cOcHV1xcOHD/HZZ5/B2NgYvr6+RR6Pn376CUZGRujYsSPOnz+P9957D40bN0b//v2LfUwLknO+LFq0CAEBATA0NESjRo1gYmICAPDy8kKXLl2wY8cOtG3bFo0bNy5ym5cvX0bnzp0xcOBA+Pr6wtnZGQ8ePMC2bdvw9ddfw8/PD23atAGAYh2voUOH4ssvv0RgYCBu3LiBhg0b4s8//8T8+fPRtWvXQvvL5vjss8/Qtm1bvPTSSxg7diw8PDwQHx+Pa9eu4bfffis0ec7x8OFDbd/YxMREXL58GRs3bsTBgwfRv3//Ih8u0LJlS3Tv3h2NGjVC9erVcfHiRfz3v/9F69atYWZmBqDo41FSx48fx8iRI9GvXz9ERUXhnXfeQY0aNTBu3DhtnSFDhuD111/HuHHj0LdvX0RGRmLx4sV5xml+7rnnoNFosG7dOtSvXx8WFhZwcXHJ9z8xdevWxRtvvIHPP/8cBgYGCAgIwI0bN/Dee+/Bzc0NU6dOLdX7ISoz+rtXjKhy2rRpkwwaNEjq1KkjFhYWYmxsLDVr1pQhQ4Zoh0/KLSwsTADIwoUL810PQMaPH5+nPL87hWfPni0uLi5iYGCgc3d5QXdM53enemxsrEyaNEk8PT3F2NhYbGxs5Pnnn5d33nlHEhIStPV+//13adq0qajVagGgjSW/obJERLZv3y6+vr5ibm4uZmZm4u3tLYsWLcr3PYuITJkyRQDI6dOnC6yTM0zRiRMnRETkwYMHMnnyZKlZs6YYGxuLg4ODdOvWTS5duqR9TXJysrz//vtSp04dMTExEVtbW2nfvr0cPnxYZ9urVq2Sli1birm5uWg0Gnnuuedk6NChcvz4cRERuXTpkrz22mvy3HPPiUajEWtra2nRooWsXr1au42tW7dKQECA1KhRQ0xMTMTBwUG6du2qM6xSYaMNnDhxQnr06CEWFhZiaWkpr732mty5c0cnztKONpCamiojR44Ue3t7UalU+R6z1atXCwDZuHFjgcfgSQ8ePJAPP/xQ2rdvr33P5ubm0qRJE/nwww8lKSkpT/2ijte9e/dkzJgx4uzsLEZGRuLu7i6zZ8/WDiP15HvO73Mikr2Phw8fLjVq1BBjY2Oxt7eXNm3a6Nx5XxB3d3ftyAkqlUosLCykbt26MmTIENm1a1e+r8m9/2fNmiXNmzeX6tWri1qtllq1asnUqVPl7t272jqFHY/C3lvutnI+f7t375YhQ4ZItWrVRKPRSNeuXeXq1as6r83KypLFixdLrVq1xNTUVJo3by579+7N95zasGGD1KtXT4yNjXXazG+orMzMTFm0aJF4eXmJsbGx2NnZyeuvv64dXiuHr6+v+Pj45HlPgYGB4u7unu/7JXpaKpES/g+QiPKYPn06li9fjqioqHLvy0hUEn379sWRI0dw48YNGBsb6zscIqKnxm4DRE/hyJEjuHLlCpYtW4bRo0czcaVKITU1FSdPnsTRo0exZcsWhISEMHElomcGr7wSPQWVSgUzMzN07doVoaGhecZ2JdKHGzduwNPTE1ZWVhg0aBC++OILGBoa6jssIqIyweSViIiIiBSDQ2URERERkWIweSUiIiIixWDySkRERESK8cyPNpCVlYVbt27B0tKyxI/mIyIiIqLyJyKIj4+Hi4tLgY/+zvHMJ6+3bt2Cm5ubvsMgIiIioiJERUXB1dW10DrPfPKa81jNqKgoWFlZ6TkaIqKnlJUFREVlz7u5AUVcoSAiUoK4uDi4ubkV63Hoz3zymtNVwMrKiskrESlfYiLQqFH2fEICYG6u33iIiMpQcbp48ic7ERERESkGk1ciIiIiUgwmr0RERESkGM98n1ciIqKqLDMzE+np6foOg6o4Q0NDGBkZlcmwpUxeiYiInlEJCQn4559/ICL6DoUIZmZmcHZ2homJyVNth8krERHRMygzMxP//PMPzMzMYG9vzwf1kN6ICNLS0hAbG4uIiAjUqVOnyAcRFIbJKxGRkhgZAePGPZ4nKkB6ejpEBPb29tBoNPoOh6o4jUYDY2NjREZGIi0tDaampqXeFr/5iIiURK0GvvxS31GQgvCKK1UWT3O1VWc7ZbIVIiIiIqIKwCuvRERKIgLcvZs9b2cH8KoaEVUxvPJKRKQkSUmAg0P2lJSk72iIqBx5eHjg008/1XcY+Tp06BAaNmwIY2Nj9OrVq8Cy8sDklYiIiCqNoKAgqFSqPFOXLl0qPBZPT0/s3LkTYWFhUKlUePjwYZ46lTnBLEph76so06ZNQ5MmTRAREYHVq1cXWFYemLwSERFRpdKlSxfcvn1bZ9qwYUOFxnD27Fncu3cP/v7+5dpOZmYmsrKyyrWN8nD9+nW0b98erq6uqFatWoFl5YHJKxERUVWSmFjwlJJS/LrJycWrWwpqtRpOTk46U/Xq1bXrQ0JC0LBhQ5ibm8PNzQ3jxo1DQkKCdn1kZCR69OiB6tWrw9zcHD4+Pti+fTtEBLVr18bHH3+s0965c+dgYGCA69eva8t++eUXdO7cGWq1ukSxFxXb6tWrUa1aNWzduhXe3t5Qq9WIjIxETEwMevToAY1GA09PT6xbt65Y7a1atQo+Pj5Qq9VwdnbGhAkTAAA3btyASqXC6dOntXUfPnwIlUqFsLAw3LhxQ5uYV69eHSqVCkFBQQCA1NRUTJo0CQ4ODjA1NUXbtm1x7Ngxne3eu3cPw4cPh0qlwurVq/MtKy+8YascxMbGIi4ursLas7Kygr29fYW1R0RECmZhUfC6rl2BbdseLxfWt9rXFwgLe7zs4fH4ZsInlcPTvQwMDPCf//wHHh4eiIiIwLhx4/Dmm29i2bJlAIDx48cjLS0NBw4cgLm5OS5cuAALCwuoVCoMHz4coaGhmDFjhnZ7q1atwksvvYTnnntOW/brr79i8uTJZR4bACQlJWHBggX49ttvYWtrCwcHB/Tr1w9RUVHYu3cvTExMMGnSJMTExBTa1vLlyzFt2jQsXLgQAQEBePToEQ4dOlSsON3c3LB582b07dsXly9fhpWVlXY84DfffBObN2/GmjVr4O7ujsWLF6Nz5864du0a3NzccPv2bdStWxfz5s3DgAEDYGlpiS5duuiUWVtbl3jfFReT1zIWGxuL14eNxP34iruRwsbSDN+FfssEloiInglbt26FRa4k+6233sJ7770HAJgyZYq23NPTEx988AHGjh2rTRBv3ryJvn37omHDhgCAWrVqaesPGzYM77//Po4ePYoWLVogPT0d3333HZYsWaKt8++//+LMmTPo2rWrTgyurq55Yk3KldwXFRuQ/QCJZcuWoXHjxgCAK1euYMeOHThy5AhatmwJAFi5ciXq169f6H768MMPMX36dJ0k+4UXXij0NTkMDQ1hY2MDAHBwcND+mz8xMRHLly/H6tWrERAQAAD45ptvsGfPHqxcuRIzZ86Ek5MTVCoVrK2t4eTkBAAwNzfPU1ZemLyWsbi4ONyPT4J9674wt3Es9/YS799BbPhmxMXFMXklIqKiPfEv7DwMDXWXC7vyl3vA+Rs3Sh1Sbv7+/li+fLlOWU6iBQD79u3D/PnzceHCBcTFxSEjIwMpKSlITEyEubk5Jk2ahLFjx2L37t14+eWX0bdvXzRq1AgA4OzsjG7dumHVqlVo0aIFtm7dipSUFPTr10+7/V9//RUvvviiTpsAcPDgQVhaWuqU+fn56SwXFRsAmJiYaOMBgIsXL8LIyAjNmzfXltWrV6/QfqMxMTG4desWOnToUMieLLnr168jPT0dL774orbM2NgYLVq0wMWLF8u0rdJi8lpOzG0cYeWQ9xdaeYitkFaIqFIwMgICAx/PE5XU/ydQeq1b5KbMUbt27XzXRUZGomvXrhgzZgw++OAD2NjY4M8//8SIESOQnp4OABg5ciQ6d+6Mbdu2Yffu3ViwYAGWLl2KiRMnatcPGTIEn3zyCUJDQzFgwACYmZlp2/j111/Rs2fPPG17enrmSSiNnvgcFic2IPtRqU8++Uz+v2tFSZ6GVtQjf3OeZiVPdNt4MoaCFBSLiFSap7Xxhi0iIiVRq4HVq7OnEt5IQvQsOH78ODIyMrB06VK0atUKXl5euHXrVp56bm5uGDNmDH766SdMnz4d33zzjXZd165dYW5ujuXLl2PHjh0YPny4dl1CQgL27duHV155pdxiy61+/frIyMjA8ePHtWWXL18udAgrS0tLeHh44I8//sh3fc5/Y2/fvq0te/LmLSD7CjCQPeJBjtq1a8PExAR//vmntiw9PR3Hjx8vshtDReHPdiIiIqpUUlNTER0drVNmZGQEOzs7PPfcc8jIyMDnn3+OHj164NChQ1ixYoVO3SlTpiAgIABeXl548OAB9u7dq5N4GRoaIigoCLNnz0bt2rXRunVr7bqdO3eiTp06Ov1ki6s4seWnbt266NKlC0aNGoWvv/4aRkZGmDJlSpFXV4ODgzFmzBg4ODggICAA8fHxOHToECZOnAiNRoNWrVph4cKF8PDwwN27d/Huu+/qvN7d3R0qlQpbt25F165dodFoYGFhgbFjx2LmzJmwsbFBzZo1sXjxYiQlJWHEiBEl3iflgVdeiYiUROTxEETlcBc3UWWwc+dOODs760xt27YFADRp0gQhISFYtGgRGjRogHXr1mHBggU6r8/MzMT48eNRv3597V3wT94wBQAjRoxAWlqazlVXIHuIrPy6DBRHcWIrSGhoKNzc3ODr64s+ffrgjTfegIODQ6GvCQwMxKeffoply5bBx8cH3bt3x9WrV7XrV61ahfT0dDRv3hyTJ0/Ghx9+qPP6GjVqYO7cuZg1axYcHR21w2wtXLgQffv2xZAhQ9CsWTNcu3YNu3bt0hmuTJ9UIs/2t19cXBysra3x6NEjWFlZlXt7169fx8DhY+DRbVyF9HmNi/kHN7Ytw8ZVK3SG+CCiZ1Ri4uOhjhISyrSfIT1bUlJSEBERAU9PT5iamuo7nErn0KFD8PPzwz///ANHx+wbrDMzM+Hg4IAdO3agRYsWeo7w2VPYOVmSfI3dBoiIiKjKSE1NRVRUFN577z30799fm7gCwL179zB16tRiDzdF+qHXbgPLly9Ho0aNYGVlBSsrK7Ru3Ro7duzQrhcRBAcHw8XFBRqNBn5+fjh//rweIyYiIiIl27BhA+rWrYtHjx5h8eLFOuscHBzw7rvvVpq76il/ek1eXV1dsXDhQhw/fhzHjx9H+/bt0bNnT22CunjxYoSEhOCLL77AsWPH4OTkhI4dOyI+Pl6fYRMREZFCBQUFITMzEydOnECNGjX0HQ6Vgl6T1x49eqBr167w8vKCl5cXPvroI1hYWODIkSMQEXz66ad455130KdPHzRo0ABr1qxBUlIS1q9fr8+wiYiIiEhPKs1oA5mZmdi4cSMSExPRunVrREREIDo6Gp06ddLWUavV8PX1xeHDhwvcTmpqKuLi4nQmIiKiquoZvy+bFKSszkW9J69///03LCwsoFarMWbMGGzZsgXe3t7a8d2e7Eids5x77LcnLViwANbW1trJzc2tXOMnIiKqjAz//1GvaWlpeo6EKFtSUhKA7MfNPg29jzZQt25dnD59Gg8fPsTmzZsRGBiI/fv3a9eX9PFks2fPxrRp07TLcXFxTGCJ6NlhaAi8+urjeaICGBkZwczMDLGxsTA2NtY+LpSoookIkpKSEBMTg2rVqml/WJWW3pNXExMT7fOLmzdvjmPHjuGzzz7DW2+9BQCIjo6Gs7Oztn5MTEyeq7FPUqvVUPORiUT0rDI1BX74Qd9RkAKoVCo4OzsjIiICkZGR+g6HCNWqVYOTk9NTb0fvyWtuIoLU1FR4enrCyckJe/bsQdOmTQFk/+tj//79WLRokZ6jJCIiqvxMTExQp04ddh0gvTM2Nn7qK6459Jq8vv322wgICICbmxvi4+OxceNGhIWFYefOnVCpVJgyZQrmz5+POnXqoE6dOpg/fz7MzMwwaNAgfYZNRESkGAYGBnzCFj1T9Jq83rlzB0OGDMHt27dhbW2NRo0aYefOnejYsSMA4M0330RycjLGjRuHBw8eoGXLlti9ezcsLS31GTYRkf7w8bBEVMXpNXlduXJloetVKhWCg4MRHBxcMQERERERUaXGWw+JiIiISDGYvBIRERGRYjB5JSIiIiLFYPJKRERERIrB5JWIiIiIFKPSPaSAiIgKYWgIdO36eJ6IqIph8kpEpCSmpsC2bfqOgohIb9htgIiIiIgUg8krERERESkGk1ciIiVJTMx+JKy5efY8EVEVwz6vRERKk5Sk7wiIiPSGV16JiIiISDGYvBIRERGRYjB5JSIiIiLFYPJKRERERIrB5JWIiIiIFIOjDRARKYmBAeDr+3ieiKiKYfJKRKQkGg0QFqbvKIiI9IY/24mIiIhIMZi8EhEREZFiMHklIlKSxETA3j574uNhiagKYp9XIiKluXtX3xEQEekNr7wSERERkWIweSUiIiIixWDySkRERESKweSViIiIiBSDySsRERERKQZHGyAiUhIDA6B588fzRERVDJNXIiIl0WiAY8f0HQURkd7wZzsRERERKQaTVyIiIiJSDCavRERKkpQEeHhkT0lJ+o6GiKjCsc8rEZGSiACRkY/niYiqGF55JSIiIiLFYPJKRERERIrB5JWIiIiIFIPJKxEREREpBpNXIiIiIlIMjjZARKQkKhXg7f14noioimHySkSkJGZmwPnz+o6CiEhv2G2AiIiIiBSDySsRERERKQaTVyIiJUlKAnx8sic+HpaIqiD2eSUiUhIR4MKFx/NERFUMr7wSERERkWIweSUiIiIixWDySkRERESKweSViIiIiBRDr8nrggUL8MILL8DS0hIODg7o1asXLl++rFMnKCgIKpVKZ2rVqpWeIiYiIiIifdJr8rp//36MHz8eR44cwZ49e5CRkYFOnTohMTFRp16XLl1w+/Zt7bR9+3Y9RUxEpGcqFeDunj3x8bBEVAXpdaisnTt36iyHhobCwcEBJ06cQLt27bTlarUaTk5OFR0eEVHlY2YG3Lih7yiIiPSmUvV5ffToEQDAxsZGpzwsLAwODg7w8vLCqFGjEBMTU+A2UlNTERcXpzMRERER0bOh0iSvIoJp06ahbdu2aNCggbY8ICAA69atw969e7F06VIcO3YM7du3R2pqar7bWbBgAaytrbWTm5tbRb0FIiIiIipnleYJWxMmTMDZs2fx559/6pQPGDBAO9+gQQM0b94c7u7u2LZtG/r06ZNnO7Nnz8a0adO0y3FxcUxgiejZkZwM5HSrOnAA0Gj0Gw8RUQWrFMnrxIkT8euvv+LAgQNwdXUttK6zszPc3d1x9erVfNer1Wqo1eryCJOISP+ysoDjxx/PExFVMXpNXkUEEydOxJYtWxAWFgZPT88iX3Pv3j1ERUXB2dm5AiIkIiIiospEr31ex48fj++++w7r16+HpaUloqOjER0djeTkZABAQkICZsyYgfDwcNy4cQNhYWHo0aMH7Ozs0Lt3b32GTkRERER6oNcrr8uXLwcA+Pn56ZSHhoYiKCgIhoaG+Pvvv7F27Vo8fPgQzs7O8Pf3x6ZNm2BpaamHiImIiIhIn/TebaAwGo0Gu3btqqBoiIiIiKiyqzRDZRERERERFaVSjDZAREQlYGen7wiIiPSGySsRkZKYmwOxsfqOgohIb9htgIiIiIgUg8krERERESkGk1ciIiVJTgb8/LKn/x8Tm4ioKmGfVyIiJcnKAvbvfzxPRFTF8MorERERESkGk1ciIiIiUgwmr0RERESkGExeiYiIiEgxmLwSERERkWJwtAEiIqUxM9N3BEREesPklYhISczNgcREfUdBRKQ37DZARERERIrB5JWIiIiIFIPJKxGRkqSkAN26ZU8pKfqOhoiowrHPKxGRkmRmAtu3P54nIqpieOWViIiIiBSDySsRERERKQaTVyIiIiJSDCavRERERKQYTF6JiIiISDGYvBIRERGRYnCoLCIiJTE3B0T0HQURkd7wyisRERERKQaTVyIiIiJSDCavRERKkpIC9OuXPfHxsERUBTF5JSJSksxM4Mcfsyc+HpaIqiAmr0RERESkGExeiYiIiEgxmLwSERERkWIweSUiIiIixWDySkRERESKweSViIiIiBSDj4clIlISMzMgIeHxPBFRFcPklYhISVQqwNxc31EQEekNuw0QERERkWIweSUiUpLUVCAoKHtKTdV3NEREFY7JKxGRkmRkAGvWZE8ZGfqOhoiowjF5JSIiIiLFYPJKRERERIrB5JWIiIiIFIPJKxEREREpBpNXIiIiIlIMJq9EREREpBh8whYRkZKYmQExMY/niYiqGCavRERKolIB9vb6joKISG/02m1gwYIFeOGFF2BpaQkHBwf06tULly9f1qkjIggODoaLiws0Gg38/Pxw/vx5PUVMRERERPqk1+R1//79GD9+PI4cOYI9e/YgIyMDnTp1QmJiorbO4sWLERISgi+++ALHjh2Dk5MTOnbsiPj4eD1GTkSkJ6mpwPjx2RMfD0tEVZBeuw3s3LlTZzk0NBQODg44ceIE2rVrBxHBp59+infeeQd9+vQBAKxZswaOjo5Yv349Ro8erY+wiYj0JyMDWLYse37xYkCt1m88REQVrFKNNvDo0SMAgI2NDQAgIiIC0dHR6NSpk7aOWq2Gr68vDh8+nO82UlNTERcXpzMRERER0bOh0iSvIoJp06ahbdu2aNCgAQAgOjoaAODo6KhT19HRUbsutwULFsDa2lo7ubm5lW/gRERERFRhKk3yOmHCBJw9exYbNmzIs06lUuksi0ieshyzZ8/Go0ePtFNUVFS5xEtEREREFa9SDJU1ceJE/Prrrzhw4ABcXV215U5OTgCyr8A6Oztry2NiYvJcjc2hVquhZh8wIiIiomeSXq+8iggmTJiAn376CXv37oWnp6fOek9PTzg5OWHPnj3asrS0NOzfvx9t2rSp6HCJiIiISM/0euV1/PjxWL9+PX755RdYWlpq+7FaW1tDo9FApVJhypQpmD9/PurUqYM6depg/vz5MDMzw6BBg/QZOhERERHpgV6T1+XLlwMA/Pz8dMpDQ0MRFBQEAHjz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OMLKwbXoimUgtkJaKblSJa9paWn49ttvsWfPHjRv3hzm5uY660NCQsokOCIiyiUjA8h5gEvnznzCFhFVOSX61vvf//4HDw8PnDt3Ds2aNQMAXLlyRacOuxMQEZWj1FSge/fseT4eloiqoBJ969WpUwe3b9/Gvn37AGQ/DvY///kPHB3Lv+8FEREREVGJHlIgIjrLO3bsQGJiYpkGRERERERUkFI9YStH7mSWiIiIiKg8lSh5ValUefq0so8rEREREVWUEvV5FREEBQVBrVYDAFJSUjBmzJg8ow389NNPZRchEREREdH/K1HyGhgYqLP8+uuvl2kwRERERESFKVHyGprzSEIiItIPExPgiy8ezxMRVTEcIJCISEmMjYHx4/UdBRGR3jzVaANERERERBWJV16JiJQkMxM4eDB7/qWXAEND/cZDRFTBmLwSESlJSgrg7589n5AA5BrthYjoWcduA0RERESkGExeiYiIiEgxmLwSERERkWIweSUiIiIixWDySkRERESKweSViIiIiBSDQ2URESmJsTGwePHjeSKiKobJKxGRkpiYADNn6jsKIiK9YbcBIiIiIlIMXnklIlKSzEzg5Mns+WbN+HhYIqpymLwSESlJSgrQokX2PB8PS0RVELsNEBEREZFiMHklIiIiIsVg8kpEREREisHklYiIiIgUg8krERERESkGk1ciIiIiUgwOlUVEpCTGxsCcOY/niYiqGCavRERKYmICBAfrOwoiIr1htwEiIiIiUgxeeSUiUpKsLODixez5+vUBA16DIKKqhckrEZGSJCcDDRpkz/PxsERUBfEnOxEREREpBpNXIiIiIlIMJq9EREREpBhMXomIiIhIMZi8EhEREZFiMHklIiIiIsXQa/J64MAB9OjRAy4uLlCpVPj555911osIgoOD4eLiAo1GAz8/P5w/f14/wRIRVQbGxsCMGdkTHw9LRFWQXpPXxMRENG7cGF988UW+6xcvXoyQkBB88cUXOHbsGJycnNCxY0fEx8dXcKRERJWEiQmwZEn2ZGKi72iIiCqcXh9SEBAQgICAgHzXiQg+/fRTvPPOO+jTpw8AYM2aNXB0dMT69esxevTofF+XmpqK1NRU7XJcXFzZB04VLjY2tkKPpZWVFezt7SusPSKiZw2/t6m8VNonbEVERCA6OhqdOnXSlqnVavj6+uLw4cMFJq8L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hskrEZGSmJkB58/rOwoiIr1htwEiIiIiUgwmr0RERESkGExeiYiUJCkJ8PHJnvh4WCKqgtjnlYhISUSACxcezxMRVTG88kpEREREisHklYiIiIgUg8krERERESkGk1ciIiIiUgwmr0RERESkGBxtgIhISVQqwN398TwRURXD5JWISEnMzIAbN/QdBRGR3rDbABEREREpBpNXIiIiIlIMJq9EREqSnAy88EL2lJys72iIiCoc+7wSESlJVhZw/PjjeSKiKoZXXomIiIhIMZi8EhEREZFiMHklIiIiIsVg8kpEREREisHklYiIiIgUg6MNEBEpjZ2dviMgItIbJq9EREpibg7Exuo7CiIivWG3ASIiIiJSDCavRERERKQYTF6JiJQkORnw88ue+HhYIqqC2OeViEhJsrKA/fsfzxMRVTG88kpEREREisHklYiIiIgUg8krERERESkGk1ciIiIiUgwmr0RERESkGBxtgIhIaczM9B0BEZHeMHklIlISc3MgMVHfURAR6Q27DRARERGRYjB5JSIiIiLFYPJKRKQkKSlAt27ZU0qKvqMhIqpw7PNKRKQkmZnA9u2P54mIqhheeSUiIiIixWDySkRERESKoYjkddmyZfD09ISpqSmef/55HDx4UN8hEREREZEeVPrkddOmTZgyZQreeecdnDp1Ci+99BICAgJw8+ZNfYdGRERERBWs0ievISEhGDFiBEaOHIn69evj008/hZubG5YvX67v0IiIiIioglXq0QbS0tJw4sQJzJo1S6e8U6dOOHz4cL6vSU1NRWpqqnb50aNHAIC4uLjyC/QJ8fHxyMzIwMPbN5CeklTu7cXF/APJykJcdBSMVOXenF7afNbbS3wQg9TkZFy4cAHx8fHl3yApmio5GZ7/Px9x9ixEo9FrPKQMUVFRSEtJeWb/Nj3r7emjzcQHMcjMyEB8fHyF5FA5bYhI0ZWlEvv3338FgBw6dEin/KOPPhIvL698XzNnzhwBwIkTJ06cOHHixElhU1RUVJH5YaW+8ppDpdL9iSEiecpyzJ49G9OmTdMuZ2Vl4f79+7C1tS3wNWUpLi4Obm5uiIqKgpWVVbm3pxTcLwXjvskf90vBuG8Kxn2TP+6XgnHf5K+i94uIID4+Hi4uLkXWrdTJq52dHQwNDREdHa1THhMTA0dHx3xfo1aroVardcqqVatWXiEW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",
244
  "text/plain": [
245
  "<Figure size 800x500 with 1 Axes>"
246
  ]
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 2,
6
  "id": "44a2331f",
7
  "metadata": {},
8
  "outputs": [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  {
10
  "name": "stderr",
11
  "output_type": "stream",
 
17
  "source": [
18
  "from FastChemTokenizerHF import FastChemTokenizerSelfies\n",
19
  "from ChemQ3MTP import ChemQ3MTP\n",
20
+ "from transformers import pipeline, AutoTokenizer\n",
21
  "from tqdm import tqdm\n",
22
  "import torch, random\n",
23
  "\n",
24
+ "# --- Load model tokenizer (for generation only) ---\n",
25
+ "gen_tokenizer = FastChemTokenizerSelfies.from_pretrained(\"../selftok_core\")\n",
26
  "\n",
27
  "# --- Load model checkpoint ---\n",
28
  "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
29
  "model = ChemQ3MTP.from_pretrained('./model_step_7000').to(device)\n",
30
+ "model.tokenizer = gen_tokenizer\n",
31
  "model.eval()\n",
32
  "\n",
33
+ "# --- Load SA classifier & its tokenizer (for evaluation only) ---\n",
34
+ "sa_tokenizer = AutoTokenizer.from_pretrained(\"gbyuvd/synthaccess-chemselfies\")\n",
35
  "sa_classifier = pipeline(\n",
36
+ " \"text-classification\",\n",
37
+ " model=\"gbyuvd/synthaccess-chemselfies\",\n",
38
+ " tokenizer=sa_tokenizer,\n",
39
+ " device=0 if device == \"cuda\" else -1\n",
40
  ")\n"
41
  ]
42
  },
43
  {
44
  "cell_type": "code",
45
+ "execution_count": 3,
46
  "id": "00cc536e",
47
  "metadata": {},
48
  "outputs": [
 
50
  "name": "stderr",
51
  "output_type": "stream",
52
  "text": [
53
+ "Generating: 100%|██████████| 10/10 [00:07<00:00, 1.25it/s]"
54
  ]
55
  },
56
  {
57
  "name": "stdout",
58
  "output_type": "stream",
59
  "text": [
60
+ "Sample SELFIES: ['[C] [=C] [O] [C] [=Branch1] [Ring1] [=C] [C] [C] [Ring1] [Ring2] [Ring1] [Branch1] [O] [C] [=Branch1] [C] [=O] [Branch2]', '[C] [C] [C] [C] [N] [C] [=Branch1] [C] [=O] [C] [=C] [C] [=C] [C] [Branch2] [Ring1] [C] [N] [C] [=Branch1] [C] [=O] [N] [O] [C] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1] [=N] [Ring1]', '[O] [P] [=Branch1] [C] [=O] [Branch1] [C] [O] [C] [C] [C] [N] [Branch1] [N] [C] [=Branch1] [C] [=O] [C] [C] [C] [Ring1] [Ring1] [C] [=C] [C] [=C]', '[N+1] [C] [C] [N] [Branch2] [=Branch2] [=N] [C] [Branch2] [Ring1] [Ring1] [C] [=C] [C] [=C] [Branch1] [#Branch2] [C] [N] [C] [C] [C] [C] [Ring1] [=Branch1]', '[N] [=C] [P] [N] [C] [=C] [C] [=C] [C] [=C] [Ring1] [=Branch1] [S] [=Branch1] [C] [=O] [=Branch1] [C] [=O] [C] [=C] [C] [=C] [Branch1]']\n"
61
  ]
62
  },
63
  {
 
86
  " all_samples.extend(selfies_list)\n",
87
  " return all_samples\n",
88
  "\n",
89
+ "selfies_samples = generate_batch(model, gen_tokenizer, total_samples=100)\n",
 
90
  "print(\"Sample SELFIES:\", selfies_samples[:5])\n"
91
  ]
92
  },
93
  {
94
  "cell_type": "code",
95
+ "execution_count": 4,
96
  "id": "07390f52",
97
  "metadata": {},
98
  "outputs": [
 
100
  "name": "stderr",
101
  "output_type": "stream",
102
  "text": [
103
+ "Classifying (SA): 100%|██████████| 7/7 [00:02<00:00, 2.81it/s]"
104
  ]
105
  },
106
  {
107
  "name": "stdout",
108
  "output_type": "stream",
109
  "text": [
110
+ "SA Evaluation: {'total': 100, 'easy_count': 33, 'easy_fraction': 0.33, 'avg_score': 0.8521381348371506, 'details': [{'label': 'Hard', 'score': 0.9904143810272217}, {'label': 'Easy', 'score': 0.6717072129249573}, {'label': 'Hard', 'score': 0.6868415474891663}, {'label': 'Hard', 'score': 0.8201662302017212}, {'label': 'Hard', 'score': 0.9932112097740173}]}\n"
111
  ]
112
  },
113
  {
 
142
  },
143
  {
144
  "cell_type": "code",
145
+ "execution_count": 5,
146
  "id": "08c991b0",
147
  "metadata": {},
148
  "outputs": [
149
  {
150
  "data": {
151
+ "image/png": "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QESkNBYWho6AiMhgmLwSESmJpSWQkmLoKIiIDIbDBoiIiIhIMZi8EhEREZFiMHklIlKS9HSge/e8KT3d0NEQEekdx7wSESlJTg6wdeuDeSKiaoZnXomIiIhIMZi8EhEREZFiMHklIiIiIsVg8kpEREREisHklYiIiIgUg8krERERESkGb5VFRKQklpaAiKGjICIyGJ55JSIiIiLFYPJKRERERIrB5JWISEnS04H+/fMmPh6WiKohJq9EREqSkwP88EPexMfDElE1xOSViIiIiBSDySsRERERKQaTVyIiIiJSDCavRERERKQYTF6JiIiISDGYvBIRERGRYvDxsERESmJhASQnP5gnIqpmmLwSESmJSgVYWho6CiIig+GwASIiIiJSDCavRERKkpEBhIbmTRkZho6GiEjvmLwSESlJdjawenXelJ1t6GiIiPSOySsRERERKQaTVyIiIiJSDCavRERERKQYTF6JiIiISDEMmrzOnz8fzzzzDKytreHk5ITevXvjwoULOnVCQ0OhUql0platWhkoYiIiIiIyJIMmr3v37sWECRNw6NAh7Nq1C9nZ2ejcuTNSUlJ06nXt2hVxcXHaaevWrQaKmIiIiIgMyaBP2Nq+fbvO64iICDg5OeHYsWNo166dtlytVsPFxaVU68zIyEDGQ/c+TExMrJhgiYiqAgsLICHhwTwRUTVTpca83r9/HwBgZ2enUx4ZGQknJyf4+Phg9OjRSMj/4i7C/PnzYWtrq508PDwqNWYiIr1SqQBHx7xJpTJ0NEREeldlklcRwbRp09C2bVv4+/try4ODg7F27Vrs3r0bS5YswZEjR9ChQweds6sPmz17Nu7fv6+dYmNj9bUJRERERFTJDDps4GETJ07E6dOnsX//fp3ygQMHauf9/f0REBAAT09PbNmyBX379i20HrVaDbVaXenxEhEZREYGMG1a3nx4OMDvOyKqZqrEmddJkybhl19+wZ49e+Du7l5iXVdXV3h6euLSpUt6io6IqArJzgaWLs2b+HhYIqqGDHrmVUQwadIkbNq0CZGRkfD29n7ke27fvo3Y2Fi4urrqIUIiIiIiqkoMeuZ1woQJ+Oabb7Bu3TpYW1sjPj4e8fHxSEtLAwAkJydjxowZiIqKwtWrVxEZGYmePXvCwcEBffr0MWToRERERGQABj3zumzZMgBA+/btdcojIiIQGhoKY2Nj/PXXX1izZg3u3bsHV1dXBAUFYcOGDbC2tjZAxERERERkSAYfNlASjUaDHTt26CkaIiIiIqrqqsQFW0REREREpcHklYiIiIgUo8rc55WIiEpBowGiox/MExFVM0xeiYiUxMgI8PIydBRERAbDYQNEREREpBhMXomIlCQzE5g5M2/KzDR0NEREesfklYhISbKygA8/zJuysgwdDRGR3jF5JSIiIiLFYPJKRERERIpRruQ1Ov82LUREREREelSu5LVevXoICgrCN998g/T09IqOiYiIiIioSOVKXk+dOoVmzZph+vTpcHFxwZgxY3D48OGKjo2IiIiISEe5kld/f3+Eh4fj33//RUREBOLj49G2bVv4+fkhPDwcN2/erOg4iYiIiIge74ItExMT9OnTB9999x0WLlyIK1euYMaMGXB3d8ewYcMQFxdXUXESERGQ90jYM2fyJj4eloiqocdKXo8ePYrx48fD1dUV4eHhmDFjBq5cuYLdu3fj33//Ra9evSoqTiIiAvIeD+vnlzcZ8YYxRFT9mJTnTeHh4YiIiMCFCxfQrVs3rFmzBt26dYPR/3+Rent744svvkDDhg0rNFgiIiIiqt7KlbwuW7YMI0aMwPDhw+Hi4lJkndq1a2PFihWPFRwRERWQmQnMm5c3/8YbgJmZYeMhItKzciWvly5demQdMzMzhISElGf1RERUnKwsYO7cvPmZM5m8ElG1U64BUxEREfj+++8LlX///fdYvXr1YwdFRERERFSUciWvCxYsgIODQ6FyJycnzMv/dxYRERERUQUrV/IaExMDb2/vQuWenp64du3aYwdFRERERFSUciWvTk5OOH36dKHyU6dOwd7e/rGDIiIiIiIqSrmS10GDBmHy5MnYs2cPcnJykJOTg927d2PKlCkYNGhQRcdIRERERASgnHcbeP/99xETE4OOHTvCxCRvFbm5uRg2bBjHvBIRERFRpSlX8mpmZoYNGzbgvffew6lTp6DRaNC4cWN4enpWdHxERPQwc3Pg8OEH80RE1Uy5ktd8Pj4+8PHxqahYiIjoUYyNgWeeMXQUREQGU67kNScnB6tWrcLvv/+OhIQE5Obm6izfvXt3hQRHRERERPSwciWvU6ZMwapVq9C9e3f4+/tDpVJVdFxERFSUzEzgk0/y5qdM4RO2iKjaKVfyun79enz33Xfo1q1bRcdDREQlycoCXnstb378eCavRFTtlOtWWWZmZqhXr15Fx0JEREREVKJyJa/Tp0/HJ598AhGp6HiIiIiIiIpVrmED+/fvx549e7Bt2zb4+fnB1NRUZ/mPP/5YIcERERERET2sXMlrjRo10KdPn4qOhYiIiIioROVKXiMiIio6DiIiIiKiRyrXmFcAyM7Oxm+//YYvvvgCSUlJAIDr168jOTm5woIjIiIiInpYuc68xsTEoGvXrrh27RoyMjLQqVMnWFtbY9GiRUhPT8fy5csrOk4iIgLyHgm7Z8+DeSKiaqZcZ16nTJmCgIAA3L17FxqNRlvep08f/P777xUWHBERFWBsDLRvnzcZGxs6GiIivStX8rp//3689dZbMCtwc2xPT0/8+++/pV7P/Pnz8cwzz8Da2hpOTk7o3bs3Lly4oFNHRBAWFgY3NzdoNBq0b98eZ8+eLU/YRERERKRw5Upec3NzkZOTU6j8n3/+gbW1danXs3fvXkyYMAGHDh3Crl27kJ2djc6dOyMlJUVbZ9GiRQgPD8dnn32GI0eOwMXFBZ06ddKOsyUiqlaysoDPP8+bsrIMHQ0Rkd6VK3nt1KkTPv74Y+1rlUqF5ORkzJkzp0yPjN2+fTtCQ0Ph5+eHpk2bIiIiAteuXcOxY8cA5J11/fjjj/Hmm2+ib9++8Pf3x+rVq5Gamop169aVJ3QiImXLzAQmTsybMjMNHQ0Rkd6VK3n96KOPsHfvXvj6+iI9PR2DBw+Gl5cX/v33XyxcuLDcwdy/fx8AYGdnBwCIjo5GfHw8OnfurK2jVqsRGBiIgwcPFrmOjIwMJCYm6kxERERE9GQo190G3NzccPLkSXz77bc4fvw4cnNzMXLkSAwZMkTnAq6yEBFMmzYNbdu2hb+/PwAgPj4eAODs7KxT19nZGTExMUWuZ/78+Zg7d265YiAiIiKiqq1cySsAaDQajBgxAiNGjKiQQCZOnIjTp09j//79hZapVCqd1yJSqCzf7NmzMW3aNO3rxMREeHh4VEiMRERERGRY5Upe16xZU+LyYcOGlWl9kyZNwi+//II//vgD7u7u2nIXFxcAeWdgXV1dteUJCQmFzsbmU6vVUKvVZWqfiIiIiJShXMnrlClTdF5nZWUhNTUVZmZmsLCwKHXyKiKYNGkSNm3ahMjISHh7e+ss9/b2houLC3bt2oVmzZoBADIzM7F3797HGltLRERERMpUruT17t27hcouXbqEcePGYebMmaVez4QJE7Bu3Tr8/PPPsLa21o5xtbW1hUajgUqlwtSpUzFv3jzUr18f9evXx7x582BhYYHBgweXJ3QiIiIiUrByj3ktqH79+liwYAFefvll/P3336V6z7JlywAA7du31ymPiIhAaGgoAOC1115DWloaxo8fj7t376Jly5bYuXNnme4nS0T0xFCrgc2bH8wTEVUzFZa8AoCxsTGuX79e6voi8sg6KpUKYWFhCAsLe4zIiIieECYmQPfuho6CiMhgypW8/vLLLzqvRQRxcXH47LPP8Oyzz1ZIYEREREREBZUree3du7fOa5VKBUdHR3To0AFLliypiLiIiKgoWVnA2rV580OGAKamho2HiEjPypW85ubmVnQcRERUGpmZwPDhefP9+zN5JaJqp1yPhyUiIiIiMoRynXl9+AlWjxIeHl6eJoiIiIiICilX8nrixAkcP34c2dnZaNCgAQDg4sWLMDY2RvPmzbX1inuEKxERERFReZQree3Zsyesra2xevVq1KxZE0DegwuGDx+O5557DtOnT6/QIImIiIiIgHKOeV2yZAnmz5+vTVwBoGbNmnj//fd5twEiIiIiqjTlSl4TExNx48aNQuUJCQlISkp67KCIiIiIiIpSrmEDffr0wfDhw7FkyRK0atUKAHDo0CHMnDkTffv2rdAAiYjoIWo18N13D+aJiKqZciWvy5cvx4wZM/Dyyy8jKysrb0UmJhg5ciQWL15coQESEdFDTEzy7u9KRFRNlSt5tbCwwNKlS7F48WJcuXIFIoJ69erB0tKyouMjIiIiItJ6rIcUxMXFIS4uDj4+PrC0tISIVFRcRERUlOxs4Pvv86bsbENHQ0Skd+U683r79m0MGDAAe/bsgUqlwqVLl1CnTh2MGjUKNWrU4B0HiIgqS0YGMGBA3nxyct4wAiKiaqRcZ15fffVVmJqa4tq1a7CwsNCWDxw4ENu3b6+w4IiIiIiIHlaun+w7d+7Ejh074O7urlNev359xMTEVEhgREREREQFlevMa0pKis4Z13y3bt2CmrduISIiIqJKUq7ktV27dlizZo32tUqlQm5uLhYvXoygoKAKC46IiIiI6GHlGjawePFitG/fHkePHkVmZiZee+01nD17Fnfu3MGBAwcqOkYiIiIiIgDlPPPq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",
152
  "text/plain": [
153
  "<Figure size 800x500 with 1 Axes>"
154
  ]
train_ppokl_withsa.py CHANGED
@@ -16,7 +16,7 @@ def main():
16
  tokenizer = FastChemTokenizerSelfies.from_pretrained("../selftok_core")
17
 
18
  # --- Load model ---
19
- model = ChemQ3MTP.from_pretrained("../pretrained/sample-e1-mtp")
20
  model.tokenizer = tokenizer
21
  model.to(device)
22
 
@@ -34,9 +34,9 @@ def main():
34
  input_ids = dummy_input.input_ids.to(device)
35
 
36
  # Training config
37
- total_steps = 14000
38
  checkpoint_steps = {total_steps // 4, total_steps // 2, 3 * total_steps // 4, total_steps}
39
- checkpoint_dir = "./ppo_checkpoints"
40
  os.makedirs(checkpoint_dir, exist_ok=True)
41
 
42
  # --- RL Training Loop with tqdm ---
@@ -105,13 +105,18 @@ def main():
105
 
106
  # Logging every 50 steps
107
  if step % 50 == 0:
108
- print(f"\n[RL Step {step}] "
109
- f"Loss={loss.item():.4f} | "
110
- f"Valid={ppo_result['validity_rate']:.3f} | "
111
- f"Lipinski={ppo_result['lipinski_score']:.3f} | "
112
- f"Reward={ppo_result['avg_reward']:.3f} | "
113
- f"Entropy={ppo_result['entropy']:.3f} | "
114
- f"EntropyW={ppo_result['entropy_weight']:.4f}")
 
 
 
 
 
115
 
116
  sample_selfies = ppo_result['generated_selfies'][0][:100]
117
  sample_smiles = ppo_result['generated_smiles'][0] or "Invalid"
@@ -119,11 +124,6 @@ def main():
119
  print(f" Sample SMILES: {sample_smiles}")
120
 
121
 
122
- sample_selfies = ppo_result['generated_selfies'][0][:100]
123
- sample_smiles = ppo_result['generated_smiles'][0] or "Invalid"
124
- print(f" Sample SELFIES: {sample_selfies}")
125
- print(f" Sample SMILES: {sample_smiles}")
126
-
127
 
128
  print("🎉 Training complete!")
129
 
 
16
  tokenizer = FastChemTokenizerSelfies.from_pretrained("../selftok_core")
17
 
18
  # --- Load model ---
19
+ model = ChemQ3MTP.from_pretrained("./model_step_7000")
20
  model.tokenizer = tokenizer
21
  model.to(device)
22
 
 
34
  input_ids = dummy_input.input_ids.to(device)
35
 
36
  # Training config
37
+ total_steps = 1000
38
  checkpoint_steps = {total_steps // 4, total_steps // 2, 3 * total_steps // 4, total_steps}
39
+ checkpoint_dir = "./ppo_checkpoints_test"
40
  os.makedirs(checkpoint_dir, exist_ok=True)
41
 
42
  # --- RL Training Loop with tqdm ---
 
105
 
106
  # Logging every 50 steps
107
  if step % 50 == 0:
108
+ log_line = (
109
+ f"\n[RL Step {step}] "
110
+ f"Loss={loss.item():.4f} | "
111
+ f"Valid={ppo_result['validity_rate']:.3f} | "
112
+ f"Lipinski={ppo_result['lipinski_score']:.3f} | "
113
+ f"Reward={ppo_result['avg_reward']:.3f} | "
114
+ f"Entropy={ppo_result['entropy']:.3f} | "
115
+ f"EntropyW={ppo_result['entropy_weight']:.4f}"
116
+ )
117
+ if ppo_result.get("avg_sa_reward") is not None:
118
+ log_line += f" | SA={ppo_result['avg_sa_reward']:.3f}"
119
+ print(log_line)
120
 
121
  sample_selfies = ppo_result['generated_selfies'][0][:100]
122
  sample_smiles = ppo_result['generated_smiles'][0] or "Invalid"
 
124
  print(f" Sample SMILES: {sample_smiles}")
125
 
126
 
 
 
 
 
 
127
 
128
  print("🎉 Training complete!")
129