kssrikar4 commited on
Commit
d3d71fe
·
verified ·
1 Parent(s): 2dc2e3d

Upload 7 files

Browse files
config.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "RetroGPTForCausalLM"
4
+ ],
5
+ "model_type": "retrogpt",
6
+ "vocab_size": 439,
7
+ "d_model": 512,
8
+ "n_heads": 8,
9
+ "n_layers": 6,
10
+ "num_hidden_layers": 6,
11
+ "hidden_size": 512,
12
+ "num_attention_heads": 8,
13
+ "max_seq_len": 256,
14
+ "dropout": 0.1,
15
+ "sep_id": 3,
16
+ "pad_token_id": 0,
17
+ "bos_token_id": 1,
18
+ "eos_token_id": 2,
19
+ "auto_map": {
20
+ "AutoConfig": "modeling_retrogpt.RetroGPTConfig",
21
+ "AutoModelForCausalLM": "modeling_retrogpt.RetroGPTForCausalLM",
22
+ "AutoTokenizer": [
23
+ "modeling_retrogpt.RetroGPTTokenizer",
24
+ null
25
+ ]
26
+ }
27
+ }
configuration_retrogpt.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers import PretrainedConfig
2
+
3
+ class RetroGPTConfig(PretrainedConfig):
4
+ model_type = "retrogpt"
5
+ def __init__(self, d_model=512, n_heads=8, n_layers=6, max_seq_len=256,
6
+ dropout=0.1, sep_id=3, vocab_size=None, **kwargs):
7
+ super().__init__(**kwargs)
8
+ self.d_model = d_model
9
+ self.n_heads = n_heads
10
+ self.n_layers = n_layers
11
+ self.max_seq_len = max_seq_len
12
+ self.dropout = dropout
13
+ self.sep_id = sep_id
14
+ self.vocab_size = vocab_size
15
+
16
+ # Standard aliases
17
+ self.num_hidden_layers = n_layers
18
+ self.hidden_size = d_model
19
+ self.num_attention_heads = n_heads
modeling_retrogpt.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ import torch.nn as nn
3
+ import torch.nn.functional as F
4
+ import json
5
+ import os
6
+ import re
7
+ from transformers import PreTrainedModel, PretrainedConfig, PreTrainedTokenizer
8
+ from transformers.modeling_outputs import CausalLMOutputWithPast
9
+
10
+ class RetroGPTConfig(PretrainedConfig):
11
+ model_type = "retrogpt"
12
+ def __init__(self, d_model=512, n_heads=8, n_layers=6, max_seq_len=256,
13
+ dropout=0.1, sep_id=3, vocab_size=None,
14
+ pad_token_id=0, bos_token_id=1, eos_token_id=2, **kwargs):
15
+ # FIX: Pass token IDs directly to the parent class
16
+ super().__init__(pad_token_id=pad_token_id, bos_token_id=bos_token_id, eos_token_id=eos_token_id, **kwargs)
17
+ self.d_model = d_model
18
+ self.n_heads = n_heads
19
+ self.n_layers = n_layers
20
+ self.max_seq_len = max_seq_len
21
+ self.dropout = dropout
22
+ self.sep_id = sep_id
23
+ self.vocab_size = vocab_size
24
+
25
+ self.num_hidden_layers = n_layers
26
+ self.hidden_size = d_model
27
+ self.num_attention_heads = n_heads
28
+
29
+ class RMSNorm(nn.Module):
30
+ def __init__(self, dim, eps=1e-6):
31
+ super().__init__()
32
+ self.eps = eps
33
+ self.weight = nn.Parameter(torch.ones(dim))
34
+ def forward(self, x):
35
+ variance = x.pow(2).mean(-1, keepdim=True)
36
+ return self.weight * (x * torch.rsqrt(variance + self.eps))
37
+
38
+ class SwiGLU(nn.Module):
39
+ def __init__(self, dim):
40
+ super().__init__()
41
+ hidden_dim = int(8 * dim / 3)
42
+ self.w1 = nn.Linear(dim, hidden_dim, bias=False)
43
+ self.w2 = nn.Linear(hidden_dim, dim, bias=False)
44
+ self.w3 = nn.Linear(dim, hidden_dim, bias=False)
45
+ def forward(self, x): return self.w2(F.silu(self.w1(x)) * self.w3(x))
46
+
47
+ class Attention(nn.Module):
48
+ def __init__(self, config):
49
+ super().__init__()
50
+ self.n_heads = config.n_heads
51
+ self.head_dim = config.d_model // config.n_heads
52
+ self.wq, self.wk, self.wv, self.wo = [nn.Linear(config.d_model, config.d_model, bias=False) for _ in range(4)]
53
+ self.dropout_p = config.dropout
54
+ def forward(self, x, mask=None):
55
+ B, T, C = x.size()
56
+ q = self.wq(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
57
+ k = self.wk(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
58
+ v = self.wv(x).view(B, T, self.n_heads, self.head_dim).transpose(1, 2)
59
+ attn_mask = (mask == 1.0) if mask is not None else None
60
+ y = F.scaled_dot_product_attention(q, k, v, attn_mask=attn_mask, dropout_p=self.dropout_p if self.training else 0.0)
61
+ return self.wo(y.transpose(1, 2).contiguous().view(B, T, C))
62
+
63
+ class Block(nn.Module):
64
+ def __init__(self, config):
65
+ super().__init__()
66
+ self.norm1, self.attn, self.norm2, self.mlp = RMSNorm(config.d_model), Attention(config), RMSNorm(config.d_model), SwiGLU(config.d_model)
67
+ def forward(self, x, mask=None):
68
+ x = x + self.attn(self.norm1(x), mask)
69
+ x = x + self.mlp(self.norm2(x))
70
+ return x
71
+
72
+ class RetroGPTForCausalLM(PreTrainedModel):
73
+ config_class = RetroGPTConfig
74
+
75
+ def __init__(self, config):
76
+ super().__init__(config)
77
+ self.token_emb = nn.Embedding(config.vocab_size, config.d_model)
78
+ self.pos_emb = nn.Embedding(config.max_seq_len, config.d_model)
79
+ self.drop = nn.Dropout(config.dropout)
80
+ self.blocks = nn.ModuleList([Block(config) for _ in range(config.n_layers)])
81
+ self.norm = RMSNorm(config.d_model)
82
+ self.head = nn.Linear(config.d_model, config.vocab_size, bias=False)
83
+ self.post_init()
84
+
85
+ def get_input_embeddings(self): return self.token_emb
86
+ def set_input_embeddings(self, value): self.token_emb = value
87
+ def get_output_embeddings(self): return self.head
88
+ def set_output_embeddings(self, new_embeddings): self.head = new_embeddings
89
+ def tie_weights(self, *args, **kwargs): self.head.weight = self.token_emb.weight
90
+
91
+ @property
92
+ def _tied_weights_keys(self): return ["head.weight"]
93
+
94
+ # FIX: Added attention_mask parameter
95
+ def forward(self, input_ids, attention_mask=None, labels=None, **kwargs):
96
+ idx = input_ids
97
+ B, T = idx.size()
98
+ x = self.drop(self.token_emb(idx) + self.pos_emb(torch.arange(T, device=idx.device)))
99
+
100
+ # Base causal mask
101
+ mask = torch.tril(torch.ones(T, T, device=idx.device)).unsqueeze(0).expand(B, T, T).clone()
102
+
103
+ # FIX: Integrate Hugging Face's padding mask safely
104
+ if attention_mask is not None:
105
+ mask = mask * attention_mask.unsqueeze(1).expand(B, T, T)
106
+
107
+ # Apply <sep> token logic
108
+ if hasattr(self.config, "sep_id"):
109
+ sep_masks = (idx == self.config.sep_id)
110
+ if sep_masks.any():
111
+ sep_idx = sep_masks.int().argmax(dim=1)
112
+ has_sep = sep_masks.any(dim=1)
113
+ for b in range(B):
114
+ if has_sep[b]: mask[b, :sep_idx[b]+1, :sep_idx[b]+1] = 1.0
115
+
116
+ for block in self.blocks: x = block(x, mask.unsqueeze(1))
117
+ logits = self.head(self.norm(x))
118
+ loss = F.cross_entropy(logits.view(-1, logits.size(-1)), labels.view(-1), ignore_index=-100) if labels is not None else None
119
+ return CausalLMOutputWithPast(loss=loss, logits=logits)
120
+
121
+ def prepare_inputs_for_generation(self, input_ids, **kwargs):
122
+ # FIX: Ensure attention mask is passed during generation loop
123
+ attention_mask = kwargs.get("attention_mask", None)
124
+ return {"input_ids": input_ids, "attention_mask": attention_mask}
125
+
126
+ class RetroGPTTokenizer(PreTrainedTokenizer):
127
+ vocab_files_names = {"vocab_file": "vocab.json"}
128
+ model_input_names = ["input_ids", "attention_mask"]
129
+
130
+ def __init__(self, vocab_file=None, bos_token="<s>", eos_token="</s>", sep_token="<sep>", pad_token="<pad>", **kwargs):
131
+ if vocab_file is None: vocab_file = os.path.join(os.path.dirname(__file__), "vocab.json")
132
+ if os.path.exists(vocab_file):
133
+ with open(vocab_file, "r") as f: self.stoi = json.load(f)
134
+ else: self.stoi = {}
135
+ self.itos = {int(v): k for k, v in self.stoi.items()}
136
+ self.pattern = re.compile(r"(\[[^\]]+]|Br?|Cl?|N|O|S|P|F|I|b|c|n|o|s|p|\(|\)|\.|=|#|-|\+|\\|\/|:|~|@|\?|>|\*|\$|\%[0-9]{2}|[0-9])")
137
+ super().__init__(bos_token=bos_token, eos_token=eos_token, sep_token=sep_token, pad_token=pad_token, **kwargs)
138
+
139
+ # FIX: Explicitly set special IDs so tokenizer.pad() doesn't fail
140
+ self.pad_token_id = self.stoi.get(pad_token, 0)
141
+ self.bos_token_id = self.stoi.get(bos_token, 1)
142
+ self.eos_token_id = self.stoi.get(eos_token, 2)
143
+
144
+ @property
145
+ def vocab_size(self): return len(self.stoi)
146
+ def get_vocab(self): return {k: int(v) for k, v in self.stoi.items()}
147
+ def _tokenize(self, text): return self.pattern.findall(text)
148
+ def _convert_token_to_id(self, token): return self.stoi.get(token, self.pad_token_id)
149
+ def _convert_id_to_token(self, index): return self.itos.get(index, self.pad_token)
150
+ def save_vocabulary(self, save_directory, filename_prefix=None):
151
+ vocab_file = os.path.join(save_directory, (filename_prefix + "-" if filename_prefix else "") + "vocab.json")
152
+ with open(vocab_file, "w") as f: json.dump(self.stoi, f, indent=2)
153
+ return (vocab_file,)
pytorch_model.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7869b691cd478f54bf63a451031d6d17a04c901ccad9cb9788bd9854250e1738
3
+ size 76953330
tokenization_retrogpt.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ import re
4
+ from transformers import PreTrainedTokenizer
5
+
6
+ class RetroGPTTokenizer(PreTrainedTokenizer):
7
+ vocab_files_names = {"vocab_file": "vocab.json"}
8
+ model_input_names = ["input_ids", "attention_mask"]
9
+
10
+ def __init__(self, vocab_file=None, bos_token="<s>", eos_token="</s>", sep_token="<sep>", pad_token="<pad>", **kwargs):
11
+ if vocab_file is None:
12
+ # Look for vocab.json in the same directory as the script
13
+ vocab_file = os.path.join(os.path.dirname(__file__), "vocab.json")
14
+
15
+ if os.path.exists(vocab_file):
16
+ with open(vocab_file, "r") as f:
17
+ self.stoi = json.load(f)
18
+ else:
19
+ self.stoi = {}
20
+
21
+ self.itos = {int(v): k for k, v in self.stoi.items()}
22
+
23
+ # Exact pattern from app.py
24
+ self.pattern = re.compile(r"(\[[^\]]+]|Br?|Cl?|N|O|S|P|F|I|b|c|n|o|s|p|\(|\)|\.|=|#|-|\+|\\|\/|:|~|@|\?|>|\*|\$|\%[0-9]{2}|[0-9])")
25
+
26
+ super().__init__(
27
+ bos_token=bos_token,
28
+ eos_token=eos_token,
29
+ sep_token=sep_token,
30
+ pad_token=pad_token,
31
+ **kwargs
32
+ )
33
+
34
+ @property
35
+ def vocab_size(self):
36
+ return len(self.stoi)
37
+
38
+ def get_vocab(self):
39
+ return {k: int(v) for k, v in self.stoi.items()}
40
+
41
+ def _tokenize(self, text):
42
+ return self.pattern.findall(text)
43
+
44
+ def _convert_token_to_id(self, token):
45
+ return self.stoi.get(token, self.stoi.get(self.pad_token))
46
+
47
+ def _convert_id_to_token(self, index):
48
+ return self.itos.get(index, self.pad_token)
49
+
50
+ def save_vocabulary(self, save_directory, filename_prefix=None):
51
+ vocab_file = os.path.join(save_directory, (filename_prefix + "-" if filename_prefix else "") + "vocab.json")
52
+ with open(vocab_file, "w") as f:
53
+ json.dump(self.stoi, f, indent=2)
54
+ return (vocab_file,)
tokenizer_config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "<s>",
3
+ "eos_token": "</s>",
4
+ "unk_token": "<pad>",
5
+ "pad_token": "<pad>",
6
+ "sep_token": "<sep>",
7
+ "model_max_length": 256,
8
+ "tokenizer_class": "RetroGPTTokenizer"
9
+ }
vocab.json ADDED
@@ -0,0 +1,441 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "<pad>": 0,
3
+ "<s>": 1,
4
+ "</s>": 2,
5
+ "<sep>": 3,
6
+ "#": 4,
7
+ "%10": 5,
8
+ "%11": 6,
9
+ "%12": 7,
10
+ "%13": 8,
11
+ "%14": 9,
12
+ "%15": 10,
13
+ "%16": 11,
14
+ "%17": 12,
15
+ "%18": 13,
16
+ "%19": 14,
17
+ "%20": 15,
18
+ "%21": 16,
19
+ "%22": 17,
20
+ "%23": 18,
21
+ "(": 19,
22
+ ")": 20,
23
+ "-": 21,
24
+ ".": 22,
25
+ "/": 23,
26
+ "1": 24,
27
+ "2": 25,
28
+ "3": 26,
29
+ "4": 27,
30
+ "5": 28,
31
+ "6": 29,
32
+ "7": 30,
33
+ "8": 31,
34
+ "9": 32,
35
+ "=": 33,
36
+ "B": 34,
37
+ "Br": 35,
38
+ "C": 36,
39
+ "Cl": 37,
40
+ "F": 38,
41
+ "I": 39,
42
+ "N": 40,
43
+ "O": 41,
44
+ "P": 42,
45
+ "S": 43,
46
+ "[11CH3]": 44,
47
+ "[11CH4]": 45,
48
+ "[123I-]": 46,
49
+ "[125I]": 47,
50
+ "[131I]": 48,
51
+ "[13CH4]": 49,
52
+ "[13NH3]": 50,
53
+ "[13c]": 51,
54
+ "[14C]": 52,
55
+ "[15OH2]": 53,
56
+ "[18FH]": 54,
57
+ "[18F]": 55,
58
+ "[1HH]": 56,
59
+ "[2H-]": 57,
60
+ "[2H]": 58,
61
+ "[32P]": 59,
62
+ "[3H]": 60,
63
+ "[99Tc+4]": 61,
64
+ "[99Tc]": 62,
65
+ "[Ag+2]": 63,
66
+ "[Ag+3]": 64,
67
+ "[Ag+]": 65,
68
+ "[Ag-]": 66,
69
+ "[Ag]": 67,
70
+ "[Al+2]": 68,
71
+ "[Al+3]": 69,
72
+ "[Al+]": 70,
73
+ "[Al-3]": 71,
74
+ "[Al-]": 72,
75
+ "[AlH-]": 73,
76
+ "[AlH2+]": 74,
77
+ "[AlH2-]": 75,
78
+ "[AlH3]": 76,
79
+ "[AlH4-]": 77,
80
+ "[AlH]": 78,
81
+ "[Al]": 79,
82
+ "[Ar]": 80,
83
+ "[As+3]": 81,
84
+ "[As+]": 82,
85
+ "[As-]": 83,
86
+ "[AsH+]": 84,
87
+ "[AsH2]": 85,
88
+ "[AsH3]": 86,
89
+ "[AsH4+]": 87,
90
+ "[AsH]": 88,
91
+ "[As]": 89,
92
+ "[Au+3]": 90,
93
+ "[Au-]": 91,
94
+ "[Au]": 92,
95
+ "[B+2]": 93,
96
+ "[B+3]": 94,
97
+ "[B+]": 95,
98
+ "[B-]": 96,
99
+ "[BH-]": 97,
100
+ "[BH2-]": 98,
101
+ "[BH3-]": 99,
102
+ "[BH4-]": 100,
103
+ "[BH]": 101,
104
+ "[B]": 102,
105
+ "[Ba+2]": 103,
106
+ "[Ba]": 104,
107
+ "[Be+2]": 105,
108
+ "[Bi+2]": 106,
109
+ "[Bi+3]": 107,
110
+ "[BiH3]": 108,
111
+ "[Bi]": 109,
112
+ "[Br+2]": 110,
113
+ "[Br+]": 111,
114
+ "[Br-]": 112,
115
+ "[BrH+]": 113,
116
+ "[Br]": 114,
117
+ "[C+4]": 115,
118
+ "[C+]": 116,
119
+ "[C-]": 117,
120
+ "[C@@H]": 118,
121
+ "[C@@]": 119,
122
+ "[C@H]": 120,
123
+ "[C@]": 121,
124
+ "[CH+]": 122,
125
+ "[CH-]": 123,
126
+ "[CH2+]": 124,
127
+ "[CH2-]": 125,
128
+ "[CH3+3]": 126,
129
+ "[CH3+]": 127,
130
+ "[CH3-]": 128,
131
+ "[CH]": 129,
132
+ "[C]": 130,
133
+ "[Ca+2]": 131,
134
+ "[Ca]": 132,
135
+ "[Cd+2]": 133,
136
+ "[Cd+]": 134,
137
+ "[Cd]": 135,
138
+ "[Ce+2]": 136,
139
+ "[Ce+3]": 137,
140
+ "[Ce+4]": 138,
141
+ "[Ce]": 139,
142
+ "[Cl+2]": 140,
143
+ "[Cl+3]": 141,
144
+ "[Cl+]": 142,
145
+ "[Cl-]": 143,
146
+ "[ClH+]": 144,
147
+ "[Cl]": 145,
148
+ "[Co+2]": 146,
149
+ "[Co+3]": 147,
150
+ "[Co]": 148,
151
+ "[Cr+2]": 149,
152
+ "[Cr+3]": 150,
153
+ "[Cr+4]": 151,
154
+ "[Cr+6]": 152,
155
+ "[Cr-]": 153,
156
+ "[Cr]": 154,
157
+ "[Cs+]": 155,
158
+ "[Cs]": 156,
159
+ "[Cu+2]": 157,
160
+ "[Cu+3]": 158,
161
+ "[Cu+4]": 159,
162
+ "[Cu+]": 160,
163
+ "[Cu-2]": 161,
164
+ "[Cu-]": 162,
165
+ "[Cu]": 163,
166
+ "[Dy+3]": 164,
167
+ "[Dy]": 165,
168
+ "[Er+3]": 166,
169
+ "[Eu+3]": 167,
170
+ "[Eu]": 168,
171
+ "[F-]": 169,
172
+ "[F]": 170,
173
+ "[Fe+2]": 171,
174
+ "[Fe+3]": 172,
175
+ "[Fe+4]": 173,
176
+ "[Fe+6]": 174,
177
+ "[Fe+]": 175,
178
+ "[Fe-3]": 176,
179
+ "[Fe-4]": 177,
180
+ "[Fe]": 178,
181
+ "[Ga+2]": 179,
182
+ "[Ga+3]": 180,
183
+ "[Ga+]": 181,
184
+ "[Ga]": 182,
185
+ "[Gd+3]": 183,
186
+ "[Gd]": 184,
187
+ "[Ge+2]": 185,
188
+ "[Ge+3]": 186,
189
+ "[GeH2]": 187,
190
+ "[GeH3]": 188,
191
+ "[GeH]": 189,
192
+ "[Ge]": 190,
193
+ "[H+]": 191,
194
+ "[H-]": 192,
195
+ "[H]": 193,
196
+ "[HeH]": 194,
197
+ "[He]": 195,
198
+ "[Hf+2]": 196,
199
+ "[Hf+3]": 197,
200
+ "[Hf+4]": 198,
201
+ "[Hf]": 199,
202
+ "[Hg+2]": 200,
203
+ "[Hg+]": 201,
204
+ "[Hg]": 202,
205
+ "[I+2]": 203,
206
+ "[I+3]": 204,
207
+ "[I+]": 205,
208
+ "[I-]": 206,
209
+ "[IH+]": 207,
210
+ "[IH2+]": 208,
211
+ "[IH]": 209,
212
+ "[I]": 210,
213
+ "[In+3]": 211,
214
+ "[In+]": 212,
215
+ "[In]": 213,
216
+ "[Ir+3]": 214,
217
+ "[Ir]": 215,
218
+ "[K+]": 216,
219
+ "[K]": 217,
220
+ "[La+3]": 218,
221
+ "[La]": 219,
222
+ "[Li+]": 220,
223
+ "[Li]": 221,
224
+ "[Mg+2]": 222,
225
+ "[Mg+]": 223,
226
+ "[Mg]": 224,
227
+ "[Mn+2]": 225,
228
+ "[Mn+3]": 226,
229
+ "[Mn+4]": 227,
230
+ "[Mn]": 228,
231
+ "[Mo+2]": 229,
232
+ "[Mo+4]": 230,
233
+ "[Mo]": 231,
234
+ "[N+3]": 232,
235
+ "[N+]": 233,
236
+ "[N-]": 234,
237
+ "[N@+]": 235,
238
+ "[N@@+]": 236,
239
+ "[N@@H+]": 237,
240
+ "[N@@]": 238,
241
+ "[N@]": 239,
242
+ "[NH+]": 240,
243
+ "[NH-]": 241,
244
+ "[NH2+]": 242,
245
+ "[NH2-]": 243,
246
+ "[NH3+]": 244,
247
+ "[NH4+]": 245,
248
+ "[N]": 246,
249
+ "[Na+]": 247,
250
+ "[Na]": 248,
251
+ "[Nb+3]": 249,
252
+ "[Nb+4]": 250,
253
+ "[Nb+5]": 251,
254
+ "[Nb]": 252,
255
+ "[Nd+3]": 253,
256
+ "[Nd+]": 254,
257
+ "[Nd]": 255,
258
+ "[Ni+2]": 256,
259
+ "[Ni+4]": 257,
260
+ "[Ni]": 258,
261
+ "[O+]": 259,
262
+ "[O-2]": 260,
263
+ "[O-]": 261,
264
+ "[OH+]": 262,
265
+ "[OH-]": 263,
266
+ "[OH2+]": 264,
267
+ "[OH3+]": 265,
268
+ "[OH]": 266,
269
+ "[O]": 267,
270
+ "[Os]": 268,
271
+ "[P+2]": 269,
272
+ "[P+3]": 270,
273
+ "[P+5]": 271,
274
+ "[P+]": 272,
275
+ "[P-3]": 273,
276
+ "[P-]": 274,
277
+ "[P@@]": 275,
278
+ "[P@]": 276,
279
+ "[PH+]": 277,
280
+ "[PH2+]": 278,
281
+ "[PH2-]": 279,
282
+ "[PH2]": 280,
283
+ "[PH3+]": 281,
284
+ "[PH3]": 282,
285
+ "[PH4+]": 283,
286
+ "[PH4]": 284,
287
+ "[PH5]": 285,
288
+ "[PH]": 286,
289
+ "[P]": 287,
290
+ "[Pb+2]": 288,
291
+ "[Pb+3]": 289,
292
+ "[Pb+4]": 290,
293
+ "[Pb]": 291,
294
+ "[Pd+2]": 292,
295
+ "[Pd-2]": 293,
296
+ "[Pd]": 294,
297
+ "[Pr+3]": 295,
298
+ "[Pr]": 296,
299
+ "[Pt+2]": 297,
300
+ "[Pt+]": 298,
301
+ "[Pt-2]": 299,
302
+ "[Pt-]": 300,
303
+ "[Pt]": 301,
304
+ "[Rb+]": 302,
305
+ "[Re+5]": 303,
306
+ "[Re+]": 304,
307
+ "[Re]": 305,
308
+ "[Rh+2]": 306,
309
+ "[Rh+3]": 307,
310
+ "[Rh]": 308,
311
+ "[Ru+2]": 309,
312
+ "[Ru+3]": 310,
313
+ "[Ru+]": 311,
314
+ "[Ru-]": 312,
315
+ "[Ru]": 313,
316
+ "[S+]": 314,
317
+ "[S-2]": 315,
318
+ "[S-]": 316,
319
+ "[S@@]": 317,
320
+ "[S@]": 318,
321
+ "[SH+]": 319,
322
+ "[SH-]": 320,
323
+ "[SH2+]": 321,
324
+ "[SH2]": 322,
325
+ "[SH3+]": 323,
326
+ "[SH]": 324,
327
+ "[S]": 325,
328
+ "[Sb+2]": 326,
329
+ "[Sb+3]": 327,
330
+ "[Sb+5]": 328,
331
+ "[Sb+]": 329,
332
+ "[Sb-]": 330,
333
+ "[Sb]": 331,
334
+ "[Sc+3]": 332,
335
+ "[Sc]": 333,
336
+ "[Se+]": 334,
337
+ "[Se-2]": 335,
338
+ "[Se-]": 336,
339
+ "[SeH+]": 337,
340
+ "[SeH-]": 338,
341
+ "[SeH2]": 339,
342
+ "[SeH]": 340,
343
+ "[Se]": 341,
344
+ "[Si+2]": 342,
345
+ "[Si+4]": 343,
346
+ "[Si+]": 344,
347
+ "[Si-]": 345,
348
+ "[Si@@H]": 346,
349
+ "[Si@@]": 347,
350
+ "[Si@H]": 348,
351
+ "[Si@]": 349,
352
+ "[SiH-]": 350,
353
+ "[SiH2]": 351,
354
+ "[SiH3]": 352,
355
+ "[SiH4]": 353,
356
+ "[SiH]": 354,
357
+ "[Si]": 355,
358
+ "[Sm+2]": 356,
359
+ "[Sm+3]": 357,
360
+ "[Sm]": 358,
361
+ "[Sn+2]": 359,
362
+ "[Sn+3]": 360,
363
+ "[Sn+4]": 361,
364
+ "[Sn+6]": 362,
365
+ "[Sn+]": 363,
366
+ "[SnH2]": 364,
367
+ "[SnH3]": 365,
368
+ "[SnH4]": 366,
369
+ "[SnH]": 367,
370
+ "[Sn]": 368,
371
+ "[Sr+2]": 369,
372
+ "[Sr]": 370,
373
+ "[Ta+2]": 371,
374
+ "[Ta+5]": 372,
375
+ "[TaH3]": 373,
376
+ "[Ta]": 374,
377
+ "[Tb+3]": 375,
378
+ "[Tb]": 376,
379
+ "[Tc+6]": 377,
380
+ "[Tc]": 378,
381
+ "[TeH2]": 379,
382
+ "[TeH]": 380,
383
+ "[Te]": 381,
384
+ "[Ti+2]": 382,
385
+ "[Ti+3]": 383,
386
+ "[Ti+4]": 384,
387
+ "[Ti+]": 385,
388
+ "[Ti]": 386,
389
+ "[Tl+2]": 387,
390
+ "[Tl+3]": 388,
391
+ "[Tl+]": 389,
392
+ "[Tl]": 390,
393
+ "[U+2]": 391,
394
+ "[U+4]": 392,
395
+ "[U+6]": 393,
396
+ "[U]": 394,
397
+ "[V+2]": 395,
398
+ "[V+3]": 396,
399
+ "[V+4]": 397,
400
+ "[V+5]": 398,
401
+ "[V+]": 399,
402
+ "[V]": 400,
403
+ "[W+6]": 401,
404
+ "[W]": 402,
405
+ "[Xe]": 403,
406
+ "[Y+3]": 404,
407
+ "[Y]": 405,
408
+ "[Yb+2]": 406,
409
+ "[Yb+3]": 407,
410
+ "[Yb]": 408,
411
+ "[Zn+2]": 409,
412
+ "[Zn+]": 410,
413
+ "[Zn]": 411,
414
+ "[Zr+2]": 412,
415
+ "[Zr+3]": 413,
416
+ "[Zr+4]": 414,
417
+ "[Zr+]": 415,
418
+ "[Zr]": 416,
419
+ "[c+]": 417,
420
+ "[c-]": 418,
421
+ "[cH+]": 419,
422
+ "[cH-]": 420,
423
+ "[n+]": 421,
424
+ "[n-]": 422,
425
+ "[nH+]": 423,
426
+ "[nH]": 424,
427
+ "[o+]": 425,
428
+ "[pH]": 426,
429
+ "[s+]": 427,
430
+ "[sH+]": 428,
431
+ "[se+]": 429,
432
+ "[se]": 430,
433
+ "[siH]": 431,
434
+ "[te]": 432,
435
+ "b": 433,
436
+ "c": 434,
437
+ "n": 435,
438
+ "o": 436,
439
+ "p": 437,
440
+ "s": 438
441
+ }