File size: 8,796 Bytes
f6d2eba
95e4806
31aa677
 
 
 
a12e029
 
 
 
 
 
 
31aa677
a12e029
 
 
f6d2eba
a12e029
2bf36fc
a12e029
2bf36fc
 
 
 
 
 
 
 
 
 
ab2b1b8
2bf36fc
95e4806
 
 
6b79976
95e4806
 
2bf36fc
a12e029
31aa677
 
ab2b1b8
31aa677
 
2bf36fc
31aa677
2bf36fc
31aa677
2bf36fc
 
 
 
 
 
 
 
 
8e48f10
2bf36fc
ab2b1b8
2bf36fc
ab2b1b8
2bf36fc
 
 
 
31aa677
 
2bf36fc
 
 
 
ab2b1b8
2bf36fc
 
 
31aa677
 
 
ab2b1b8
31aa677
 
2bf36fc
31aa677
2bf36fc
31aa677
2bf36fc
a12e029
2bf36fc
 
 
 
 
 
 
8e48f10
2bf36fc
ab2b1b8
2bf36fc
ab2b1b8
2bf36fc
 
 
 
 
 
 
 
 
 
ab2b1b8
2bf36fc
 
 
31aa677
 
 
ab2b1b8
31aa677
 
2bf36fc
 
 
31aa677
2bf36fc
31aa677
2bf36fc
a12e029
2bf36fc
 
 
 
 
8e48f10
2bf36fc
ab2b1b8
2bf36fc
ab2b1b8
2bf36fc
 
 
 
 
 
 
 
 
 
ab2b1b8
2bf36fc
 
 
a12e029
31aa677
 
2bf36fc
 
 
 
 
 
 
ab2b1b8
2bf36fc
a12e029
 
31aa677
a12e029
 
 
31aa677
696b0b0
 
a12e029
 
31aa677
 
 
 
a12e029
31aa677
 
 
 
 
2bf36fc
31aa677
2bf36fc
31aa677
 
2bf36fc
a12e029
31aa677
a12e029
31aa677
 
696b0b0
31aa677
 
a12e029
31aa677
2bf36fc
 
 
 
 
 
 
 
 
 
 
a50b561
2bf36fc
a50b561
2bf36fc
a50b561
ab2b1b8
a50b561
2bf36fc
 
 
 
 
 
 
a50b561
2bf36fc
a50b561
2bf36fc
a50b561
2bf36fc
 
 
 
 
 
 
 
 
 
 
 
ab2b1b8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
---
license: cc-by-nc-4.0
language:
- en
- pl
- ru
tags:
- math
- algebra
- equation-solver
- pytorch
- onnx
- safetensors
- gguf
- rnn
- gru
pipeline_tag: feature-extraction
---

<div align="center">

# 🤖 Stupid-Equation-Solver

### Solving 1st–4th Degree Polynomials from Raw Text

*No CAS. No symbolic engine. Just a neural network that learned algebra from scratch.*

