AMT-Studio commited on
Commit
bc6e2fd
·
verified ·
1 Parent(s): b318c07

Upload 12 files

Browse files
LICENSE ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 StellarAI Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ 关于商业使用的说明
26
+ ====================
27
+
28
+ 本项目 (StellarAI 模型代码) 在 MIT 许可证下发布,完全可商用。
29
+
30
+ 您可以自由地:
31
+ ✅ 用于商业产品
32
+ ✅ 修改源码
33
+ ✅ 分发再发行
34
+ ✅ 申请专利
35
+ ✅ 私有化部署
36
+
37
+ 您需要:
38
+ 📝 在产品中保留本 LICENSE 文件的版权声明
39
+ 📝 如修改了源码,建议在变更记录中注明
40
+
41
+ 模型权重的额外说明:
42
+ - 本仓库提供的是**随机初始化的权重**和**训练代码**,不包含经过数据训练的预训练权重。
43
+ - 如果您使用受版权或许可证限制的数据集训练此模型,请确保您有权使用这些数据,
44
+ 并且训练出的权重文件的许可证符合原始数据集的要求。
45
+ - 对于**您自行训练出的权重**,您完全拥有其所有权,可按任何许可证发布(包括商用)。
46
+
47
+ 第三方数据的合规性:
48
+ - 训练和使用模型时请遵守当地法律法规(如《生成式人工智能服务管理暂行办法》等)。
49
+ - 请勿使用本模型从事违法违规活动。
README.md CHANGED
@@ -1,3 +1,213 @@
1
  ---
2
  license: mit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: mit
3
+ language:
4
+ - zh
5
+ - en
6
+ tags:
7
+ - stellarai
8
+ - multimodal
9
+ - tiny-llm
10
+ - causal-lm
11
+ - text-generation
12
+ - vision
13
+ - cpu-friendly
14
+ library_name: transformers
15
+ pipeline_tag: text-generation
16
+ widget:
17
+ - text: "Artificial intelligence is"
18
+ example_title: "English Generation"
19
+ - text: "人工智能是一种"
20
+ example_title: "Chinese Generation"
21
  ---
