openfll-python 0.2.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- PyFLL/PyFLL.pyi +306 -0
- PyFLL/__init__.py +97 -0
- PyFLL/_core.cp314-win_amd64.pyd +0 -0
- PyFLL/libgcc_s_seh-1.dll +0 -0
- PyFLL/libstdc++-6.dll +0 -0
- PyFLL/libwinpthread-1.dll +0 -0
- openfll/PyFLL.pyi +284 -0
- openfll/__init__.py +463 -0
- openfll/__init__.pyi +270 -0
- openfll/_helpers/__init__.py +6 -0
- openfll/_helpers/plotting.py +305 -0
- openfll/_helpers/sampling.py +143 -0
- openfll/sklearn.py +546 -0
- openfll_python-0.2.0.dist-info/METADATA +246 -0
- openfll_python-0.2.0.dist-info/RECORD +18 -0
- openfll_python-0.2.0.dist-info/WHEEL +5 -0
- openfll_python-0.2.0.dist-info/licenses/LICENSE +21 -0
- openfll_python-0.2.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: openfll_python
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Python bindings for OpenFLL fuzzy logic library
|
|
5
|
+
Author: SPARS-TUSUR
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Source, https://github.com/SPARS-TUSUR/openfll-python
|
|
8
|
+
Project-URL: Documentation, https://spars-tusur.github.io/openfll-python/
|
|
9
|
+
Project-URL: Issues, https://github.com/SPARS-TUSUR/openfll-python/issues
|
|
10
|
+
Keywords: fuzzy-logic,sugeno,openfll,bindings
|
|
11
|
+
Platform: win_amd64
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Science/Research
|
|
14
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
15
|
+
Classifier: Programming Language :: C++
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
17
|
+
Classifier: Topic :: Scientific/Engineering
|
|
18
|
+
Requires-Python: <3.15,>=3.14
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
Requires-Dist: numpy>=2.0
|
|
22
|
+
Provides-Extra: plot
|
|
23
|
+
Requires-Dist: matplotlib>=3.8; extra == "plot"
|
|
24
|
+
Provides-Extra: sklearn
|
|
25
|
+
Requires-Dist: scikit-learn>=1.3.0; extra == "sklearn"
|
|
26
|
+
Provides-Extra: test
|
|
27
|
+
Requires-Dist: pytest>=7.0; extra == "test"
|
|
28
|
+
Requires-Dist: scikit-learn>=1.3.0; extra == "test"
|
|
29
|
+
Requires-Dist: openpyxl<4,>=3.1; extra == "test"
|
|
30
|
+
Requires-Dist: matplotlib>=3.8; extra == "test"
|
|
31
|
+
Requires-Dist: simpful==2.12.0; extra == "test"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
<p align="center">
|
|
35
|
+
<img src="https://raw.githubusercontent.com/SPARS-TUSUR/openfll-python/main/docs/assets/openfll-logo.png" alt="OpenFLL — Open Fuzzy Logic Library" width="320">
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
# openfll-python
|
|
39
|
+
|
|
40
|
+
**Python биндинги и библиотека машинного обучения для OpenFLL** (высокопроизводительное C++ ядро нечёткой логики).
|
|
41
|
+
|
|
42
|
+
[]()
|
|
43
|
+
[]()
|
|
44
|
+
[]()
|
|
45
|
+
[]()
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Что это
|
|
50
|
+
|
|
51
|
+
`openfll` — Python-обёртка над [OpenFLL](https://github.com/SPARS-TUSUR/fuzzy-logic-library), предоставляющая два согласованных уровня работы:
|
|
52
|
+
1. **Низкоуровневый императивный движок (`openfll.SugenoEngine`)**: прямое управление нечёткой моделью Сугено нулевого порядка, регистрация функций принадлежности, текстовые и кортежные правила, явные t-нормы и нативный C++ батч-инференс со скоростью **более 11 млн сэмплов в секунду**.
|
|
53
|
+
2. **Scikit-Learn регрессор (`openfll.sklearn.SugenoRegressor`)**: полноценный эстимейтор машинного обучения, реализующий алгоритм обучения констант заключений правил методом наименьших квадратов (МНК / Ridge), совместимый с `clone()`, `cross_val_score()`, `GridSearchCV()` и пайплайнами.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Установка
|
|
58
|
+
|
|
59
|
+
Версия 0.2.0 распространяется как бинарный wheel для 64-разрядной Windows и
|
|
60
|
+
CPython 3.14:
|
|
61
|
+
|
|
62
|
+
```powershell
|
|
63
|
+
py -3.14 -m pip install openfll_python
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Поддержка scikit-learn устанавливается дополнительной группой зависимостей:
|
|
67
|
+
|
|
68
|
+
```powershell
|
|
69
|
+
py -3.14 -m pip install "openfll_python[sklearn]"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`openfll_python` — имя дистрибутива на PyPI. Имя импортируемого Python-пакета
|
|
73
|
+
остаётся `openfll`:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
import openfll
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Быстрый старт
|
|
82
|
+
|
|
83
|
+
### 1. Низкоуровневый движок `SugenoEngine`
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
import openfll
|
|
87
|
+
import numpy as np
|
|
88
|
+
|
|
89
|
+
# Создание и настройка движка
|
|
90
|
+
e = openfll.SugenoEngine()
|
|
91
|
+
e.add_input_var("x1")
|
|
92
|
+
e.add_input_var("x2")
|
|
93
|
+
e.add_output_var("y")
|
|
94
|
+
|
|
95
|
+
# Функции принадлежности антецедентов
|
|
96
|
+
e.add_membership_func("x1", "x1_low", "triangular", openfll.triangular(-10, 0, 10))
|
|
97
|
+
e.add_membership_func("x1", "x1_high", "triangular", openfll.triangular(0, 10, 20))
|
|
98
|
+
e.add_membership_func("x2", "x2_low", "gaussian", openfll.gaussian(center=0, sigma=2))
|
|
99
|
+
e.add_membership_func("x2", "x2_high", "trapezoidal", openfll.trapezoidal(0, 5, 10, 15))
|
|
100
|
+
|
|
101
|
+
# Константы заключений
|
|
102
|
+
e.add_membership_func("y", "c1", "constant", openfll.constant(10.0))
|
|
103
|
+
e.add_membership_func("y", "c2", "constant", openfll.constant(-5.0))
|
|
104
|
+
|
|
105
|
+
# Правила вывода (текстовая форма с AND/OR)
|
|
106
|
+
e.add_rule('IF x1 IS "x1_low" AND x2 IS "x2_low" THEN y IS "c1"')
|
|
107
|
+
e.add_rule('IF x1 IS "x1_high" AND x2 IS "x2_high" THEN y IS "c2"')
|
|
108
|
+
e.build()
|
|
109
|
+
|
|
110
|
+
# 1. Скалярный инференс через словарь
|
|
111
|
+
y_val = e.predict({"x1": 5.0, "x2": 0.0})
|
|
112
|
+
|
|
113
|
+
# 2. Высокопроизводительный нативный батч-инференс (NumPy матрица)
|
|
114
|
+
X = np.random.uniform(0.0, 8.0, size=(100000, 2))
|
|
115
|
+
y_batch = e.predict(X) # вычисляется за ~9 мс в нативном C++ коде
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Визуальная проверка функций принадлежности
|
|
119
|
+
|
|
120
|
+
Установите опциональную зависимость для графиков:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pip install "openfll_python[plot]"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
После регистрации функций принадлежности вызовите `plot_mf`. По умолчанию
|
|
127
|
+
создаётся отдельный рисунок с подписанными осями для каждой входной и выходной
|
|
128
|
+
переменной:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
# Метод движка и функциональная форма эквивалентны.
|
|
132
|
+
plots = e.plot_mf(show=True)
|
|
133
|
+
# plots = openfll.plot_mf(e, show=True)
|
|
134
|
+
|
|
135
|
+
# Только одна выбранная переменная: x2 и y строиться не будут.
|
|
136
|
+
x1_plot = e.plot_mf("x1", show=True)
|
|
137
|
+
|
|
138
|
+
# Выбор отдельных переменных, явные диапазоны и сохранение PNG.
|
|
139
|
+
plots = e.plot_mf(
|
|
140
|
+
["x1", "x2", "y"],
|
|
141
|
+
ranges={"x1": (-15.0, 25.0), "x2": (-10.0, 20.0)},
|
|
142
|
+
show=False,
|
|
143
|
+
save_dir="membership_plots",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Возвращаются matplotlib Figure и Axes для дальнейшей настройки.
|
|
147
|
+
plots["x1"].axes.set_title("Проверка параметров x1")
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Для входов отображаются кривые степени принадлежности. Константные заключения
|
|
151
|
+
выхода Сугено показываются вертикальными singleton-маркерами, поскольку они
|
|
152
|
+
являются чёткими значениями, а не выходными нечёткими множествами.
|
|
153
|
+
|
|
154
|
+
### 2. Обучение модели через Scikit-Learn (`SugenoRegressor`)
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
from openfll.sklearn import SugenoModelSpec, SugenoRegressor
|
|
158
|
+
from sklearn.model_selection import cross_val_score, GridSearchCV
|
|
159
|
+
from sklearn.metrics import mean_squared_error, r2_score
|
|
160
|
+
|
|
161
|
+
# 1. Декларативная спецификация нечёткой структуры
|
|
162
|
+
spec = SugenoModelSpec(
|
|
163
|
+
inputs={
|
|
164
|
+
"x1": [("x1_low", "triangular", [-10, 0, 10]), ("x1_high", "triangular", [0, 10, 20])],
|
|
165
|
+
"x2": [("x2_low", "triangular", [-10, 0, 10]), ("x2_high", "triangular", [0, 10, 20])],
|
|
166
|
+
},
|
|
167
|
+
rules=[
|
|
168
|
+
'IF x1 IS "x1_low" AND x2 IS "x2_low" THEN y IS "c1"',
|
|
169
|
+
'IF x1 IS "x1_high" AND x2 IS "x2_high" THEN y IS "c2"',
|
|
170
|
+
],
|
|
171
|
+
output_name="y"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# 2. Обучение констант заключений правил методом наименьших квадратов
|
|
175
|
+
reg = SugenoRegressor(model_spec=spec, solver="ridge", alpha=0.01)
|
|
176
|
+
reg.fit(X_train, y_train)
|
|
177
|
+
|
|
178
|
+
# 3. Доступ к подобранным коэффициентам и обученному движку
|
|
179
|
+
print("Найденные константы c_r:", reg.coef_)
|
|
180
|
+
print("Ранг матрицы влияния:", reg.rank_)
|
|
181
|
+
y_pred = reg.predict(X_test)
|
|
182
|
+
|
|
183
|
+
# 4. Кросс-валидация и решётчатый поиск гиперпараметров
|
|
184
|
+
cv_scores = cross_val_score(reg, X_train, y_train, cv=5, scoring="r2")
|
|
185
|
+
param_grid = [
|
|
186
|
+
{"solver": ["lstsq"], "alpha": [0.0]},
|
|
187
|
+
{"solver": ["ridge"], "alpha": [0.01, 0.1, 1.0]},
|
|
188
|
+
]
|
|
189
|
+
grid = GridSearchCV(reg, param_grid, cv=3, error_score="raise")
|
|
190
|
+
grid.fit(X_train, y_train)
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Производительность (Результаты бенчмаркинга)
|
|
196
|
+
|
|
197
|
+
Проведено масштабное профилирование пакетного инференса на выборках от 1 до 100 000 точек. Нативный батч-метод `predict_batch()` в C++ полностью исключает накладные расходы интерпретатора Python и GIL:
|
|
198
|
+
|
|
199
|
+
| Размер батча | Нативный batch (мс) | Python Scalar Loop (мс) | Ускорение (Speedup) | Пропускная способность |
|
|
200
|
+
|:---:|:---:|:---:|:---:|:---:|
|
|
201
|
+
| 10 | 0.005 мс | 0.024 мс | **4.8x** | 2.00 млн сэмплов/с |
|
|
202
|
+
| 100 | 0.015 мс | 0.231 мс | **15.4x** | 6.67 млн сэмплов/с |
|
|
203
|
+
| 1 000 | 0.108 мс | 2.285 мс | **21.2x** | 9.26 млн сэмплов/с |
|
|
204
|
+
| 10 000 | 0.912 мс | 23.41 мс | **25.7x** | 10.96 млн сэмплов/с |
|
|
205
|
+
| 100 000 | 9.010 мс | 487.5 мс | **54.1x** | **11.10 млн сэмплов/с** |
|
|
206
|
+
|
|
207
|
+
Графики ускорения и пропускной способности находятся в директории `benchmarks/plots/`.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Математический базис обучения (Sugeno-0)
|
|
212
|
+
|
|
213
|
+
Вывод модели Сугено нулевого порядка дефаззификатором взвешенного среднего (Weighted Average) описывается формулой:
|
|
214
|
+
$$y(x) = \frac{\sum_{r=1}^R w_r(x) \cdot c_r}{\sum_{r=1}^R w_r(x)} = \sum_{r=1}^R \bar{w}_r(x) \cdot c_r$$
|
|
215
|
+
|
|
216
|
+
При фиксированных функциях принадлежности посылок и t-нормах нормализованные веса $\bar{w}_r(x)$ зависят только от входного вектора $x$. Модель **строго линейна** по вектору констант $c$:
|
|
217
|
+
$$y = A(X) \cdot c, \quad A_{i, r} = \bar{w}_r(x_i)$$
|
|
218
|
+
|
|
219
|
+
* Погрешность аппроксимации $y = A \cdot c$ составляет менее $10^{-12}$ (машинная точность).
|
|
220
|
+
* Для вычисления матрицы $A(X)$ применяется **метод базисной декомпозиции**: при подаче базисного вектора $e_m = [0, \dots, 1, \dots, 0]$ нативный метод `predict_batch(X)` возвращает в точности $m$-й столбец матрицы $A$ со скоростью C++.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Архитектурные ограничения версии v1
|
|
225
|
+
|
|
226
|
+
В текущей версии библиотеки действуют следующие архитектурные соглашения:
|
|
227
|
+
1. **Обучаемые параметры**: обучаются **только вещественные константы заключений правил** ($c_r$). Функции принадлежности входов и структура правил фиксированы пользователем до `fit()`.
|
|
228
|
+
2. **Форма вывода**: строго **single-output** регрессия (одна целевая непрерывная переменная).
|
|
229
|
+
3. **Глобальная уникальность имён MF**: в ядре C++ имена функций принадлежности регистрируются глобально в движке (нельзя использовать имя `"low"` для двух разных переменных; используйте `x1_low`, `x2_low`).
|
|
230
|
+
4. **Минимум две переменные в правиле**: парсер правил OpenFLL требует не менее двух переменных в условии, соединённых t-нормой или s-нормой.
|
|
231
|
+
5. **Точки вне покрытия правил**: если точка выборки лежит за пределами носителя всех нечётких правил, дефаззификатор возвращает `NaN` ($0.0 / 0.0$). Метод `fit()` диагностирует такие точки и выбрасывает понятную ошибку `ValueError`.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Документация в формате DOCX
|
|
236
|
+
|
|
237
|
+
Сгенерирована подробная иллюстрированная академическая документация по проекту:
|
|
238
|
+
* [`Документация_OpenFLL_Python_API.docx`](https://github.com/SPARS-TUSUR/openfll-python/blob/main/docs/Документация_OpenFLL_Python_API.docx)
|
|
239
|
+
|
|
240
|
+
Документ содержит подробный архитектурный анализ, математические доказательства, результаты замеров производительности, 5 встроенных графиков высокого разрешения, таблицы параметров и руководство пользователя.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Лицензия
|
|
245
|
+
|
|
246
|
+
MIT License. См. файл [LICENSE](LICENSE).
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
PyFLL/PyFLL.pyi,sha256=3TuZlivOvZabyqZMhpxjHdRrq6XDuKDswGt8-ycZa1w,10851
|
|
2
|
+
PyFLL/__init__.py,sha256=OMuK2mF0wEgBjHHFgZ-Ojjl-vWKTzA1Z-3d2tjxn_Mc,4038
|
|
3
|
+
PyFLL/_core.cp314-win_amd64.pyd,sha256=UVvV6mi9hDJ0t2N9uMOLnh8WUzBHsWO8n4oiBIhmD6U,833268
|
|
4
|
+
PyFLL/libgcc_s_seh-1.dll,sha256=eR6_ZumcfBtO02ZkaM7EWgFytMiUKsbITD6cqz4bUnA,150537
|
|
5
|
+
PyFLL/libstdc++-6.dll,sha256=Tkgi3EqqmTg_WB2uerlGSuiTRsXKdC9--83r4gsP57U,2659194
|
|
6
|
+
PyFLL/libwinpthread-1.dll,sha256=7k9QNRKwnX4maFGMQdbBdnVaNUUjrhWqTTYiDJyzF5E,73820
|
|
7
|
+
openfll/PyFLL.pyi,sha256=iYjQ9lWTkQKViR9mHTkzXHYi-WVObzxCjh5K0IaKqBw,9884
|
|
8
|
+
openfll/__init__.py,sha256=km722CRhZBYlHzMmafaGNGaxGoX2jmb5MSBWYq7Ucts,20741
|
|
9
|
+
openfll/__init__.pyi,sha256=EDOaWmyOuq4my8-uze-MUXqHmngCZexDYxWaAVZyiwA,10237
|
|
10
|
+
openfll/sklearn.py,sha256=XBFd4ylQP4O8HBRn26mTBmJhNeCOuiv0z1RoqpRS658,26468
|
|
11
|
+
openfll/_helpers/__init__.py,sha256=JCjUYFyEXXj6hyQTJgHcvQlXSLRhhHp_BrXeca5Jrd0,374
|
|
12
|
+
openfll/_helpers/plotting.py,sha256=cadzHGJN8QwBp3MzL7fvNFKvExZXy-6qOPKeexfBZyE,11906
|
|
13
|
+
openfll/_helpers/sampling.py,sha256=336Cjljzms14X6vq0lFt5J5mUHnjqNjWRJFK4hP5gk8,5264
|
|
14
|
+
openfll_python-0.2.0.dist-info/licenses/LICENSE,sha256=q8yPRHvM1_zI0o3PWm-a4eKlPDYS2ZUW8tkvOgWjUec,1089
|
|
15
|
+
openfll_python-0.2.0.dist-info/METADATA,sha256=diFx0PDntqOpqLTvJJYFQoFi9VVrfrkYKJZG2-4yDq8,13787
|
|
16
|
+
openfll_python-0.2.0.dist-info/WHEEL,sha256=GjNoWUKTwVqYOh-GAeOqmWs8K5Mlz_Ym2F39m91XU8Q,101
|
|
17
|
+
openfll_python-0.2.0.dist-info/top_level.txt,sha256=mNm6F8hO3p6Y5z7SnGgigzH-Ny6ITR6Qvc-Q_390E-k,14
|
|
18
|
+
openfll_python-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SPARS-TUSUR
|
|
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.
|