[![Params](https://img.shields.io/badge/Params-3.73M-blue.svg)]()
[![Hardware](https://img.shields.io/badge/Trained%20on-Intel%20Arc%20A770-0071C5.svg)]()
[![OS](https://img.shields.io/badge/OS-Arch%20Linux-1793D1.svg)]()

[English](#english) · [Polski](#polski) · [Русский](#russian)

## 📜 License

**Weights:** Released under [CC-BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/) for non-commercial use.

**Training code & data:** Not publicly available. All rights reserved.

</div>

---

<a id="english"></a>
## 🇬🇧 English

### 📖 Description

A lightweight neural network that solves algebraic polynomial equations of **1st to 4th degree** (both complete and incomplete) — directly from raw character text.

The model infers **real roots without any external CAS or symbolic algebra engine**. It learned polynomial factorization, discriminant calculation, sign switching, and root extraction directly from ASCII strings.

> 💡 *Think of it as a tiny neural calculator that reads equations like a human would — and just knows the answer.*

### 🏗️ Architecture & Training

| Property | Value |
|---|---|
| **Architecture** | 2-layer Bidirectional GRU (BiGRU) + Deep MLP regression head |
| **Parameters** | `embed_dim=32`, `hidden_dim=384`, `max_roots=4` |
| **Dataset** | 1,000,000+ synthetic equations |
| **Variable names** | x, y, a, t, z, ... (randomized) |
| **Coefficients** | Non-monic scales from −6 to +12 |
| **Root range** | [-20, 20] |
| **Hardware** | Intel Arc A770 (16GB GDDR6) |
| **OS** | Arch Linux |
| **Backend** | PyTorch XPU (oneAPI / Level Zero) |
| **Loss** | Custom Masked MSE (penalizes only valid real roots) |

### 🎯 Benchmark Results (100 Unseen Test Equations)

| Degree | Type | MAE | Notes |
|:---:|:---:|:---:|---|
| **1** | Linear | **0.33** | Solid |
| **2** | Quadratic | **0.27** | Handles irrationals, e.g. 1 − √2 ≈ −0.41 |
| **3** | Cubic | **0.60** | Reliable |
| **4** | Quartic | **1.17** | Best effort |
| — | **Overall** | **~0.69 – 0.75** | |

---

<a id="polski"></a>
## 🇵🇱 Polski

### 📖 Opis

Lekki model neuronowy rozwiązujący równania algebraiczne wielomianowe od **1. do 4. stopnia** (zarówno zupełne, jak i niezupełne) bezpośrednio z surowego tekstu znakowego.

Model wyznacza **pierwiastki rzeczywiste bez użycia zewnętrznych silników symbolicznych (CAS)** — uczy się wyznaczania wyróżnika (delty), rozkładu na czynniki, reguły znaków i pierwiastkowania wprost z ciągów znaków ASCII.

> 💡 *Wyobraź sobie mały neuronowy kalkulator, który czyta równania jak człowiek — i po prostu zna odpowiedź.*

### 🏗️ Architektura i Trening

| Właściwość | Wartość |
|---|---|
| **Architektura** | 2-warstwowy dwukierunkowy GRU (BiGRU) + głęboka regresyjna głowica MLP |
| **Parametry** | `embed_dim=32`, `hidden_dim=384`, `max_roots=4` |
| **Zbiór danych** | Ponad 1 000 000 syntetycznych równań |
| **Nazwy zmiennych** | x, y, a, t, z, ... (losowe) |
| **Współczynniki** | Skala od −6 do +12 |
| **Zakres pierwiastków** | [-20, 20] |
| **Sprzęt** | Intel Arc A770 (16GB GDDR6) |
| **System** | Arch Linux |
| **Backend** | PyTorch XPU (oneAPI / Level Zero) |
| **Funkcja straty** | Masked MSE (uwzględnia tylko istniejące pierwiastki) |

### 🎯 Wyniki testowe (100 równań)

| Stopień | Typ | MAE | Uwagi |
|:---:|:---:|:---:|---|
| **1** | Liniowe | **0.33** | Stabilnie |
| **2** | Kwadratowe | **0.27** | Radzi sobie z niewymiernymi, np. 1 − √2 ≈ −0.41 |
| **3** | Sześcienne | **0.60** | Niezawodnie |
| **4** | 4. stopnia | **1.17** | Zadowalająco |
| — | **Ogólnie** | **~0.69 – 0.75** | |

---

<a id="russian"></a>
## 🇷🇺 Русский

### 📖 Описание

Лёгкая нейросеть, решающая алгебраические полиномиальные уравнения **1–4 степени** (полные и неполные) прямо из сырого текста.

Модель находит **действительные корни без сторонних систем компьютерной алгебры (CAS)** — она выучила формулы Виета, дискриминант, смену знаков и извлечение корней напрямую из ASCII-строк.

> 💡 *Представьте крошечный нейронный калькулятор, который читает уравнение как человек — и просто знает ответ.*

### 🏗️ Архитектура и обучение

| Параметр | Значение |
|---|---|
| **Архитектура** | 2-слойная двунаправленная GRU (BiGRU) + полносвязная голова MLP |
| **Размерности** | `embed_dim=32`, `hidden_dim=384`, `max_roots=4` |
| **Датасет** | 1 000 000+ синтетических уравнений |
| **Переменные** | x, y, a, t, z, ... (случайные) |
| **Коэффициенты** | Немонические, от −6 до +12 |
| **Диапазон корней** | [-20, 20] |
| **Железо** | Intel Arc A770 (16GB GDDR6) |
| **ОС** | Arch Linux |
| **Бэкенд** | PyTorch XPU (oneAPI / Level Zero) |
| **Функция потерь** | Кастомный Masked MSE (штрафует только за существующие корни) |

### 🎯 Метрики качества (бенчмарк на 100 уравнениях)

| Степень | Тип | MAE | Заметки |
|:---:|:---:|:---:|---|
| **1** | Линейные | **0.33** | Стабильно |
| **2** | Квадратные | **0.27** | Справляется с иррациональными, напр. 1 − √2 ≈ −0.41 |
| **3** | Кубические | **0.60** | Надёжно |
| **4** | 4-й степени | **1.17** | На пределе |
| — | **Общая** | **~0.69 – 0.75** | |

---

## 💻 Quick Start

### Install dependencies

```bash
pip install onnxruntime numpy
```

### Solve equations in Python

```python
import json
import numpy as np
import onnxruntime as ort

# 1. Load ONNX model and metadata
# Исправлено: используем equation_embedded.onnx вместо model.onnx
session = ort.InferenceSession("equation_embedded.onnx")

with open("config.json", "r", encoding="utf-8") as f:
    config = json.load(f)

vocab = config["vocab"]
max_len = config["max_len"]

# 2. Inference function
def solve(equation: str):
    equation = equation.strip()
    if "=" not in equation:
        equation += " = 0"

    # Determine polynomial degree
    if "^4" in equation:   deg = 4
    elif "^3" in equation: deg = 3
    elif "^2" in equation: deg = 2
    else:                  deg = 1

    tokens = [vocab.get(ch, 1) for ch in equation]
    tokens = tokens[:max_len] + [0] * max(0, max_len - len(tokens))
    input_data = np.array([tokens], dtype=np.int64)

    # Run inference (проверь, что имена входов и выходов в ONNX совпадают)
    preds = session.run(["roots"], {"tokens": input_data})[0][0]
    return [round(float(r), 2) for r in preds[:deg]]

# 3. Test examples
print(solve("3x^2 - 4x - 15 = 0"))   # -> [2.96, -1.59]           (Exact: 3.0, -1.67)
print(solve("x^2 - 2x - 1 = 0"))     # -> [2.03, -0.41]           (Exact: 2.41, -0.41)
print(solve("x^2 - 16 = 0"))         # -> [3.85, -4.02]           (Exact: 4.0, -4.0)
print(solve("a^3 - 3a^2 + 2a = 0"))  # -> [2.09, 0.84, -0.14]     (Exact: 2.0, 1.0, 0.0)
```

---

⚠️ Limitations

· Regression, not symbolic. Outputs are continuous approximations, not exact fractions. Values like 2.96 instead of 3.0 are expected.

· Degree cap. Trained exclusively on 1st–4th degree polynomials. Fifth-degree and higher are out of scope for this version.

· Real roots only. Complex roots are not modeled.

· Root range. Best performance within [-20, 20].

· No repeat roots detection. Multiplicity is not reported — only the value.

---

🚀 Roadmap

☐ v2: Token-classification head for exact integer roots

☐ v2: Variable-length output (no fixed max_roots)

☐ v3: Extend to 5th+ degree polynomials

☐ v3: Complex root support

---

<div align="center">

⚡ Part of XIV AI

A startup from Poland, building AI models from scratch.

License: MIT · Trained on: Intel Arc A770 · Framework: PyTorch XPU

</div>