22
+
23
+ # StellarAI-Tiny
24
+
25
+ **A lightweight multimodal language model trained from scratch — ~50M parameters (0.05B), runs on CPU with 4GB RAM.**
26
+
27
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
28
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0+-ee4c2c)](https://pytorch.org/)
29
+ [![Model Size](https://img.shields.io/badge/Size-~93MB-blue)](#)
30
+ [![Parameters](https://img.shields.io/badge/Params-50M-green)](#)
31
+
32
+ ---
33
+
34
+ ## Overview
35
+
36
+ StellarAI-Tiny is a from-scratch, bilingual (Chinese + English) causal language model with multimodal vision support. Designed for educational and prototyping purposes, it requires minimal hardware and ships with a built-in plugin system for tool calling.
37
+
38
+ | Feature | Description |
39
+ |---------|-------------|
40
+ | Lightweight | 50M parameters, ~93MB weights |
41
+ | CPU-friendly | Runs smoothly on CPU with 4GB RAM |
42
+ | Transformer | 4-layer text encoder + RoPE positional encoding |
43
+ | Multimodal | CNN + ViT hybrid vision encoder + cross-attention fusion |
44
+ | Bilingual | Chinese + English mixed tokenization & generation |
45
+ | License | MIT — fully permissive for commercial use |
46
+ | Plugins | Built-in calculator, knowledge base, translator, text tools, time queries |
47
+
48
+ ---
49
+
50
+ ## Architecture
51
+
52
+ ```
53
+ StellarAI-Tiny (~50M Parameters)
54
+ ├── Embedding vocab(32000) x d_model(384)
55
+ ├── Text Transformer (4 layers)
56
+ │ ├── Multi-Head Self-Attention (6 heads, RoPE)
57
+ │ └── FFN (GELU, intermediate=1536)
58
+ ├── Vision Encoder (CNN + ViT)
59
+ │ ├── CNN Feature Extractor (4 layers: 24→48→96→192 channels)
60
+ │ └── ViT Transformer (2 layers, 6 heads)
61
+ ├── Fusion Block (1 layer)
62
+ │ ├── Self-Attention + Cross-Attention
63
+ │ └── FFN (1536)
64
+ └── LM Head (tied weights)
65
+ ```
66
+
67
+ | Config | Value |
68
+ |--------|-------|
69
+ | `d_model` | 384 |
70
+ | `num_hidden_layers` | 4 |
71
+ | `num_attention_heads` | 6 |
72
+ | `intermediate_size` | 1536 |
73
+ | `vocab_size` | 32000 |
74
+ | `max_position_embeddings` | 1024 |
75
+ | `vision_num_layers` | 2 |
76
+ | `fusion_num_layers` | 1 |
77
+ | Total parameters | ~50M (0.05B) |
78
+
79
+ ---
80
+
81
+ ## Quick Start
82
+
83
+ ### Requirements
84
+
85
+ ```bash
86
+ pip install torch transformers safetensors
87
+ ```
88
+
89
+ ### Text Generation
90
+
91
+ ```python
92
+ from transformers import AutoModelForCausalLM, AutoConfig, AutoTokenizer
93
+ import torch
94
+
95
+ model_name = "amtstudio/stellarai-tiny" # or your local path
96
+
97
+ config = AutoConfig.from_pretrained(model_name, trust_remote_code=True)
98
+ model = AutoModelForCausalLM.from_pretrained(
99
+ model_name,
100
+ config=config,
101
+ trust_remote_code=True,
102
+ torch_dtype=torch.float32,
103
+ )
104
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
105
+
106
+ # Generate
107
+ prompt = "Artificial intelligence is"
108
+ inputs = tokenizer(prompt, return_tensors="pt")
109
+
110
+ output_ids = model.generate(
111
+ **inputs,
112
+ max_new_tokens=64,
113
+ temperature=0.7,
114
+ top_k=40,
115
+ do_sample=True,
116
+ pad_token_id=tokenizer.pad_token_id,
117
+ eos_token_id=tokenizer.eos_token_id,
118
+ )
119
+
120
+ print(tokenizer.decode(output_ids[0], skip_special_tokens=True))
121
+ ```
122
+
123
+ ### Using `generate_text` Convenience Method
124
+
125
+ ```python
126
+ result = model.generate_text(
127
+ prompt="Artificial intelligence is",
128
+ tokenizer=tokenizer,
129
+ max_new_tokens=100,
130
+ temperature=0.8,
131
+ )
132
+ print(result)
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Training Details
138
+
139
+ | Item | Detail |
140
+ |------|--------|
141
+ | Training steps | 12,000 (5,000 base + 7,000 general training) |
142
+ | Corpus | 19,846 lines of bilingual data (AI, CS, NLP, math, programming, reasoning, dialogue, plugins) |
143
+ | Optimizer | AdamW (lr=3e-4, wd=0.01) |
144
+ | LR Schedule | Cosine annealing + Warmup (100 steps) |
145
+ | Batch size | 4 |
146
+ | Sequence length | 128 |
147
+ | Gradient clipping | 1.0 |
148
+ | Final loss | 4.06 (ppl ≈ 58) |
149
+ | Vocabulary size | 11,030 |
150
+ | Device | CPU |
151
+ | Training time | ~3.2 hours |
152
+
153
+ The training corpus was built from a mix of hand-crafted bilingual data, synthetic instruction-tuning data, and Chinese NLP datasets across 10+ domains. The model was trained with a next-token-prediction objective using the custom `SimpleTokenizer` (BPE).
154
+
155
+ ---
156
+
157
+ ## File Structure
158
+
159
+ ```
160
+ ├── config.json # HF model configuration
161
+ ├── configuration_stellarai.py # Custom PretrainedConfig class
162
+ ├── modeling_stellarai.py # Custom PreTrainedModel class
163
+ ├── tokenization_stellarai.py # Custom PreTrainedTokenizer class
164
+ ├── model.safetensors # Safetensors weights (93.6 MB)
165
+ ├── pytorch_model.bin # PyTorch weights (93.6 MB)
166
+ ├── tokenizer_config.json # Tokenizer configuration
167
+ ├── special_tokens_map.json # Special token mappings
168
+ ├── tokenizer.json # HF tokenizer definition (BPE)
169
+ ├── backend_tokenizer.json # Original backend tokenizer
170
+ ├── vocab.json # BPE vocabulary (11,030 tokens)
171
+ ├── merges.txt # BPE merge rules
172
+ ├── README.md # This file
173
+ └── LICENSE # MIT License
174
+ ```
175
+
176
+ ---
177
+
178
+ ## Limitations
179
+
180
+ > **Important**: This is a lightweight educational / prototyping model.
181
+
182
+ 1. **Limited knowledge**: Trained on ~19K lines of curated data. Knowledge coverage is narrow.
183
+ 2. **Factual accuracy**: May produce inaccurate, nonsensical, or hallucinated content.
184
+ 3. **Generation quality**: Suitable for demonstrating basic language modeling — not production-level dialogue.
185
+ 4. **Vision capability**: The vision encoder is pre-trained on text-only data. VQA requires additional fine-tuning with image-text pairs.
186
+ 5. **Plugin calling**: The model learned the `[TOOL:xxx]` format but calling accuracy needs improvement.
187
+ 6. **Not suitable for**: Production environments, medical/legal/financial domains.
188
+
189
+ ### Suggested Improvements
190
+
191
+ - [ ] Expand corpus to 50K+ lines or use public datasets (WikiText, C4, Oscar)
192
+ - [ ] Increase training to 50K+ steps
193
+ - [ ] Add real dialogue data (ShareGPT, Alpaca format) for SFT
194
+ - [ ] Collect image-text pairs (e.g., COCO captions) to fine-tune multimodal capability
195
+ - [ ] Try larger config: 6 layers / 512d / 8 heads (~0.1B)
196
+
197
+ ---
198
+
199
+ ## License
200
+
201
+ [MIT License](LICENSE) — fully permissive for personal and commercial use.
202
+
203
+ ---
204
+
205
+ ## Acknowledgements
206
+
207
+ - Architecture inspired by GPT-2, LLaMA, ViT, and BLIP-2
208
+ - Built with Hugging Face `transformers`
209
+ - RoPE: *RoFormer: Enhanced Transformer with Rotary Position Embedding*
210
+
211
+ ---
212
+
213
+ **StellarAI** — Exploring AI, one star at a time.
backend_tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
config.json ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": ["StellarAIForCausalLM"],
3
+ "model_type": "stellarai",
4
+ "auto_map": {
5
+ "AutoConfig": "configuration_stellarai.StellarAIConfig",
6
+ "AutoModelForCausalLM": "modeling_stellarai.StellarAIForCausalLM",
7
+ "AutoTokenizer": "tokenization_stellarai.StellarAITokenizer"
8
+ },
9
+
10
+ "d_model": 384,
11
+ "num_hidden_layers": 4,
12
+ "num_attention_heads": 6,
13
+ "intermediate_size": 1536,
14
+ "hidden_act": "gelu",
15
+ "max_position_embeddings": 1024,
16
+ "vocab_size": 32000,
17
+ "dropout": 0.1,
18
+ "layer_norm_eps": 1e-6,
19
+
20
+ "rope_theta": 10000.0,
21
+ "use_cache": true,
22
+ "pad_token_id": 0,
23
+ "bos_token_id": 1,
24
+ "eos_token_id": 2,
25
+ "unk_token_id": 3,
26
+ "sep_token_id": 6,
27
+ "vision_token_id": 7,
28
+ "boi_token_id": 8,
29
+ "eoi_token_id": 9,
30
+
31
+ "vision_cfg": {
32
+ "image_size": 224,
33
+ "patch_size": 16,
34
+ "num_channels": 3,
35
+ "cnn_channels": [24, 48, 96, 192],
36
+ "vision_num_layers": 2,
37
+ "vision_num_heads": 6,
38
+ "vision_ff_dim": 768,
39
+ "vision_num_patches": 196
40
+ },
41
+
42
+ "mm_fusion_cfg": {
43
+ "fusion_num_layers": 1,
44
+ "fusion_num_heads": 6,
45
+ "fusion_ff_dim": 1536
46
+ },
47
+
48
+ "lm_head_bias": true,
49
+ "use_weight_tying": true,
50
+
51
+ "torch_dtype": "float32",
52
+ "transformers_version": "4.30.0"
53
+ }
configuration_stellarai.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ """ StellarAI model configuration """
3
+
4
+ from transformers import PretrainedConfig
5
+ from typing import Dict, Any
6
+
7
+
8
+ class StellarAIConfig(PretrainedConfig):
9
+ r"""
10
+ This is the configuration class for StellarAI.
11
+ """
12
+ model_type = "stellarai"
13
+ keys_to_ignore_at_inference = ["past_key_values"]
14
+ attribute_map = {
15
+ "hidden_size": "d_model",
16
+ }
17
+
18
+ def __init__(
19
+ self,
20
+ # Generic transformer
21
+ d_model: int = 384,
22
+ num_hidden_layers: int = 4,
23
+ num_attention_heads: int = 6,
24
+ intermediate_size: int = 1536,
25
+ hidden_act: str = "gelu",
26
+ max_position_embeddings: int = 1024,
27
+ vocab_size: int = 32000,
28
+ dropout: float = 0.1,
29
+ layer_norm_eps: float = 1e-6,
30
+ # RoPE
31
+ rope_theta: float = 10000.0,
32
+ use_cache: bool = True,
33
+ # Special tokens
34
+ pad_token_id: int = 0,
35
+ bos_token_id: int = 1,
36
+ eos_token_id: int = 2,
37
+ unk_token_id: int = 3,
38
+ sep_token_id: int = 6,
39
+ vision_token_id: int = 7,
40
+ boi_token_id: int = 8,
41
+ eoi_token_id: int = 9,
42
+ # Vision encoder (private nested dict to avoid HF fusion_mapping scanning)
43
+ vision_cfg: Dict[str, Any] = None,
44
+ # Multimodal fusion (private nested dict)
45
+ mm_fusion_cfg: Dict[str, Any] = None,
46
+ # LM head
47
+ lm_head_bias: bool = True,
48
+ use_weight_tying: bool = True,
49
+ **kwargs,
50
+ ):
51
+ super().__init__(
52
+ pad_token_id=pad_token_id,
53
+ bos_token_id=bos_token_id,
54
+ eos_token_id=eos_token_id,
55
+ return_dict=True,
56
+ **kwargs,
57
+ )
58
+ self.d_model = d_model
59
+ self.num_hidden_layers = num_hidden_layers
60
+ self.num_attention_heads = num_attention_heads
61
+ self.intermediate_size = intermediate_size
62
+ self.hidden_act = hidden_act
63
+ self.max_position_embeddings = max_position_embeddings
64
+ self.vocab_size = vocab_size
65
+ self.dropout = dropout
66
+ self.layer_norm_eps = layer_norm_eps
67
+ self.rope_theta = rope_theta
68
+ self.use_cache = use_cache
69
+
70
+ self.sep_token_id = sep_token_id
71
+ self.vision_token_id = vision_token_id
72
+ self.boi_token_id = boi_token_id
73
+ self.eoi_token_id = eoi_token_id
74
+
75
+ # Store vision parameters
76
+ if vision_cfg is None:
77
+ vision_cfg = {
78
+ "image_size": 224,
79
+ "patch_size": 16,
80
+ "num_channels": 3,
81
+ "cnn_channels": [24, 48, 96, 192],
82
+ "vision_num_layers": 2,
83
+ "vision_num_heads": 6,
84
+ "vision_ff_dim": 768,
85
+ "vision_num_patches": 196,
86
+ }
87
+ self.vision_cfg = vision_cfg
88
+
89
+ # Store fusion parameters
90
+ if mm_fusion_cfg is None:
91
+ mm_fusion_cfg = {
92
+ "fusion_num_layers": 1,
93
+ "fusion_num_heads": 6,
94
+ "fusion_ff_dim": 1536,
95
+ }
96
+ self.mm_fusion_cfg = mm_fusion_cfg
97
+
98
+ self.lm_head_bias = lm_head_bias
99
+ self.use_weight_tying = use_weight_tying
merges.txt ADDED
@@ -0,0 +1,2019 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #version: 0.2
2
+ t h
3
+ i n
4
+ o n</w>
5
+ t e
6
+ a n
7
+ t i
8
+ p y
9
+ py th
10
+ pyth on</w>
11
+ a r
12
+ t o
13
+ r e
14
+ to o
15
+ o r
16
+ too l</w>
17
+ e n
18
+ c o
19
+ a t
20
+ l o
21
+ t r
22
+ d e
23
+ l e
24
+ a i</w>
25
+ r o
26
+ a s
27
+ l i
28
+ in g</w>
29
+ e r
30
+ m e</w>
31
+ n o
32
+ u r
33
+ s e
34
+ a l
35
+ a c
36
+ a l</w>
37
+ th e</w>
38
+ i n</w>
39
+ n e
40
+ l l
41
+ 0 0</w>
42
+ e r</w>
43
+ u n
44
+ s te
45
+ o n
46
+ s t
47
+ g e</w>
48
+ an d</w>
49
+ i c
50
+ m a
51
+ ti me</w>
52
+ i s</w>
53
+ d a
54
+ e s</w>
55
+ o r</w>
56
+ an s
57
+ tr ans
58
+ ste ll
59
+ stell ar
60
+ stellar ai</w>
61
+ in t</w>
62
+ ti on</w>
63
+ 1 0</w>
64
+ t o</w>
65
+ l e</w>
66
+ at e</w>
67
+ p ro
68
+ i s
69
+ f or
70
+ x t</w>
71
+ p o
72
+ i t</w>
73
+ 1 9
74
+ lo g</w>
75
+ se l
76
+ sel f</w>
77
+ a b
78
+ m p
79
+ f or</w>
80
+ s q
81
+ c l
82
+ g e
83
+ o f</w>
84
+ p r
85
+ de f</w>
86
+ i t
87
+ 2 0</w>
88
+ c h
89
+ s t</w>
90
+ m o
91
+ c e
92
+ d i
93
+ 1 00</w>
94
+ a p
95
+ t ur
96
+ c al
97
+ n a
98
+ as s</w>
99
+ k no
100
+ w or
101
+ te r</w>
102
+ ar r</w>
103
+ kno w
104
+ s o
105
+ c e</w>
106
+ d n
107
+ co n
108
+ know le
109
+ knowle d
110
+ knowled ge</w>
111
+ e x
112
+ h t
113
+ i g
114
+ ti on
115
+ cal c</w>
116
+ pr int</w>
117
+ d o
118
+ a s</w>
119
+ te r
120
+ q u
121
+ t s</w>
122
+ m e
123
+ 2 5</w>
124
+ d e</w>
125
+ l ate</w>
126
+ or t</w>
127
+ na me</w>
128
+ cl ass</w>
129
+ 2 0
130
+ trans late</w>
131
+ f i
132
+ u s
133
+ l a
134
+ re tur
135
+ retur n</w>
136
+ h e
137
+ k e
138
+ d at
139
+ 1 5</w>
140
+ trans for
141
+ 1 0
142
+ te xt</w>
143
+ p e</w>
144
+ ge t</w>
145
+ 1 2</w>
146
+ ht t
147
+ m er</w>
148
+ dn a</w>
149
+ r a
150
+ i f</w>
151
+ r an
152
+ re a
153
+ s tr
154
+ s s</w>
155
+ v er
156
+ at h</w>
157
+ m s</w>
158
+ p e
159
+ dat a</w>
160
+ l d</w>
161
+ 2 4</w>
162
+ d p</w>
163
+ v e</w>
164
+ co mp
165
+ s u
166
+ i p</w>
167
+ tion s</w>
168
+ da te
169
+ date time</w>
170
+ f ro
171
+ transfor mer</w>
172
+ m i
173
+ 5 0</w>
174
+ 3 0</w>
175
+ d x</w>
176
+ s y
177
+ s on</w>
178
+ w e
179
+ lo g
180
+ fro m</w>
181
+ a n</w>
182
+ r i
183
+ b o
184
+ j son</w>
185
+ d u
186
+ a tion</w>
187
+ u t</w>
188
+ p re
189
+ s s
190
+ m m
191
+ l s</w>
192
+ l y</w>
193
+ g en
194
+ n ing</w>
195
+ 4 5</w>
196
+ p t</w>
197
+ u t
198
+ a t</w>
199
+ s e</w>
200
+ ig h
201
+ u e</w>
202
+ p er
203
+ c i
204
+ 1 2
205
+ htt p</w>
206
+ h i
207
+ ar e</w>
208
+ w a
209
+ v o
210
+ wor ld</w>
211
+ m en
212
+ sq l</w>
213
+ t ar
214
+ c ur
215
+ te d</w>
216
+ u l
217
+ as y
218
+ asy n
219
+ 6 0</w>
220
+ le ar
221
+ v e
222
+ r t</w>
223
+ is i
224
+ ab le</w>
225
+ s ort</w>
226
+ w it
227
+ l li
228
+ b y</w>
229
+ sq rt</w>
230
+ wit h</w>
231
+ s i
232
+ t h</w>
233
+ da y</w>
234
+ a v
235
+ a d
236
+ tar get</w>
237
+ no w</w>
238
+ y s</w>
239
+ 2 1</w>
240
+ b e
241
+ he ll
242
+ hell o</w>
243
+ f u
244
+ m ath</w>
245
+ c t</w>
246
+ f s</w>
247
+ 4 0</w>
248
+ ap i</w>
249
+ st r</w>
250
+ for ma
251
+ c h</w>
252
+ i mp
253
+ imp ort</w>
254
+ ne xt</w>
255
+ 20 24</w>
256
+ p s</w>
257
+ an g
258
+ 1 4
259
+ f un
260
+ s h
261
+ s in
262
+ f f
263
+ v isi
264
+ ma x</w>
265
+ f lo
266
+ t y
267
+ li st</w>
268
+ n u
269
+ a ge</w>
270
+ te m</w>
271
+ m b
272
+ s p
273
+ f t</w>
274
+ igh t</w>
275
+ le c
276
+ t y</w>
277
+ co mm
278
+ in e</w>
279
+ lear ning</w>
280
+ m an
281
+ t c
282
+ m y
283
+ p h
284
+ mi d</w>
285
+ f ac
286
+ do m</w>
287
+ r e</w>
288
+ al l</w>
289
+ too ls</w>
290
+ 1 8
291
+ g o
292
+ 1 5
293
+ p ar
294
+ it y</w>
295
+ d s</w>
296
+ t a</w>
297
+ a b</w>
298
+ p u</w>
299
+ ty pe</w>
300
+ d ic
301
+ ran ge</w>
302
+ in it</w>
303
+ p l
304
+ co un
305
+ o s</w>
306
+ a tions</w>
307
+ d ing</w>
308
+ asyn c</w>
309
+ 5 6</w>
310
+ m p</w>
311
+ 1 8</w>
312
+ 1 9</w>
313
+ m on
314
+ comp u
315
+ ac h
316
+ h u
317
+ ur al</w>
318
+ e d</w>
319
+ b i
320
+ tc p</w>
321
+ t e</w>
322
+ n p</w>
323
+ i e
324
+ j av
325
+ 1 6</w>
326
+ g ra
327
+ t u
328
+ e l
329
+ w hi
330
+ whi le</w>
331
+ m er
332
+ ic k
333
+ as s
334
+ th o
335
+ st a
336
+ pro ce
337
+ p a
338
+ po w
339
+ o u
340
+ 1 1</w>
341
+ en ti
342
+ in forma
343
+ informa tion</w>
344
+ r u
345
+ o p
346
+ vo l
347
+ men t</w>
348
+ te s</w>
349
+ i z
350
+ ac k</w>
351
+ b as
352
+ s pe
353
+ ti c</w>
354
+ dn s</w>
355
+ h as</w>
356
+ tr i
357
+ 9 9</w>
358
+ 3 5</w>
359
+ ne t</w>
360
+ ic i
361
+ nu ms</w>
362
+ ap p
363
+ dic t</w>
364
+ el se</w>
365
+ d a</w>
366
+ li f
367
+ ran dom</w>
368
+ p y</w>
369
+ i ter
370
+ 9 0</w>
371
+ in te
372
+ te ch
373
+ tech no
374
+ techno log
375
+ technolog y</w>
376
+ un i
377
+ s in</w>
378
+ st an
379
+ er s</w>
380
+ ne t
381
+ net wor
382
+ le s</w>
383
+ th e
384
+ v er</w>
385
+ co de</w>
386
+ c es</w>
387
+ ma n</w>
388
+ in f
389
+ e c
390
+ w s</w>
391
+ pro du
392
+ fu l</w>
393
+ a li
394
+ s c
395
+ ar g
396
+ 9 5</w>
397
+ lo w</w>
398
+ de l
399
+ ke t</w>
400
+ 2 3</w>
401
+ da ys</w>
402
+ r n
403
+ b pe</w>
404
+ p ath</w>
405
+ a g
406
+ po int</w>
407
+ ad d</w>
408
+ tr y</w>
409
+ ex ce
410
+ ro r</w>
411
+ j o
412
+ i dx</w>
413
+ f in
414
+ ti c
415
+ o b
416
+ de e
417
+ iter tools</w>
418
+ no n
419
+ inte lli
420
+ intelli gen
421
+ 1 4</w>
422
+ 1 7</w>
423
+ co s
424
+ a x</w>
425
+ la r</w>
426
+ ter s</w>
427
+ in ter
428
+ en g
429
+ in s</w>
430
+ un d</w>
431
+ v en
432
+ ic al</w>
433
+ or g
434
+ org an
435
+ g it</w>
436
+ hu man</w>
437
+ de r
438
+ c d</w>
439
+ del ta</w>
440
+ f a
441
+ 0 0
442
+ qu e
443
+ c ket</w>
444
+ d fs</w>
445
+ x 1</w>
446
+ 3 6</w>
447
+ 2 8
448
+ i d</w>
449
+ d ro
450
+ f t
451
+ te n
452
+ s en
453
+ c pu</w>
454
+ 5 g</w>
455
+ a u
456
+ o l</w>
457
+ en d</w>
458
+ se t</w>
459
+ la mb
460
+ lamb da</w>
461
+ i m
462
+ er ror</w>
463
+ p er</w>
464
+ m in</w>
465
+ le ft</w>
466
+ r ight</w>
467
+ fac to
468
+ sy s</w>
469
+ w i
470
+ c r
471
+ ar ti
472
+ m or
473
+ ti me
474
+ 2 00</w>
475
+ li m</w>
476
+ m ach
477
+ th at</w>
478
+ k s</w>
479
+ l ang
480
+ lang u
481
+ sy ste
482
+ fun c
483
+ v es</w>
484
+ w h
485
+ en er
486
+ ener g
487
+ energ y</w>
488
+ str u
489
+ re s</w>
490
+ ac ce
491
+ he l
492
+ so ur
493
+ tur e</w>
494
+ vol u
495
+ ti ve</w>
496
+ r ap
497
+ re d
498
+ que ue</w>
499
+ su b
500
+ so cket</w>
501
+ h ig
502
+ hig h</w>
503
+ t ing</w>
504
+ d y</w>
505
+ x 2</w>
506
+ y 1</w>
507
+ 2 x</w>
508
+ 3 x</w>
509
+ k m</w>
510
+ to day</w>
511
+ d ate</w>
512
+ ro pe</w>
513
+ so ft
514
+ b er
515
+ a da
516
+ m it</w>
517
+ as c
518
+ ri pt</w>
519
+ app end</w>
520
+ i tem</w>
521
+ ma p</w>
522
+ exce pt</w>
523
+ pe n</w>
524
+ t xt</w>
525
+ jo in</w>
526
+ en u
527
+ z ip</w>
528
+ qu ick
529
+ le n</w>
530
+ co l
531
+ col lec
532
+ collec tions</w>
533
+ facto ri
534
+ factori al</w>
535
+ 10 00</w>
536
+ tr ue</w>
537
+ s or
538
+ ke y</w>
539
+ ch o
540
+ co py</w>
541
+ c lo
542
+ g lo
543
+ glo b
544
+ is e</w>
545
+ ex it</w>
546
+ asyn ci
547
+ a wa
548
+ awa it</w>
549
+ 1 3</w>
550
+ p r</w>
551
+ arti f
552
+ artif ici
553
+ artifici al</w>
554
+ intelligen ce</w>
555
+ 14 15
556
+ 1415 9</w>
557
+ lif e</w>
558
+ pow er</w>
559
+ mo d</w>
560
+ compu ter</w>
561
+ s ci
562
+ 19 45</w>
563
+ π r</w>
564
+ v ing</w>
565
+ n s</w>
566
+ it s</w>
567
+ re qu
568
+ requ i
569
+ fi c</w>
570
+ l in
571
+ v i
572
+ y o
573
+ yo u</w>
574
+ con t
575
+ tr a
576
+ n at
577
+ langu age</w>
578
+ o ne
579
+ men ts</w>
580
+ as e</w>
581
+ re le
582
+ htt ps</w>
583
+ p ut</w>
584
+ de le
585
+ dele te</w>
586
+ red is</w>
587
+ do c
588
+ c i</w>
589
+ 4 2</w>
590
+ p i</w>
591
+ fun c</w>
592
+ non e</w>
593
+ ge ti
594
+ geti tem</w>
595
+ c s
596
+ cs v</w>
597
+ u x</w>
598
+ b fs</w>
599
+ no de</w>
600
+ cur r</w>
601
+ visi ted</w>
602
+ ne igh
603
+ neigh b
604
+ neighb or</w>
605
+ 5 7</w>
606
+ 6 5</w>
607
+ we b</w>
608
+ e t</w>
609
+ to ke
610
+ toke n</w>
611
+ i on</w>
612
+ jav asc
613
+ javasc ript</w>
614
+ 8 0</w>
615
+ flo at</w>
616
+ p le</w>
617
+ s g</w>
618
+ fi l
619
+ fil ter</w>
620
+ o pen</w>
621
+ rea d</w>
622
+ ac e</w>
623
+ u p
624
+ p i
625
+ pi vo
626
+ pivo t</w>
627
+ quick sort</w>
628
+ coun ter</w>
629
+ di r</w>
630
+ str f
631
+ strf time</w>
632
+ cho ic
633
+ me tho
634
+ metho d</w>
635
+ pro per
636
+ b u
637
+ v al
638
+ en ter</w>
639
+ i ter</w>
640
+ m ul
641
+ ss ing</w>
642
+ i l</w>
643
+ asynci o</w>
644
+ ar t</w>
645
+ 1 50</w>
646
+ 12 3</w>
647
+ go o
648
+ 4 0
649
+ ou r</w>
650
+ h 2
651
+ h2 o</w>
652
+ en ce</w>
653
+ 4 8</w>
654
+ 6 9</w>
655
+ 6 4</w>
656
+ 2 8</w>
657
+ on e</w>
658
+ a c</w>
659
+ a d</w>
660
+ a as</w>
661
+ dee p</w>
662
+ mo de
663
+ ne ural</w>
664
+ inter net</w>
665
+ con ne
666
+ c ts</w>
667
+ on s</w>
668
+ in stan
669
+ comm un
670
+ commun ic
671
+ st s</w>
672
+ e ar
673
+ proce ss</w>
674
+ d is
675
+ k e</w>
676
+ comp ut
677
+ comput ing</w>
678
+ se cur
679
+ in es</w>
680
+ fu ture</w>
681
+ nat ural</w>
682
+ gen er
683
+ ne w</w>
684
+ ti es</w>
685
+ a to
686
+ un der
687
+ al lo
688
+ allo ws</w>
689
+ w are</w>
690
+ v an
691
+ p ip</w>
692
+ re st
693
+ rest ful</w>
694
+ no sql</w>
695
+ doc k
696
+ dock er</w>
697
+ or e</w>
698
+ no t</w>
699
+ arg s</w>
700
+ re mo
701
+ de fa
702
+ defa ul
703
+ re ver
704
+ at t
705
+ inf o</w>
706
+ 2 56</w>
707
+ tion al</w>
708
+ ac ti
709
+ se d</w>
710
+ pre v</w>
711
+ a m</w>
712
+ w t</w>
713
+ y 2</w>
714
+ 7 2</w>
715
+ 2 7</w>
716
+ rn a</w>
717
+ p h</w>
718
+ li ty</w>
719
+ 12 3
720
+ 123 45</w>
721
+ s ig
722
+ dro po
723
+ dropo ut</w>
724
+ c n
725
+ cn n</w>
726
+ e ff
727
+ r l
728
+ rl h
729
+ rlh f</w>
730
+ w ar
731
+ jav a</w>
732
+ bo ol</w>
733
+ comp le
734
+ comple x</w>
735
+ po p</w>
736
+ e li
737
+ sq u
738
+ g re
739
+ do g</w>
740
+ enu mer
741
+ enumer ate</w>
742
+ t re
743
+ y ie
744
+ yie ld</w>
745
+ u d
746
+ m at
747
+ cl ass
748
+ proper ty</w>
749
+ ar e
750
+ lo c
751
+ glob al</w>
752
+ ra ise</w>
753
+ mul ti
754
+ proce ssing</w>
755
+ s to
756
+ cr is
757
+ cris pr</w>
758
+ 3 d</w>
759
+ a r</w>
760
+ 5 3</w>
761
+ 6 7
762
+ po w</w>
763
+ 19 3
764
+ 19 7
765
+ 2 2</w>
766
+ cos θ</w>
767
+ wa y</w>
768
+ mach ine</w>
769
+ networ ks</w>
770
+ p u
771
+ f o
772
+ en ab
773
+ ch an
774
+ g rea
775
+ te st</w>
776
+ l eng
777
+ l l</w>
778
+ de s</w>
779
+ en t</w>
780
+ ear th</w>
781
+ e ss
782
+ ess enti
783
+ essenti al</w>
784
+ s is</w>
785
+ li g
786
+ h t</w>
787
+ ch e
788
+ che m
789
+ per i
790
+ an al
791
+ anal y
792
+ compu ters</w>
793
+ stru c
794
+ organ iz
795
+ acce ss</w>
796
+ con tr
797
+ o ver</w>
798
+ ap pro
799
+ ac hi
800
+ achi e
801
+ re d</w>
802
+ soft ware</w>
803
+ tic s</w>
804
+ s o</w>
805
+ de c
806
+ po st</w>
807
+ d b</w>
808
+ ss l</w>
809
+ sc ore</w>
810
+ ab c
811
+ time delta</w>
812
+ att r</w>
813
+ ru n</w>
814
+ us ers</w>
815
+ th er</w>
816
+ z one
817
+ zone info</w>
818
+ we a
819
+ so l
820
+ l c
821
+ 3 l</w>
822
+ 5 l</w>
823
+ 1 20</w>
824
+ 28 57</w>
825
+ 7 9
826
+ re volu
827
+ in e
828
+ networ k</w>
829
+ c rea
830
+ m v
831
+ mv c</w>
832
+ we b
833
+ web socket</w>
834
+ j wt</w>
835
+ x x</w>
836
+ 8 7
837
+ 4 3
838
+ re s
839
+ p tion</w>
840
+ visi on</w>
841
+ l as
842
+ g pt</w>
843
+ di ff
844
+ m u
845
+ k l</w>
846
+ 0 5
847
+ 05 b</w>
848
+ b le
849
+ 3 2</w>
850
+ al ph
851
+ tu ple</w>
852
+ eli f</w>
853
+ l t</w>
854
+ re pl
855
+ repl ace</w>
856
+ up per</w>
857
+ v al</w>
858
+ s wa
859
+ swa p</w>
860
+ n ²</w>
861
+ de qu
862
+ dequ e</w>
863
+ sor ted</w>
864
+ forma t</w>
865
+ mat ch</w>
866
+ se ar
867
+ sear ch</w>
868
+ cl s</w>
869
+ are a</w>
870
+ ob j</w>
871
+ mo st</w>
872
+ comm on</w>
873
+ ch a
874
+ cha in</w>
875
+ co mb
876
+ fin al
877
+ final ly</w>
878
+ rea ding</w>
879
+ st art</w>
880
+ 0 1</w>
881
+ 2 9</w>
882
+ 18 0</w>
883
+ 6 0
884
+ e n</w>
885
+ ch ang
886
+ 10 24</w>
887
+ goo d</w>
888
+ we e
889
+ wee k
890
+ week day</w>
891
+ log 10</w>
892
+ 19 53</w>
893
+ sci ence</w>
894
+ 6 3
895
+ 7 1</w>
896
+ 8 6</w>
897
+ g dp</w>
898
+ 19 8
899
+ ht m
900
+ p an
901
+ 4 ac</w>
902
+ 2 a</w>
903
+ co s</w>
904
+ b i</w>
905
+ m ing</w>
906
+ wor k</w>
907
+ d ri
908
+ c ar
909
+ at ter
910
+ l ar
911
+ e ts</w>
912
+ lear n</w>
913
+ pre sen
914
+ pro gra
915
+ progra mm
916
+ programm ing</w>
917
+ sy n
918
+ syste m</w>
919
+ bi lli
920
+ communic ation</w>
921
+ chan ge</w>
922
+ co o
923
+ ce d</w>
924
+ in cl
925
+ f ru
926
+ fru its</w>
927
+ pro te
928
+ so lar</w>
929
+ pl an
930
+ ar o
931
+ aro und</w>
932
+ co ver
933
+ the sis</w>
934
+ lig ht</w>
935
+ in to</w>
936
+ chem ical</w>
937
+ g ro
938
+ s er
939
+ v ation</w>
940
+ ut h</w>
941
+ li ke</w>
942
+ di f
943
+ hel p</w>
944
+ de ve
945
+ deve lo
946
+ sour ces</w>
947
+ c y
948
+ iz ed</w>
949
+ cont a
950
+ conta ins</w>
951
+ appro x
952
+ approx i
953
+ approxi ma
954
+ approxima te
955
+ approximate ly</w>
956
+ v ac
957
+ spe ci
958
+ w in
959
+ h o
960
+ it al</w>
961
+ k i
962
+ z e</w>
963
+ gen e
964
+ gene tic</w>
965
+ li ving</w>
966
+ organ is
967
+ organis ms</w>
968
+ bi o
969
+ under st
970
+ underst and</w>
971
+ sour ce</w>
972
+ c y</w>
973
+ b ut</w>
974
+ ou s</w>
975
+ rele van
976
+ relevan t</w>
977
+ ur l</w>
978
+ coun t</w>
979
+ ex p</w>
980
+ p ass</w>
981
+ flo or</w>
982
+ c ap
983
+ is instan
984
+ isinstan ce</w>
985
+ ma in</w>
986
+ ass er
987
+ bas e
988
+ s lo
989
+ slo ts</w>
990
+ func tools</w>
991
+ re du
992
+ par ti
993
+ li b</w>
994
+ log g
995
+ logg ing</w>
996
+ de r</w>
997
+ sq li
998
+ b in
999
+ lin ux</w>
1000
+ g a
1001
+ d 1</w>
1002
+ d 2</w>
1003
+ re f</w>
1004
+ in de
1005
+ rever sed</w>
1006
+ m r
1007
+ se s</w>
1008
+ k mp</w>
1009
+ ar y</w>
1010
+ k o
1011
+ pr e</w>
1012
+ m n</w>
1013
+ d o</w>
1014
+ r h</w>
1015
+ n x</w>
1016
+ sin x</w>
1017
+ u v</w>
1018
+ d u</w>
1019
+ σ p</w>
1020
+ 6 8</w>
1021
+ sin θ</w>
1022
+ 5 x</w>
1023
+ 7 5</w>
1024
+ ali ce</w>
1025
+ bo b</w>
1026
+ 10 x</w>
1027
+ 1 3
1028
+ 4 5
1029
+ 45 8</w>
1030
+ at p</w>
1031
+ e ver
1032
+ e ct</w>
1033
+ revolu tion
1034
+ pe op
1035
+ peop le</w>
1036
+ e lec
1037
+ grea t</w>
1038
+ lo ve</w>
1039
+ on l
1040
+ onl ine</w>
1041
+ ac h</w>
1042
+ ab i
1043
+ abi lity</w>
1044
+ sy n</w>
1045
+ 9 87
1046
+ 43 21</w>
1047
+ 14 4</w>
1048
+ t an
1049
+ eff ici
1050
+ rn n</w>
1051
+ r u</w>
1052
+ v it</w>
1053
+ ber t</w>
1054
+ fi x</w>
1055
+ c li
1056
+ us ion</w>
1057
+ f 1</w>
1058
+ u p</w>
1059
+ ag o</w>
1060
+ g pu</w>
1061
+ ar es</w>
1062
+ gre et</w>
1063
+ m sg</w>
1064
+ squ are</w>
1065
+ an im
1066
+ anim al</w>
1067
+ w r
1068
+ sp li
1069
+ spli t</w>
1070
+ fi b</w>
1071
+ e q</w>
1072
+ st ud
1073
+ str ing</w>
1074
+ mp s</w>
1075
+ r s</w>
1076
+ choic e</w>
1077
+ loc al</w>
1078
+ val u
1079
+ th reading</w>
1080
+ g il</w>
1081
+ i te
1082
+ ite ms</w>
1083
+ an y</w>
1084
+ v r</w>
1085
+ i de</w>
1086
+ 4 56</w>
1087
+ chang ing</w>
1088
+ mor ning</w>
1089
+ ma k
1090
+ time sta
1091
+ timesta mp</w>
1092
+ uni x</w>
1093
+ 0 7</w>
1094
+ 5 0
1095
+ di v
1096
+ div mod</w>
1097
+ m a</w>
1098
+ 18 69</w>
1099
+ htm l</w>
1100
+ b x</w>
1101
+ b ²</w>
1102
+ δ x</w>
1103
+ b c</w>
1104
+ a 1</w>
1105
+ ic e</w>
1106
+ or i
1107
+ c an</w>
1108
+ i d
1109
+ p atter
1110
+ patter ns</w>
1111
+ lar ge</w>
1112
+ hu man
1113
+ m is
1114
+ mode ls</w>
1115
+ us e</w>
1116
+ presen t
1117
+ mp le</w>
1118
+ e co
1119
+ me ters</w>
1120
+ v ic
1121
+ vic es</w>
1122
+ l ing</w>
1123
+ g u
1124
+ im pro
1125
+ impro ves</w>
1126
+ re n
1127
+ y our</w>
1128
+ u s</w>
1129
+ incl u
1130
+ ge t
1131
+ con si
1132
+ su n</w>
1133
+ tic al</w>
1134
+ ab o
1135
+ abo ut</w>
1136
+ s ur
1137
+ ph o
1138
+ pho to
1139
+ photo syn
1140
+ photosyn thesis</w>
1141
+ con ver
1142
+ sci enti
1143
+ vol ves</w>
1144
+ co ver</w>
1145
+ qu an
1146
+ quan tu
1147
+ quantu m</w>
1148
+ tu res</w>
1149
+ syste ms</w>
1150
+ tr ack</w>
1151
+ co ll
1152
+ coll ab
1153
+ collab or
1154
+ clo u
1155
+ clou d</w>
1156
+ pro vi
1157
+ secur ity</w>
1158
+ b ra
1159
+ bra in</w>
1160
+ ne u
1161
+ neu ro
1162
+ neuro ns</w>
1163
+ i mm
1164
+ speci fic</w>
1165
+ di se
1166
+ dise as
1167
+ diseas es</w>
1168
+ inf ec
1169
+ ne w
1170
+ le e
1171
+ so li
1172
+ c ul
1173
+ man a
1174
+ mana ge
1175
+ manage ment</w>
1176
+ ob j
1177
+ c le
1178
+ ss ion</w>
1179
+ li ste
1180
+ se con
1181
+ secon d</w>
1182
+ u m</w>
1183
+ peri o
1184
+ t able</w>
1185
+ e le
1186
+ ato mi
1187
+ atomi c</w>
1188
+ in sp
1189
+ insp i
1190
+ enab les</w>
1191
+ mach ines</w>
1192
+ en co
1193
+ at ing</w>
1194
+ in no
1195
+ c re
1196
+ v ity</w>
1197
+ ac e
1198
+ hel ps</w>
1199
+ dec isi
1200
+ decisi ons</w>
1201
+ cont in
1202
+ u dp</w>
1203
+ s m
1204
+ re st</w>
1205
+ r s
1206
+ ac id</w>
1207
+ my sql</w>
1208
+ mon go
1209
+ mongo db</w>
1210
+ t ls</w>
1211
+ s 1</w>
1212
+ s 2</w>
1213
+ gra de</w>
1214
+ w n</w>
1215
+ to y</w>
1216
+ fi r
1217
+ lo ad</w>
1218
+ g cd</w>
1219
+ s a
1220
+ r a</w>
1221
+ defaul t
1222
+ default dict</w>
1223
+ d d</w>
1224
+ produ ct</w>
1225
+ lo w
1226
+ low er</w>
1227
+ asser t</w>
1228
+ h as
1229
+ redu ce</w>
1230
+ o ut
1231
+ h lib</w>
1232
+ en code</w>
1233
+ base 64</w>
1234
+ 6 4
1235
+ cur s
1236
+ curs or</w>
1237
+ p ick
1238
+ pick le</w>
1239
+ ur lli
1240
+ urlli b</w>
1241
+ stru ct</w>
1242
+ ac l
1243
+ acl ass</w>
1244
+ ven v</w>
1245
+ my en
1246
+ myen v</w>
1247
+ requi re
1248
+ require ments</w>
1249
+ c ase</w>
1250
+ val ue</w>
1251
+ i a</w>
1252
+ g rap
1253
+ sub class</w>
1254
+ wea k
1255
+ weak ref</w>
1256
+ spe c</w>
1257
+ b y
1258
+ ro und</w>
1259
+ tr un
1260
+ trun c</w>
1261
+ inde x</w>
1262
+ leng th</w>
1263
+ mr o</w>
1264
+ bas es</w>
1265
+ c us
1266
+ cus to
1267
+ bu ff
1268
+ buff er</w>
1269
+ mer ge
1270
+ merge sort</w>
1271
+ te mp</w>
1272
+ b st</w>
1273
+ av l</w>
1274
+ tri e</w>
1275
+ di j
1276
+ dij k
1277
+ dijk str
1278
+ dijkstr a</w>
1279
+ k a
1280
+ lc s</w>
1281
+ b ac
1282
+ choic es</w>
1283
+ k ar
1284
+ kar p</w>
1285
+ ic k</w>
1286
+ m in
1287
+ bin ary</w>
1288
+ tar j
1289
+ tarj an</w>
1290
+ en ding</w>
1291
+ l z
1292
+ 7 7</w>
1293
+ x 1
1294
+ 2 ab</w>
1295
+ b a</w>
1296
+ cos x</w>
1297
+ x dx</w>
1298
+ 7 18
1299
+ 718 28</w>
1300
+ d t</w>
1301
+ 9 7</w>
1302
+ 2 l</w>
1303
+ 10 a</w>
1304
+ 10 b</w>
1305
+ 8 4</w>
1306
+ 10 00
1307
+ 14 2857</w>
1308
+ 4 7</w>
1309
+ 2 k</w>
1310
+ 19 4
1311
+ 12 7
1312
+ 2 9
1313
+ 29 9
1314
+ 299 79
1315
+ 29979 2
1316
+ 299792 458</w>
1317
+ 0 00</w>
1318
+ 3 65</w>
1319
+ in d
1320
+ ind us
1321
+ w as</w>
1322
+ revolution ized</w>
1323
+ c ation</w>
1324
+ elec tri
1325
+ electri c</w>
1326
+ di g
1327
+ dig ital</w>
1328
+ contr o
1329
+ ver s
1330
+ b us
1331
+ bus ine
1332
+ busine ss</w>
1333
+ wh er
1334
+ wher e</w>
1335
+ me as
1336
+ ce ll</w>
1337
+ ma g
1338
+ mag ne
1339
+ magne tic</w>
1340
+ h a
1341
+ be co
1342
+ o p</w>
1343
+ en cr
1344
+ encr y
1345
+ secur e</w>
1346
+ or m</w>
1347
+ o a
1348
+ oa uth</w>
1349
+ c d
1350
+ cd n</w>
1351
+ mode l</w>
1352
+ v ie
1353
+ vie w</w>
1354
+ l le
1355
+ 40 4</w>
1356
+ 5 00</w>
1357
+ 6 5
1358
+ 3 1</w>
1359
+ 6 7</w>
1360
+ 20 25</w>
1361
+ cal en
1362
+ calen da
1363
+ calenda r</w>
1364
+ mon day</w>
1365
+ re l
1366
+ rel u</w>
1367
+ sig mo
1368
+ sigmo id</w>
1369
+ tan h</w>
1370
+ res net</w>
1371
+ effici en
1372
+ efficien t
1373
+ se q</w>
1374
+ soft max</w>
1375
+ f las
1376
+ d p
1377
+ ie ce</w>
1378
+ pre fix</w>
1379
+ t un
1380
+ tun ing</w>
1381
+ l 2</w>
1382
+ ada m
1383
+ adam w</w>
1384
+ ble u</w>
1385
+ ro u
1386
+ f p
1387
+ r m
1388
+ ada m</w>
1389
+ m b</w>
1390
+ alph ago</w>
1391
+ u se
1392
+ squ ares</w>
1393
+ c at</w>
1394
+ re su
1395
+ resu lt</w>
1396
+ z e
1397
+ ze ro
1398
+ zero di
1399
+ zerodi visi
1400
+ zerodivisi on
1401
+ zerodivision error</w>
1402
+ con ten
1403
+ conten t</w>
1404
+ str ip</w>
1405
+ lif o</w>
1406
+ fi f
1407
+ fif o</w>
1408
+ ti mer</w>
1409
+ r b</w>
1410
+ du mps</w>
1411
+ lo ad
1412
+ load s</w>
1413
+ li st
1414
+ list dir</w>
1415
+ ma ke
1416
+ make di
1417
+ makedi rs</w>
1418
+ ran d
1419
+ rand int</w>
1420
+ fin d
1421
+ find all</w>
1422
+ dee p
1423
+ deep copy</w>
1424
+ ab b
1425
+ comb in
1426
+ combin ations</w>
1427
+ per m
1428
+ perm ut
1429
+ permut ations</w>
1430
+ s ing</w>
1431
+ bu i
1432
+ non local</w>
1433
+ exce ption</w>
1434
+ i o</w>
1435
+ multi processing</w>
1436
+ ste p</w>
1437
+ ke ys</w>
1438
+ valu es</w>
1439
+ f al
1440
+ fal se</w>
1441
+ 3 50</w>
1442
+ 3 4</w>
1443
+ g b
1444
+ gb ps</w>
1445
+ 5 60
1446
+ 560 8
1447
+ 5608 8</w>
1448
+ z h</w>
1449
+ 7 8</w>
1450
+ mak es</w>
1451
+ be t
1452
+ bet ter</w>
1453
+ 50 50</w>
1454
+ b on
1455
+ to mor
1456
+ tomor ro
1457
+ tomorro w</w>
1458
+ ra di
1459
+ mon th</w>
1460
+ 193 9</w>
1461
+ 197 8</w>
1462
+ 8 8
1463
+ 88 48</w>
1464
+ h c
1465
+ hc l</w>
1466
+ na o
1467
+ nao h</w>
1468
+ n ac
1469
+ nac l</w>
1470
+ co 2</w>
1471
+ o 2</w>
1472
+ 63 00</w>
1473
+ 5 4
1474
+ 54 64</w>
1475
+ m c
1476
+ 19 28</w>
1477
+ 20 0
1478
+ 200 3</w>
1479
+ 198 9</w>
1480
+ 19 56</w>
1481
+ 2 πr</w>
1482
+ t an</w>
1483
+ x i</w>
1484
+ s n</w>
1485
+ 6 18</w>
1486
+ s ss</w>
1487
+ s as</w>
1488
+ as a</w>
1489
+ σ c</w>
1490
+ transfor ming</w>
1491
+ al g
1492
+ alg ori
1493
+ algori th
1494
+ algorith ms</w>
1495
+ dat as
1496
+ datas ets</w>
1497
+ multi ple</w>
1498
+ la y
1499
+ po pu
1500
+ popu lar</w>
1501
+ ag es</w>
1502
+ ic h</w>
1503
+ func tion</w>
1504
+ ke y
1505
+ par a
1506
+ conne cts</w>
1507
+ billi ons</w>
1508
+ de vices</w>
1509
+ wor l
1510
+ worl d
1511
+ world wi
1512
+ worldwi de</w>
1513
+ enab ling</w>
1514
+ sh ar
1515
+ cli m
1516
+ clim ate</w>
1517
+ ch al
1518
+ chal leng
1519
+ challeng es</w>
1520
+ fac ing</w>
1521
+ human ity</w>
1522
+ coo per
1523
+ cooper ation</w>
1524
+ o v
1525
+ u lar</w>
1526
+ he al
1527
+ heal th</w>
1528
+ en s</w>
1529
+ bo o
1530
+ t al</w>
1531
+ ex pan
1532
+ expan ds</w>
1533
+ con c
1534
+ en tr
1535
+ inclu des</w>
1536
+ ti m
1537
+ e ight</w>
1538
+ pa th
1539
+ wa ter</w>
1540
+ sur fac
1541
+ surfac e</w>
1542
+ for ms</w>
1543
+ scienti fic</w>
1544
+ in volves</w>
1545
+ ser vation</w>
1546
+ h y
1547
+ ex peri
1548
+ dis cover</w>
1549
+ sta tes</w>
1550
+ o us
1551
+ ous ly</w>
1552
+ po si
1553
+ ra ys</w>
1554
+ mo dif
1555
+ contr ol</w>
1556
+ provi des</w>
1557
+ de m
1558
+ dem and</w>
1559
+ re sources</w>
1560
+ cy ber
1561
+ cyber security</w>
1562
+ prote cts</w>
1563
+ au th
1564
+ billi on</w>
1565
+ vac c
1566
+ tra in</w>
1567
+ imm un
1568
+ immun e</w>
1569
+ re new
1570
+ renew able</w>
1571
+ win d</w>
1572
+ ci al</w>
1573
+ su sta
1574
+ susta in
1575
+ sustain able</w>
1576
+ the or
1577
+ theor y</w>
1578
+ e volu
1579
+ evolu tion</w>
1580
+ se lec
1581
+ selec tion</w>
1582
+ ex p
1583
+ exp la
1584
+ expla ins</w>
1585
+ ho w</w>
1586
+ man y</w>
1587
+ gener ations</w>
1588
+ s lee
1589
+ slee p</w>
1590
+ ve n</w>
1591
+ da tion</w>
1592
+ ph y
1593
+ phy s
1594
+ diff e
1595
+ diffe ren
1596
+ differen t</w>
1597
+ cul tures</w>
1598
+ uni ties</w>
1599
+ ll s</w>
1600
+ pr i
1601
+ achie ve</w>
1602
+ mor e</w>
1603
+ le ss</w>
1604
+ th in
1605
+ k ing</w>
1606
+ obj ec
1607
+ ve ly</w>
1608
+ eff ec
1609
+ effec tive</w>
1610
+ requi res</w>
1611
+ bo th</w>
1612
+ cle ar</w>
1613
+ liste ning</w>
1614
+ o th
1615
+ oth ers</w>
1616
+ o ce
1617
+ oce an</w>
1618
+ ge st</w>
1619
+ cover ing</w>
1620
+ th re
1621
+ thre e</w>
1622
+ for m</w>
1623
+ fo un
1624
+ class ical</w>
1625
+ ic s</w>
1626
+ tho us
1627
+ thous and</w>
1628
+ vac u
1629
+ vacu um</w>
1630
+ perio di
1631
+ periodi c</w>
1632
+ organiz es</w>
1633
+ ele ments</w>
1634
+ the i
1635
+ thei r</w>
1636
+ nu mb
1637
+ numb er</w>
1638
+ car ri
1639
+ carri es</w>
1640
+ in struc
1641
+ instruc tions</w>
1642
+ develo p
1643
+ develop ment</w>
1644
+ inspi red</w>
1645
+ bio log
1646
+ biolog ical</w>
1647
+ inter pre
1648
+ interpre t</w>
1649
+ v is
1650
+ vis u
1651
+ visu al</w>
1652
+ re al</w>
1653
+ inno vation</w>
1654
+ au to
1655
+ ma tion</w>
1656
+ ro bo
1657
+ robo tics</w>
1658
+ in cre
1659
+ ti vity</w>
1660
+ bi g</w>
1661
+ analy tics</w>
1662
+ organiz ations</w>
1663
+ ma ke</w>
1664
+ contin u
1665
+ continu ous</w>
1666
+ rap id
1667
+ rapid ly</w>
1668
+ comm it</w>
1669
+ p us
1670
+ pus h</w>
1671
+ a es</w>
1672
+ rs a</w>
1673
+ c ss</w>
1674
+ de vo
1675
+ devo ps</w>
1676
+ no ht
1677
+ noht y
1678
+ nohty p</w>
1679
+ li c
1680
+ bas e</w>
1681
+ k w
1682
+ remo ve</w>
1683
+ stud ent</w>
1684
+ su m</w>
1685
+ enco ding</w>
1686
+ clo se</w>
1687
+ my error</w>
1688
+ su per</w>
1689
+ f ul
1690
+ ato r</w>
1691
+ wr app
1692
+ wrapp er</w>
1693
+ du mp</w>
1694
+ str p
1695
+ strp time</w>
1696
+ ce il</w>
1697
+ na me
1698
+ name d
1699
+ named tuple</w>
1700
+ rever se</w>
1701
+ fin d</w>
1702
+ t s
1703
+ my class</w>
1704
+ cal l</w>
1705
+ re pr</w>
1706
+ my list</w>
1707
+ l ru</w>
1708
+ c ach
1709
+ cach e</w>
1710
+ parti al</w>
1711
+ pow 2</w>
1712
+ par se</w>
1713
+ l r</w>
1714
+ sub process</w>
1715
+ has hlib</w>
1716
+ sh a
1717
+ sha 256</w>
1718
+ b 64
1719
+ rea der</w>
1720
+ sqli te
1721
+ sqlite 3</w>
1722
+ sqli te</w>
1723
+ con n</w>
1724
+ conne ct</w>
1725
+ ut e</w>
1726
+ p ack</w>
1727
+ ab c</w>
1728
+ sh ap
1729
+ dat aclass</w>
1730
+ enu m</w>
1731
+ co lo
1732
+ colo r</w>
1733
+ ty p
1734
+ typ ing</w>
1735
+ op tional</w>
1736
+ uni on</w>
1737
+ mo du
1738
+ modu le</w>
1739
+ acti v
1740
+ activ ate</w>
1741
+ p ts</w>
1742
+ win do
1743
+ windo ws</w>
1744
+ in st
1745
+ inst all</w>
1746
+ do c</w>
1747
+ py test</w>
1748
+ a i
1749
+ res p</w>
1750
+ c or
1751
+ remo ve
1752
+ as ia</w>
1753
+ sh ang
1754
+ shang h
1755
+ shangh ai</w>
1756
+ de l</w>
1757
+ by tes</w>
1758
+ my int</w>
1759
+ h int</w>
1760
+ ab s</w>
1761
+ di v</w>
1762
+ at tri
1763
+ w rap
1764
+ pe d</w>
1765
+ defaul ts</w>
1766
+ al s</w>
1767
+ sol u
1768
+ ch ec
1769
+ chec k</w>
1770
+ d ct</w>
1771
+ hi ft</w>
1772
+ rele ase</w>
1773
+ a enter</w>
1774
+ a exit</w>
1775
+ a iter</w>
1776
+ an e
1777
+ ane xt</w>
1778
+ parti tion</w>
1779
+ mer ge</w>
1780
+ flo y
1781
+ floy d</w>
1782
+ grap h</w>
1783
+ for d</w>
1784
+ ka h
1785
+ kah n</w>
1786
+ m st</w>
1787
+ k r
1788
+ kr us
1789
+ krus k
1790
+ krusk al</w>
1791
+ li s</w>
1792
+ bac k
1793
+ back track</w>
1794
+ f en
1795
+ tre e</w>
1796
+ min i
1797
+ mini max</w>
1798
+ alph a</w>
1799
+ be ta</w>
1800
+ lc a</w>
1801
+ sc c</w>
1802
+ e d
1803
+ i c</w>
1804
+ man ach
1805
+ manach er</w>
1806
+ dif f</w>
1807
+ n i
1808
+ fa r</w>
1809
+ u sed</w>
1810
+ m as
1811
+ ga p</w>
1812
+ tr o
1813
+ a a
1814
+ a a</w>
1815
+ lz 77</w>
1816
+ x1 x2</w>
1817
+ b n</w>
1818
+ θ r</w>
1819
+ 3 πr</w>
1820
+ 2 h</w>
1821
+ c u</w>
1822
+ 2 σ</w>
1823
+ i j</w>
1824
+ de t</w>
1825
+ λ x</w>
1826
+ k 1</w>
1827
+ k 2</w>
1828
+ 2 p
1829
+ h 0</w>
1830
+ m ar
1831
+ i θ</w>
1832
+ n θ</w>
1833
+ 4 l</w>
1834
+ 9 4</w>
1835
+ 4 y</w>
1836
+ 8 00</w>
1837
+ 2 b</w>
1838
+ 2 1
1839
+ 21 k</w>
1840
+ 6 x</w>
1841
+ 3 00</w>
1842
+ 5 d</w>
1843
+ 4 8
1844
+ 1 abc
1845
+ 1abc de</w>
1846
+ abc de
1847
+ abcde 1</w>
1848
+ 1000 00</w>
1849
+ 4 2857</w>
1850
+ 28 0</w>
1851
+ 4 28
1852
+ 5 v</w>
1853
+ 19 12</w>
1854
+ 194 9</w>
1855
+ m rna</w>
1856
+ 3 7</w>
1857
+ 8 60</w>
1858
+ 197 4</w>
1859
+ im f</w>
1860
+ 20 15</w>
1861
+ g le</w>
1862
+ 13 8</w>
1863
+ 0 2</w>
1864
+ sin θ
1865
+ m r</w>
1866
+ 5 9</w>
1867
+ 9 6</w>
1868
+ 198 7</w>
1869
+ 20 00</w>
1870
+ 8 9</w>
1871
+ 193 7</w>
1872
+ 19 90</w>
1873
+ 20 16</w>
1874
+ ever y</w>
1875
+ pr acti
1876
+ practi ce</w>
1877
+ per f
1878
+ perf ect</w>
1879
+ bo dy</w>
1880
+ a mo
1881
+ be st</w>
1882
+ t w
1883
+ ne y</w>
1884
+ communic ate</w>
1885
+ ali z
1886
+ la tes</w>
1887
+ ne ver</w>
1888
+ wh at</w>
1889
+ go ing</w>
1890
+ e du
1891
+ edu cation</w>
1892
+ ll ing</w>
1893
+ sen si
1894
+ sensi tive</w>
1895
+ eng ine
1896
+ engine er
1897
+ engineer ing</w>
1898
+ ss i
1899
+ me dic
1900
+ sp ace</w>
1901
+ under stan
1902
+ understan ding</w>
1903
+ ever y
1904
+ rea lity</w>
1905
+ crea tes</w>
1906
+ o ver
1907
+ mo us</w>
1908
+ ve h
1909
+ veh ic
1910
+ vehic les</w>
1911
+ wi tho
1912
+ witho ut</w>
1913
+ produ cts</w>
1914
+ s cal
1915
+ scal e</w>
1916
+ mu ch</w>
1917
+ to war
1918
+ towar d</w>
1919
+ di vers
1920
+ divers ity</w>
1921
+ e mo
1922
+ conne c
1923
+ eco no
1924
+ econo mi
1925
+ economi es</w>
1926
+ pl at
1927
+ de d</w>
1928
+ la tion</w>
1929
+ s tic</w>
1930
+ produ ced</w>
1931
+ ter i
1932
+ tr ac
1933
+ trac ts</w>
1934
+ e ach</w>
1935
+ o ther</w>
1936
+ conver ting</w>
1937
+ tur al</w>
1938
+ b le</w>
1939
+ c an
1940
+ crea ted</w>
1941
+ indus tri
1942
+ industri al</w>
1943
+ transfor me
1944
+ transforme d</w>
1945
+ pr in
1946
+ prin ting</w>
1947
+ ha ve</w>
1948
+ beco me</w>
1949
+ ma de</w>
1950
+ remo te</w>
1951
+ ad van
1952
+ advan ces</w>
1953
+ sp ace
1954
+ space x</w>
1955
+ fi les</w>
1956
+ an y
1957
+ pa y
1958
+ v p
1959
+ vp n</w>
1960
+ i aas</w>
1961
+ pa as</w>
1962
+ s aas</w>
1963
+ s wi
1964
+ swi ft</w>
1965
+ ko t
1966
+ kot li
1967
+ kotli n</w>
1968
+ c as
1969
+ cas 9</w>
1970
+ r y</w>
1971
+ b ran
1972
+ bran ch</w>
1973
+ c ass
1974
+ cass an
1975
+ cassan d
1976
+ cassand ra</w>
1977
+ n g
1978
+ ng in
1979
+ ngin x</w>
1980
+ sm art</w>
1981
+ meas ur
1982
+ measur able</w>
1983
+ achie v
1984
+ achiev able</w>
1985
+ bo und</w>
1986
+ present ation</w>
1987
+ c a
1988
+ ca p</w>
1989
+ consi ste
1990
+ consiste n
1991
+ consisten cy</w>
1992
+ contro lle
1993
+ controlle r</w>
1994
+ soli d</w>
1995
+ 67 8
1996
+ 678 90</w>
1997
+ 987 65
1998
+ 98765 4321</w>
1999
+ 4 1</w>
2000
+ 4 2
2001
+ 0 7
2002
+ 6 1</w>
2003
+ wea ther</w>
2004
+ be au
2005
+ beau ti
2006
+ beauti ful</w>
2007
+ e as
2008
+ eas y</w>
2009
+ un ti
2010
+ unti l</w>
2011
+ coo ki
2012
+ cooki e</w>
2013
+ se ssion</w>
2014
+ x ss</w>
2015
+ a op</w>
2016
+ 987 65</w>
2017
+ 3 5
2018
+ 9 99</w>
2019
+ 12 8</w>
modeling_stellarai.py ADDED
@@ -0,0 +1,610 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ """
3
+ StellarAI: Lightweight Multimodal Large Language Model
4
+ Hugging Face compatible implementation
5
+ """
6
+
7
+ import math
8
+ from typing import Optional, Tuple, Dict, Any, List
9
+
10
+ import torch
11
+ import torch.nn as nn
12
+ import torch.nn.functional as F
13
+
14
+ from transformers import PreTrainedModel, GenerationConfig, GenerationMixin
15
+ from transformers.modeling_outputs import (
16
+ CausalLMOutputWithPast,
17
+ BaseModelOutputWithPast,
18
+ )
19
+ from transformers.utils import add_start_docstrings, logging
20
+
21
+ from configuration_stellarai import StellarAIConfig
22
+
23
+ logger = logging.get_logger(__name__)
24
+
25
+ _CONFIG_FOR_DOC = "StellarAIConfig"
26
+ _CHECKPOINT_FOR_DOC = "StellarAI/stellarai-tiny"
27
+
28
+ STELLARAI_START_DOCSTRING = r"""
29
+ StellarAI Model: A lightweight multimodal large language model.
30
+
31
+ Parameters:
32
+ config ([`StellarAIConfig`]): Model configuration class with all the parameters.
33
+ """
34
+
35
+
36
+ # ============================================================
37
+ # RoPE Rotary Position Embedding
38
+ # ============================================================
39
+ class RoPE(nn.Module):
40
+ """Rotary Position Embedding"""
41
+
42
+ def __init__(self, head_dim: int, max_seq_len: int = 2048, base: float = 10000.0):
43
+ super().__init__()
44
+ self.head_dim = head_dim
45
+ self.base = base
46
+ half = head_dim // 2
47
+ inv_freq = 1.0 / (base ** (torch.arange(0, head_dim, 2).float() / head_dim))
48
+ positions = torch.arange(max_seq_len).float()
49
+ angles = torch.outer(positions, inv_freq)
50
+ cos = torch.zeros(max_seq_len, head_dim)
51
+ sin = torch.zeros(max_seq_len, head_dim)
52
+ cos[:, 0::2] = torch.cos(angles)
53
+ cos[:, 1::2] = torch.cos(angles)
54
+ sin[:, 0::2] = torch.sin(angles)
55
+ sin[:, 1::2] = torch.sin(angles)
56
+ self.register_buffer("cos", cos, persistent=False)
57
+ self.register_buffer("sin", sin, persistent=False)
58
+
59
+ def forward(self, x: torch.Tensor, offset: int = 0) -> torch.Tensor:
60
+ *_, S, Dh = x.shape
61
+ cos = self.cos[offset:offset + S]
62
+ sin = self.sin[offset:offset + S]
63
+ x1 = x[..., 0::2]
64
+ x2 = x[..., 1::2]
65
+ cos_half = cos[:, 0::2]
66
+ sin_half = sin[:, 0::2]
67
+ while cos_half.dim() < x1.dim():
68
+ cos_half = cos_half.unsqueeze(0)
69
+ sin_half = sin_half.unsqueeze(0)
70
+ out1 = x1 * cos_half - x2 * sin_half
71
+ out2 = x1 * sin_half + x2 * cos_half
72
+ result = torch.empty_like(x)
73
+ result[..., 0::2] = out1
74
+ result[..., 1::2] = out2
75
+ return result
76
+
77
+
78
+ # ============================================================
79
+ # Multi-Head Self Attention
80
+ # ============================================================
81
+ class MultiHeadAttention(nn.Module):
82
+ def __init__(self, d_model: int, num_heads: int, dropout: float = 0.1, rope: Optional[RoPE] = None):
83
+ super().__init__()
84
+ assert d_model % num_heads == 0
85
+ self.d_model = d_model
86
+ self.num_heads = num_heads
87
+ self.head_dim = d_model // num_heads
88
+ self.scale = 1.0 / math.sqrt(self.head_dim)
89
+ self.Wq = nn.Linear(d_model, d_model, bias=True)
90
+ self.Wk = nn.Linear(d_model, d_model, bias=True)
91
+ self.Wv = nn.Linear(d_model, d_model, bias=True)
92
+ self.Wo = nn.Linear(d_model, d_model, bias=True)
93
+ self.dropout = nn.Dropout(dropout)
94
+ self.rope = rope
95
+
96
+ def forward(
97
+ self, x: torch.Tensor, mask: Optional[torch.Tensor] = None,
98
+ kv_cache: Optional[Dict] = None,
99
+ ) -> Tuple[torch.Tensor, Optional[Dict]]:
100
+ B, S, D = x.shape
101
+ Q = self.Wq(x).view(B, S, self.num_heads, self.head_dim).transpose(1, 2)
102
+ K = self.Wk(x).view(B, S, self.num_heads, self.head_dim).transpose(1, 2)
103
+ V = self.Wv(x).view(B, S, self.num_heads, self.head_dim).transpose(1, 2)
104
+
105
+ offset = 0
106
+ if kv_cache is not None and "K" in kv_cache:
107
+ offset = kv_cache["K"].shape[2]
108
+ if self.rope is not None:
109
+ Q = self.rope(Q.transpose(1, 2), offset=offset).transpose(1, 2)
110
+ K = self.rope(K.transpose(1, 2), offset=offset).transpose(1, 2)
111
+
112
+ if kv_cache is not None:
113
+ if "K" in kv_cache:
114
+ K = torch.cat([kv_cache["K"], K], dim=2)
115
+ V = torch.cat([kv_cache["V"], V], dim=2)
116
+ kv_cache["K"] = K
117
+ kv_cache["V"] = V
118
+
119
+ scores = torch.matmul(Q, K.transpose(-2, -1)) * self.scale
120
+ Sq = Q.shape[2]
121
+ Sk = K.shape[2]
122
+ if mask is not None:
123
+ scores = scores.masked_fill(mask[:Sq, :Sk], float('-inf'))
124
+ else:
125
+ causal = torch.triu(torch.ones(Sq, Sk, device=x.device, dtype=torch.bool), diagonal=1)
126
+ scores = scores.masked_fill(causal, float('-inf'))
127
+
128
+ attn = F.softmax(scores, dim=-1)
129
+ attn = self.dropout(attn)
130
+ out = torch.matmul(attn, V)
131
+ out = out.transpose(1, 2).contiguous().view(B, S, D)
132
+ return self.Wo(out), kv_cache
133
+
134
+
135
+ # ============================================================
136
+ # Cross Attention
137
+ # ============================================================
138
+ class CrossAttention(nn.Module):
139
+ def __init__(self, d_model: int, num_heads: int, dropout: float = 0.1):
140
+ super().__init__()
141
+ assert d_model % num_heads == 0
142
+ self.d_model = d_model
143
+ self.num_heads = num_heads
144
+ self.head_dim = d_model // num_heads
145
+ self.scale = 1.0 / math.sqrt(self.head_dim)
146
+ self.Wq = nn.Linear(d_model, d_model, bias=True)
147
+ self.Wk = nn.Linear(d_model, d_model, bias=True)
148
+ self.Wv = nn.Linear(d_model, d_model, bias=True)
149
+ self.Wo = nn.Linear(d_model, d_model, bias=True)
150
+ self.dropout = nn.Dropout(dropout)
151
+
152
+ def forward(self, x: torch.Tensor, ctx: torch.Tensor) -> torch.Tensor:
153
+ B, Sx, D = x.shape
154
+ Sc = ctx.shape[1]
155
+ Q = self.Wq(x).view(B, Sx, self.num_heads, self.head_dim).transpose(1, 2)
156
+ K = self.Wk(ctx).view(B, Sc, self.num_heads, self.head_dim).transpose(1, 2)
157
+ V = self.Wv(ctx).view(B, Sc, self.num_heads, self.head_dim).transpose(1, 2)
158
+ scores = torch.matmul(Q, K.transpose(-2, -1)) * self.scale
159
+ attn = F.softmax(scores, dim=-1)
160
+ attn = self.dropout(attn)
161
+ out = torch.matmul(attn, V)
162
+ out = out.transpose(1, 2).contiguous().view(B, Sx, D)
163
+ return self.Wo(out)
164
+
165
+
166
+ # ============================================================
167
+ # Transformer Block (Pre-LN)
168
+ # ============================================================
169
+ class TransformerBlock(nn.Module):
170
+ def __init__(self, d_model: int, num_heads: int, ff_dim: int,
171
+ dropout: float = 0.1, rope: Optional[RoPE] = None, eps: float = 1e-6):
172
+ super().__init__()
173
+ self.attn = MultiHeadAttention(d_model, num_heads, dropout, rope)
174
+ self.ffn = nn.Sequential(
175
+ nn.Linear(d_model, ff_dim),
176
+ nn.GELU(),
177
+ nn.Linear(ff_dim, d_model),
178
+ )
179
+ self.ln1 = nn.LayerNorm(d_model, eps=eps)
180
+ self.ln2 = nn.LayerNorm(d_model, eps=eps)
181
+ self.dropout = nn.Dropout(dropout)
182
+
183
+ def forward(
184
+ self, x: torch.Tensor, mask: Optional[torch.Tensor] = None,
185
+ kv_cache: Optional[Dict] = None,
186
+ ) -> Tuple[torch.Tensor, Optional[Dict]]:
187
+ attn_out, kv_cache = self.attn(self.ln1(x), mask, kv_cache)
188
+ x = x + self.dropout(attn_out)
189
+ x = x + self.dropout(self.ffn(self.ln2(x)))
190
+ return x, kv_cache
191
+
192
+
193
+ # ============================================================
194
+ # Fusion Block (Self + Cross Attention)
195
+ # ============================================================
196
+ class FusionBlock(nn.Module):
197
+ def __init__(self, d_model: int, num_heads: int, ff_dim: int,
198
+ dropout: float = 0.1, rope: Optional[RoPE] = None, eps: float = 1e-6):
199
+ super().__init__()
200
+ self.self_attn = MultiHeadAttention(d_model, num_heads, dropout, rope)
201
+ self.cross_attn = CrossAttention(d_model, num_heads, dropout)
202
+ self.ffn = nn.Sequential(
203
+ nn.Linear(d_model, ff_dim),
204
+ nn.GELU(),
205
+ nn.Linear(ff_dim, d_model),
206
+ )
207
+ self.ln1 = nn.LayerNorm(d_model, eps=eps)
208
+ self.ln2 = nn.LayerNorm(d_model, eps=eps)
209
+ self.ln3 = nn.LayerNorm(d_model, eps=eps)
210
+ self.dropout = nn.Dropout(dropout)
211
+
212
+ def forward(
213
+ self, x: torch.Tensor, ctx: Optional[torch.Tensor],
214
+ mask: Optional[torch.Tensor] = None, kv_cache: Optional[Dict] = None,
215
+ ) -> Tuple[torch.Tensor, Optional[Dict]]:
216
+ attn_out, kv_cache = self.self_attn(self.ln1(x), mask, kv_cache)
217
+ x = x + self.dropout(attn_out)
218
+ if ctx is not None:
219
+ x = x + self.dropout(self.cross_attn(self.ln2(x), ctx))
220
+ x = x + self.dropout(self.ffn(self.ln3(x)))
221
+ return x, kv_cache
222
+
223
+
224
+ # ============================================================
225
+ # Vision Encoder (CNN + ViT Hybrid)
226
+ # ============================================================
227
+ class VisionEncoder(nn.Module):
228
+ def __init__(self, cfg: StellarAIConfig):
229
+ super().__init__()
230
+ self.cfg = cfg
231
+ vc = cfg.vision_cfg
232
+ D = cfg.d_model
233
+
234
+ layers = []
235
+ c_in = vc["num_channels"]
236
+ for c_out in vc["cnn_channels"]:
237
+ layers.append(nn.Conv2d(c_in, c_out, 3, stride=2, padding=1))
238
+ layers.append(nn.BatchNorm2d(c_out))
239
+ layers.append(nn.SiLU())
240
+ c_in = c_out
241
+ self.cnn = nn.Sequential(*layers)
242
+ self.cnn_proj = nn.Linear(c_in, D)
243
+
244
+ self.pos_emb = nn.Parameter(torch.randn(vc["vision_num_patches"], D) * 0.02)
245
+
246
+ self.blocks = nn.ModuleList([
247
+ TransformerBlock(D, vc["vision_num_heads"], vc["vision_ff_dim"],
248
+ cfg.dropout, rope=None, eps=cfg.layer_norm_eps)
249
+ for _ in range(vc["vision_num_layers"])
250
+ ])
251
+ self.final_ln = nn.LayerNorm(D, eps=cfg.layer_norm_eps)
252
+
253
+ def forward(self, images: torch.Tensor) -> torch.Tensor:
254
+ x = self.cnn(images)
255
+ B, C, Hp, Wp = x.shape
256
+ target = int(math.sqrt(self.cfg.vision_cfg["vision_num_patches"]))
257
+ if Hp != target:
258
+ x = F.adaptive_avg_pool2d(x, (target, target))
259
+ x = x.flatten(2).transpose(1, 2)
260
+ x = self.cnn_proj(x)
261
+ x = x + self.pos_emb.unsqueeze(0)
262
+ for blk in self.blocks:
263
+ x, _ = blk(x, mask=None)
264
+ return self.final_ln(x)
265
+
266
+
267
+ # ============================================================
268
+ # StellarAI Core Model
269
+ # ============================================================
270
+ @add_start_docstrings(
271
+ "The bare StellarAI Model outputting raw hidden-states.",
272
+ STELLARAI_START_DOCSTRING,
273
+ )
274
+ class StellarAIModel(PreTrainedModel):
275
+ config_class = StellarAIConfig
276
+ base_model_prefix = "model"
277
+ _no_split_modules = ["TransformerBlock", "FusionBlock"]
278
+
279
+ def __init__(self, config: StellarAIConfig):
280
+ super().__init__(config)
281
+ self.config = config
282
+ D = config.d_model
283
+ fc = config.mm_fusion_cfg
284
+
285
+ self.wte = nn.Embedding(config.vocab_size, D)
286
+ self.text_rope = RoPE(D // config.num_attention_heads,
287
+ config.max_position_embeddings, config.rope_theta)
288
+
289
+ self.text_blocks = nn.ModuleList([
290
+ TransformerBlock(D, config.num_attention_heads, config.intermediate_size,
291
+ config.dropout, rope=self.text_rope, eps=config.layer_norm_eps)
292
+ for _ in range(config.num_hidden_layers)
293
+ ])
294
+ self.text_final_ln = nn.LayerNorm(D, eps=config.layer_norm_eps)
295
+
296
+ self.vision_encoder = VisionEncoder(config)
297
+
298
+ self.fusion_blocks = nn.ModuleList([
299
+ FusionBlock(D, fc["fusion_num_heads"], fc["fusion_ff_dim"],
300
+ config.dropout, rope=self.text_rope, eps=config.layer_norm_eps)
301
+ for _ in range(fc["fusion_num_layers"])
302
+ ])
303
+ self.fusion_final_ln = nn.LayerNorm(D, eps=config.layer_norm_eps)
304
+
305
+ self.gradient_checkpointing = False
306
+ self.post_init()
307
+
308
+ def get_input_embeddings(self):
309
+ return self.wte
310
+
311
+ def set_input_embeddings(self, value):
312
+ self.wte = value
313
+
314
+ def forward(
315
+ self,
316
+ input_ids: Optional[torch.LongTensor] = None,
317
+ attention_mask: Optional[torch.FloatTensor] = None,
318
+ past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None,
319
+ inputs_embeds: Optional[torch.FloatTensor] = None,
320
+ images: Optional[torch.FloatTensor] = None,
321
+ image_positions: Optional[List] = None,
322
+ use_cache: Optional[bool] = None,
323
+ output_hidden_states: Optional[bool] = None,
324
+ output_attentions: Optional[bool] = None,
325
+ return_dict: Optional[bool] = None,
326
+ ) -> BaseModelOutputWithPast:
327
+ output_hidden_states = output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
328
+ use_cache = use_cache if use_cache is not None else self.config.use_cache
329
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
330
+
331
+ if input_ids is not None and inputs_embeds is not None:
332
+ raise ValueError("Cannot specify both input_ids and inputs_embeds")
333
+ if input_ids is None and inputs_embeds is None:
334
+ raise ValueError("Must specify either input_ids or inputs_embeds")
335
+
336
+ if inputs_embeds is None:
337
+ inputs_embeds = self.wte(input_ids)
338
+
339
+ B, S, D = inputs_embeds.shape
340
+ device = inputs_embeds.device
341
+
342
+ # Attention mask -> causal mask
343
+ if attention_mask is not None and attention_mask.dim() == 2:
344
+ mask = ~(attention_mask[:, None, None, :].bool())
345
+ else:
346
+ mask = None
347
+
348
+ # Vision encoding
349
+ vision_features = None
350
+ if images is not None:
351
+ vision_features = self.vision_encoder(images)
352
+ if image_positions is not None:
353
+ for b in range(B):
354
+ if b < len(image_positions):
355
+ s, e = image_positions[b]
356
+ n = min(e - s, vision_features.shape[1])
357
+ inputs_embeds[b, s:s + n] = vision_features[b, :n]
358
+
359
+ # Text Transformer
360
+ # HF may pass DynamicCache (not subscriptable). Our layers use dict-per-layer format.
361
+ # Safest: if use_cache is requested but past_key_values is not a plain sequence of
362
+ # layer-level cache dicts, fall back to no-cache by treating past as all-None and
363
+ # still producing present_kv (the dict-style) so the next iteration can consume it.
364
+ if past_key_values is not None:
365
+ # Accept both tuple[dict, ...] and list[dict, ...]; reject DynamicCache & friends.
366
+ if not isinstance(past_key_values, (tuple, list)) or not all(
367
+ (isinstance(x, dict) or x is None) for x in past_key_values
368
+ ):
369
+ past_key_values = None
370
+
371
+ x = inputs_embeds
372
+ all_hidden_states = () if output_hidden_states else None
373
+ present_kv = [] if use_cache else None
374
+
375
+ past = past_key_values if past_key_values is not None else [None] * (
376
+ self.config.num_hidden_layers + self.config.mm_fusion_cfg["fusion_num_layers"]
377
+ )
378
+
379
+ for i, blk in enumerate(self.text_blocks):
380
+ if output_hidden_states:
381
+ all_hidden_states += (x,)
382
+ kv = past[i] if use_cache else None
383
+ if use_cache and kv is None:
384
+ kv = {}
385
+ x, kv_out = blk(x, mask, kv_cache=kv)
386
+ if use_cache:
387
+ present_kv.append(kv_out)
388
+
389
+ x = self.text_final_ln(x)
390
+
391
+ # Fusion layers
392
+ offset = self.config.num_hidden_layers
393
+ ctx = vision_features
394
+ for i, fblk in enumerate(self.fusion_blocks):
395
+ if output_hidden_states:
396
+ all_hidden_states += (x,)
397
+ kv = past[offset + i] if use_cache else None
398
+ if use_cache and kv is None:
399
+ kv = {}
400
+ x, kv_out = fblk(x, ctx, mask, kv_cache=kv)
401
+ if use_cache:
402
+ present_kv.append(kv_out)
403
+
404
+ x = self.fusion_final_ln(x)
405
+
406
+ if output_hidden_states:
407
+ all_hidden_states += (x,)
408
+
409
+ if not return_dict:
410
+ return tuple(v for v in [x, tuple(present_kv) if use_cache else None, all_hidden_states, None] if v is not None)
411
+
412
+ return BaseModelOutputWithPast(
413
+ last_hidden_state=x,
414
+ past_key_values=tuple(present_kv) if use_cache else None,
415
+ hidden_states=all_hidden_states,
416
+ attentions=None,
417
+ )
418
+
419
+
420
+ # ============================================================
421
+ # StellarAI for Causal Language Modeling
422
+ # ============================================================
423
+ class StellarAIForCausalLM(PreTrainedModel, GenerationMixin):
424
+ r"""
425
+ StellarAI Model with a language modeling head on top (for causal LM).
426
+ """
427
+ config_class = StellarAIConfig
428
+ base_model_prefix = "model"
429
+ _no_split_modules = ["TransformerBlock", "FusionBlock"]
430
+ _tied_weights_keys = ["lm_head.weight"]
431
+
432
+ def __init__(self, config: StellarAIConfig):
433
+ super().__init__(config)
434
+ self.model = StellarAIModel(config)
435
+ D = config.d_model
436
+ self.lm_bias = nn.Parameter(torch.zeros(config.vocab_size)) if config.lm_head_bias else None
437
+ self.post_init()
438
+
439
+ def get_output_embeddings(self):
440
+ # Weight tying: output shares embedding weights
441
+ return self.model.wte
442
+
443
+ def set_output_embeddings(self, new_embeddings):
444
+ self.model.wte = new_embeddings
445
+
446
+ def get_input_embeddings(self):
447
+ return self.model.wte
448
+
449
+ def set_input_embeddings(self, value):
450
+ self.model.wte = value
451
+
452
+ def tie_weights(self, recompute_mapping: bool = False, missing_keys=None, **kwargs):
453
+ """Weight tying: LM head shares embedding weights"""
454
+ if self.config.use_weight_tying:
455
+ # weight is implicitly shared since we use F.linear(model.wte.weight)
456
+ pass
457
+
458
+ def forward(
459
+ self,
460
+ input_ids: Optional[torch.LongTensor] = None,
461
+ attention_mask: Optional[torch.FloatTensor] = None,
462
+ past_key_values: Optional[Tuple[Tuple[torch.Tensor]]] = None,
463
+ inputs_embeds: Optional[torch.FloatTensor] = None,
464
+ images: Optional[torch.FloatTensor] = None,
465
+ image_positions: Optional[List] = None,
466
+ labels: Optional[torch.LongTensor] = None,
467
+ use_cache: Optional[bool] = None,
468
+ output_hidden_states: Optional[bool] = None,
469
+ output_attentions: Optional[bool] = None,
470
+ return_dict: Optional[bool] = None,
471
+ **kwargs,
472
+ ) -> CausalLMOutputWithPast:
473
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
474
+
475
+ outputs = self.model(
476
+ input_ids=input_ids,
477
+ attention_mask=attention_mask,
478
+ past_key_values=past_key_values,
479
+ inputs_embeds=inputs_embeds,
480
+ images=images,
481
+ image_positions=image_positions,
482
+ use_cache=use_cache,
483
+ output_hidden_states=output_hidden_states,
484
+ output_attentions=output_attentions,
485
+ return_dict=return_dict,
486
+ )
487
+
488
+ hidden_states = outputs[0]
489
+ logits = F.linear(hidden_states, self.model.wte.weight)
490
+ if self.lm_bias is not None:
491
+ logits = logits + self.lm_bias
492
+
493
+ loss = None
494
+ if labels is not None:
495
+ shift_logits = logits[..., :-1, :].contiguous()
496
+ shift_labels = labels[..., 1:].contiguous()
497
+ loss = F.cross_entropy(
498
+ shift_logits.view(-1, self.config.vocab_size),
499
+ shift_labels.view(-1),
500
+ ignore_index=-100,
501
+ )
502
+
503
+ if not return_dict:
504
+ output = (logits,) + outputs[1:]
505
+ return ((loss,) + output) if loss is not None else output
506
+
507
+ return CausalLMOutputWithPast(
508
+ loss=loss,
509
+ logits=logits,
510
+ past_key_values=outputs.past_key_values,
511
+ hidden_states=outputs.hidden_states,
512
+ attentions=outputs.attentions,
513
+ )
514
+
515
+ @torch.no_grad()
516
+ def generate_text(
517
+ self,
518
+ prompt: str,
519
+ tokenizer=None,
520
+ max_new_tokens: int = 100,
521
+ temperature: float = 0.7,
522
+ top_k: int = 40,
523
+ device: torch.device = None,
524
+ ) -> str:
525
+ """Convenience method for text generation."""
526
+ if tokenizer is None:
527
+ raise ValueError("tokenizer is required for generate_text()")
528
+ if device is None:
529
+ device = next(self.parameters()).device
530
+ self.eval()
531
+
532
+ ids = tokenizer.encode(prompt)
533
+ # Ensure [BOS] at start if using SimpleTokenizer
534
+ if hasattr(tokenizer, 'bos_id') and ids[0] != tokenizer.bos_id:
535
+ ids = [tokenizer.bos_id] + ids
536
+ input_ids = torch.tensor([ids], dtype=torch.long, device=device)
537
+ eos_id = tokenizer.eos_id if hasattr(tokenizer, 'eos_id') else 2
538
+
539
+ for _ in range(max_new_tokens):
540
+ if input_ids.shape[1] >= self.config.max_position_embeddings:
541
+ break
542
+ out = self.forward(input_ids)
543
+ logits = out.logits[:, -1, :self.config.vocab_size]
544
+ if temperature <= 0:
545
+ next_id = logits.argmax(dim=-1, keepdim=True)
546
+ else:
547
+ logits = logits / temperature
548
+ v, _ = torch.topk(logits, min(top_k, logits.shape[-1]), dim=-1)
549
+ logits[logits < v[:, [-1]]] = float('-inf')
550
+ probs = F.softmax(logits, dim=-1)
551
+ next_id = torch.multinomial(probs, num_samples=1)
552
+ input_ids = torch.cat([input_ids, next_id], dim=1)
553
+ if next_id.item() == eos_id:
554
+ break
555
+
556
+ result_ids = input_ids[0].tolist()
557
+ return tokenizer.decode(result_ids, skip_special=True) if hasattr(tokenizer, 'decode') else str(result_ids)
558
+
559
+ # ===== HuggingFace GenerationMixin required hooks =====
560
+ def prepare_inputs_for_generation(
561
+ self,
562
+ input_ids,
563
+ past_key_values=None,
564
+ attention_mask=None,
565
+ inputs_embeds=None,
566
+ images=None,
567
+ image_positions=None,
568
+ **kwargs,
569
+ ):
570
+ """Transform generation-time inputs into forward() arguments. Handles KV cache truncation."""
571
+ if past_key_values is not None:
572
+ # Only pass the last token as input; KV holds earlier context
573
+ past_length = 0
574
+ try:
575
+ # past_key_values is tuple of kv_cache dicts, each has K tensor shape (B, H, S, Dh)
576
+ first_cache = past_key_values[0]
577
+ if isinstance(first_cache, dict) and "K" in first_cache:
578
+ past_length = first_cache["K"].shape[2]
579
+ except Exception:
580
+ past_length = 0
581
+ input_ids = input_ids[:, past_length:]
582
+
583
+ return {
584
+ "input_ids": input_ids if inputs_embeds is None else None,
585
+ "inputs_embeds": inputs_embeds,
586
+ "past_key_values": past_key_values,
587
+ "attention_mask": attention_mask,
588
+ "images": images,
589
+ "image_positions": image_positions,
590
+ "use_cache": False,
591
+ }
592
+
593
+ @staticmethod
594
+ def _reorder_cache(past_key_values, beam_idx):
595
+ """Reorder KV cache entries for beam search (no-op for greedy / sampling single-beam)."""
596
+ if past_key_values is None:
597
+ return None
598
+ reordered = []
599
+ for layer_cache in past_key_values:
600
+ if isinstance(layer_cache, dict):
601
+ new_cache = {}
602
+ for k, v in layer_cache.items():
603
+ if isinstance(v, torch.Tensor):
604
+ new_cache[k] = v.index_select(0, beam_idx.to(v.device))
605
+ else:
606
+ new_cache[k] = v
607
+ reordered.append(new_cache)
608
+ else:
609
+ reordered.append(layer_cache)
610
+ return tuple(reordered)
special_tokens_map.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "[BOS]",
3
+ "eos_token": "[EOS]",
4
+ "unk_token": "[UNK]",
5
+ "sep_token": "[SEP]",
6
+ "pad_token": "[PAD]",
7
+ "cls_token": "[CLS]",
8
+ "mask_token": "[MASK]",
9
+ "additional_special_tokens": [
10
+ "[IMG]",
11
+ "[BOI]",
12
+ "[EOI]"
13
+ ]
14
+ }
tokenization_stellarai.py ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # coding=utf-8
2
+ """
3
+ StellarAI Tokenizer - Hugging Face compatible
4
+ Wraps SimpleTokenizer to match PreTrainedTokenizer interface.
5
+ """
6
+ import os
7
+ import json
8
+ from typing import List, Optional, Dict, Tuple, Union, Any
9
+
10
+ from transformers import PreTrainedTokenizer
11
+ from transformers.tokenization_utils import AddedToken
12
+
13
+ # Import SimpleTokenizer from sibling stellarai package
14
+ import sys
15
+ _CURDIR = os.path.dirname(os.path.abspath(__file__))
16
+ sys.path.insert(0, os.path.join(_CURDIR, ".."))
17
+ from stellarai.tokenizer import SimpleTokenizer as _StellarTokenizer
18
+ sys.path.pop(0)
19
+
20
+ VOCAB_FILES_NAMES = {
21
+ "vocab_file": "backend_tokenizer.json",
22
+ }
23
+
24
+ PRETRAINED_VOCAB_FILES_MAP = {}
25
+ PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {
26
+ "stellarai-tiny": 1024,
27
+ }
28
+ PRETRAINED_INIT_CONFIGURATION = {}
29
+
30
+
31
+ def _find_backend_vocab(search_path: Optional[str]) -> Optional[str]:
32
+ """Locate the SimpleTokenizer format JSON file (backend_tokenizer.json)."""
33
+ candidates = []
34
+ if search_path is not None:
35
+ if os.path.isfile(search_path):
36
+ return search_path
37
+ if os.path.isdir(search_path):
38
+ candidates.append(os.path.join(search_path, "backend_tokenizer.json"))
39
+ candidates.append(os.path.join(search_path, "tokenizer.json"))
40
+ # default: same directory as this file
41
+ candidates.append(os.path.join(_CURDIR, "backend_tokenizer.json"))
42
+ candidates.append(os.path.join(_CURDIR, "..", "outputs", "stellar_pt", "tokenizer.json"))
43
+ for c in candidates:
44
+ if c and os.path.isfile(c):
45
+ # Make sure it's the SimpleTokenizer format (has "token_to_id")
46
+ try:
47
+ with open(c, "r", encoding="utf-8") as f:
48
+ head = f.read(256)
49
+ if '"token_to_id"' in head or "'token_to_id'" in head:
50
+ return c
51
+ except Exception:
52
+ continue
53
+ return None
54
+
55
+
56
+ class StellarAITokenizer(PreTrainedTokenizer):
57
+ """
58
+ Hugging Face compatible tokenizer for StellarAI.
59
+ Wraps the original SimpleTokenizer for 100% training-consistent tokenization.
60
+ """
61
+ vocab_files_names = VOCAB_FILES_NAMES
62
+ pretrained_vocab_files_map = PRETRAINED_VOCAB_FILES_MAP
63
+ pretrained_init_configuration = PRETRAINED_INIT_CONFIGURATION
64
+ max_model_input_sizes = PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
65
+ model_input_names = ["input_ids", "attention_mask"]
66
+
67
+ def __init__(
68
+ self,
69
+ vocab_file=None,
70
+ unk_token="[UNK]",
71
+ bos_token="[BOS]",
72
+ eos_token="[EOS]",
73
+ sep_token="[SEP]",
74
+ pad_token="[PAD]",
75
+ cls_token="[CLS]",
76
+ mask_token="[MASK]",
77
+ additional_special_tokens=None,
78
+ model_max_length=1024,
79
+ do_lower_case=False,
80
+ **kwargs,
81
+ ):
82
+ if additional_special_tokens is None:
83
+ additional_special_tokens = ["[IMG]", "[BOI]", "[EOI]"]
84
+ # Wrap mask_token to AddedToken for HF compatibility
85
+ mask_token = AddedToken(mask_token, lstrip=False, rstrip=False) if isinstance(mask_token, str) else mask_token
86
+
87
+ # === IMPORTANT: create backend BEFORE super().__init__() ===
88
+ resolved = _find_backend_vocab(vocab_file)
89
+ self._tok = _StellarTokenizer(vocab_size=32000)
90
+ if resolved is not None:
91
+ try:
92
+ self._tok.load(resolved)
93
+ except Exception:
94
+ # Fall back to base charset without pre-trained merges
95
+ pass
96
+ self.do_lower_case = do_lower_case
97
+
98
+ super().__init__(
99
+ unk_token=unk_token,
100
+ bos_token=bos_token,
101
+ eos_token=eos_token,
102
+ sep_token=sep_token,
103
+ pad_token=pad_token,
104
+ cls_token=cls_token,
105
+ mask_token=mask_token,
106
+ additional_special_tokens=additional_special_tokens,
107
+ model_max_length=model_max_length,
108
+ do_lower_case=do_lower_case,
109
+ **kwargs,
110
+ )
111
+
112
+ @property
113
+ def vocab_size(self) -> int:
114
+ return len(self._tok.token_to_id)
115
+
116
+ def get_vocab(self) -> Dict[str, int]:
117
+ return dict(self._tok.token_to_id)
118
+
119
+ def _tokenize(self, text: str, **kwargs) -> List[str]:
120
+ """Tokenize a string into BPE token strings (used by encode/decode pipeline)."""
121
+ if self.do_lower_case:
122
+ text = text.lower()
123
+ ids = self._tok.encode(text, add_bos=False, add_eos=False)
124
+ return [self._tok.id_to_token.get(i, self.unk_token) for i in ids]
125
+
126
+ def _convert_token_to_id(self, token: str) -> int:
127
+ return self._tok.token_to_id.get(token, self._tok.token_to_id.get(self.unk_token, 3))
128
+
129
+ def _convert_id_to_token(self, index: int) -> str:
130
+ return self._tok.id_to_token.get(index, self.unk_token)
131
+
132
+ def convert_tokens_to_string(self, tokens: List[str]) -> str:
133
+ ids = [self._convert_token_to_id(t) for t in tokens]
134
+ return self._tok.decode(ids, skip_special=False)
135
+
136
+ # --- direct encode / decode overrides ---
137
+ def _encode_plus(
138
+ self,
139
+ text,
140
+ text_pair=None,
141
+ add_special_tokens=True,
142
+ padding_strategy="do_not_pad",
143
+ truncation_strategy="longest_first",
144
+ max_length=None,
145
+ stride=0,
146
+ is_split_into_words=False,
147
+ pad_to_multiple_of=None,
148
+ return_tensors=None,
149
+ return_token_type_ids=None,
150
+ return_attention_mask=None,
151
+ return_overflowing_tokens=False,
152
+ return_special_tokens_mask=False,
153
+ return_offsets_mapping=False,
154
+ return_length=False,
155
+ verbose=True,
156
+ **kwargs,
157
+ ):
158
+ if is_split_into_words:
159
+ text = "".join(text) if isinstance(text, list) else text
160
+ if self.do_lower_case:
161
+ text = text.lower()
162
+ if text_pair is not None:
163
+ text_pair = text_pair.lower() if not isinstance(text_pair, list) else "".join(text_pair)
164
+
165
+ ids = list(self._tok.encode(text, add_bos=False, add_eos=False))
166
+ if text_pair is not None:
167
+ pair_ids = list(self._tok.encode(text_pair, add_bos=False, add_eos=False))
168
+ else:
169
+ pair_ids = None
170
+
171
+ if add_special_tokens:
172
+ bos_id = self._tok.SPECIAL_TOKENS.get("[BOS]", 1)
173
+ eos_id = self._tok.SPECIAL_TOKENS.get("[EOS]", 2)
174
+ sep_id = self._tok.SPECIAL_TOKENS.get("[SEP]", 6)
175
+ if pair_ids is None:
176
+ ids = [bos_id] + ids + [eos_id]
177
+ else:
178
+ ids = [bos_id] + ids + [sep_id] + pair_ids + [eos_id]
179
+
180
+ # Truncation
181
+ if max_length is not None and len(ids) > max_length:
182
+ if truncation_strategy == "longest_first":
183
+ ids = ids[:max_length]
184
+
185
+ input_ids = ids
186
+ attention_mask = [1] * len(ids)
187
+
188
+ # Padding
189
+ if padding_strategy != "do_not_pad" and max_length is not None and len(ids) < max_length:
190
+ pad_id = self._tok.SPECIAL_TOKENS.get("[PAD]", 0)
191
+ pad_len = max_length - len(ids)
192
+ input_ids = input_ids + [pad_id] * pad_len
193
+ attention_mask = attention_mask + [0] * pad_len
194
+
195
+ encoding = {"input_ids": input_ids, "attention_mask": attention_mask}
196
+ if return_token_type_ids:
197
+ tti = [0] * len(input_ids)
198
+ if pair_ids is not None and add_special_tokens:
199
+ sep_id = self._tok.SPECIAL_TOKENS.get("[SEP]", 6)
200
+ sep_idx = None
201
+ for i, _id in enumerate(input_ids):
202
+ if _id == sep_id and sep_idx is None:
203
+ sep_idx = i
204
+ if sep_idx is not None:
205
+ for j in range(sep_idx + 1, len(tti)):
206
+ tti[j] = 1
207
+ encoding["token_type_ids"] = tti
208
+ if return_length:
209
+ encoding["length"] = len(input_ids)
210
+
211
+ if return_tensors is not None:
212
+ import torch
213
+ for k, v in list(encoding.items()):
214
+ if isinstance(v, list) and all(isinstance(x, int) for x in v):
215
+ encoding[k] = torch.tensor([v], dtype=torch.long)
216
+ elif isinstance(v, int):
217
+ encoding[k] = torch.tensor([v], dtype=torch.long)
218
+
219
+ return encoding
220
+
221
+ def decode(
222
+ self,
223
+ token_ids: Union[int, List[int], Any],
224
+ skip_special_tokens: bool = False,
225
+ clean_up_tokenization_spaces: bool = None,
226
+ **kwargs,
227
+ ) -> str:
228
+ if hasattr(token_ids, "tolist"):
229
+ token_ids = token_ids.tolist()
230
+ if isinstance(token_ids, int):
231
+ token_ids = [token_ids]
232
+ if (
233
+ isinstance(token_ids, list)
234
+ and len(token_ids) == 1
235
+ and isinstance(token_ids[0], list)
236
+ ):
237
+ token_ids = token_ids[0]
238
+ if not isinstance(token_ids, list):
239
+ token_ids = list(token_ids)
240
+ int_ids = [int(x) for x in token_ids]
241
+ return self._tok.decode(int_ids, skip_special=skip_special_tokens)
242
+
243
+ def batch_decode(self, sequences, **kwargs):
244
+ return [self.decode(seq, **kwargs) for seq in sequences]
245
+
246
+ def save_vocabulary(self, save_directory: str, filename_prefix: Optional[str] = None) -> Tuple[str, ...]:
247
+ if not os.path.isdir(save_directory):
248
+ raise ValueError(f"Vocabulary path ({save_directory}) should be a directory")
249
+ fname = (filename_prefix + "-" if filename_prefix else "") + VOCAB_FILES_NAMES["vocab_file"]
250
+ out_path = os.path.join(save_directory, fname)
251
+ self._tok.save(out_path)
252
+ return (out_path,)
253
+
254
+ @classmethod
255
+ def from_pretrained(cls, pretrained_model_name_or_path, *inputs, **kwargs):
256
+ # Ensure vocab_file points to a resolved backend tokenizer JSON (SimpleTokenizer format)
257
+ if "vocab_file" not in kwargs or kwargs["vocab_file"] is None:
258
+ search = pretrained_model_name_or_path
259
+ if isinstance(search, str) and os.path.isdir(search):
260
+ candidate = os.path.join(search, "backend_tokenizer.json")
261
+ if os.path.isfile(candidate):
262
+ kwargs["vocab_file"] = candidate
263
+ else:
264
+ # fallback to outputs dir for local development
265
+ alt = os.path.join(_CURDIR, "backend_tokenizer.json")
266
+ if os.path.isfile(alt):
267
+ kwargs["vocab_file"] = alt
268
+ return super().from_pretrained(pretrained_model_name_or_path, *inputs, **kwargs)
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name_or_path": "stellarai-tiny",
3
+ "do_lower_case": false,
4
+ "model_max_length": 1024,
5
+ "padding_side": "right",
6
+ "truncation_side": "right",
7
+ "bos_token": "[BOS]",
8
+ "eos_token": "[EOS]",
9
+ "unk_token": "[UNK]",
10
+ "sep_token": "[SEP]",
11
+ "pad_token": "[PAD]",
12
+ "cls_token": "[CLS]",
13
+ "mask_token": "[MASK]",
14
+ "additional_special_tokens": ["[IMG]", "[BOI]", "[EOI]"],
15
+ "strip_accents": false,
16
+ "clean_up_tokenization_spaces": true,
17
+ "comment_tokens": [],
18
+ "added_tokens_decoder": {
19
+ "0": {"content": "[PAD]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
20
+ "1": {"content": "[BOS]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
21
+ "2": {"content": "[EOS]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
22
+ "3": {"content": "[UNK]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
23
+ "4": {"content": "[MASK]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
24
+ "5": {"content": "[CLS]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
25
+ "6": {"content": "[SEP]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
26
+ "7": {"content": "[IMG]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
27
+ "8": {"content": "[BOI]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true},
28
+ "9": {"content": "[EOI]", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true}
29
+ }
30
+ }
vocab.json ADDED
The diff for this file is too large to render. See raw diff