openfll-python
Python биндинги и библиотека машинного обучения для OpenFLL (высокопроизводительное C++ ядро нечёткой логики).
Что это
openfll — Python-обёртка над OpenFLL, предоставляющая два согласованных уровня работы:
- Низкоуровневый императивный движок (
openfll.SugenoEngine): прямое управление нечёткой моделью Сугено нулевого порядка, регистрация функций принадлежности, текстовые и кортежные правила, явные t-нормы и нативный C++ батч-инференс со скоростью более 11 млн сэмплов в секунду. - Scikit-Learn регрессор (
openfll.sklearn.SugenoRegressor): полноценный эстимейтор машинного обучения, реализующий алгоритм обучения констант заключений правил методом наименьших квадратов (МНК / Ridge), совместимый сclone(),cross_val_score(),GridSearchCV()и пайплайнами.
Установка
Версия 0.2.0 распространяется как бинарный wheel для 64-разрядной Windows и CPython 3.14:
py -3.14 -m pip install openfll_python
Поддержка scikit-learn устанавливается дополнительной группой зависимостей:
py -3.14 -m pip install "openfll_python[sklearn]"
openfll_python — имя дистрибутива на PyPI. Имя импортируемого Python-пакета
остаётся openfll:
import openfll
Быстрый старт
1. Низкоуровневый движок SugenoEngine
import openfll
import numpy as np
# Создание и настройка движка
e = openfll.SugenoEngine()
e.add_input_var("x1")
e.add_input_var("x2")
e.add_output_var("y")
# Функции принадлежности антецедентов
e.add_membership_func("x1", "x1_low", "triangular", openfll.triangular(-10, 0, 10))
e.add_membership_func("x1", "x1_high", "triangular", openfll.triangular(0, 10, 20))
e.add_membership_func("x2", "x2_low", "gaussian", openfll.gaussian(center=0, sigma=2))
e.add_membership_func("x2", "x2_high", "trapezoidal", openfll.trapezoidal(0, 5, 10, 15))
# Константы заключений
e.add_membership_func("y", "c1", "constant", openfll.constant(10.0))
e.add_membership_func("y", "c2", "constant", openfll.constant(-5.0))
# Правила вывода (текстовая форма с AND/OR)
e.add_rule('IF x1 IS "x1_low" AND x2 IS "x2_low" THEN y IS "c1"')
e.add_rule('IF x1 IS "x1_high" AND x2 IS "x2_high" THEN y IS "c2"')
e.build()
# 1. Скалярный инференс через словарь
y_val = e.predict({"x1": 5.0, "x2": 0.0})
# 2. Высокопроизводительный нативный батч-инференс (NumPy матрица)
X = np.random.uniform(0.0, 8.0, size=(100000, 2))
y_batch = e.predict(X) # вычисляется за ~9 мс в нативном C++ коде
Визуальная проверка функций принадлежности
Установите опциональную зависимость для графиков:
pip install "openfll_python[plot]"
После регистрации функций принадлежности вызовите plot_mf. По умолчанию
создаётся отдельный рисунок с подписанными осями для каждой входной и выходной
переменной:
# Метод движка и функциональная форма эквивалентны.
plots = e.plot_mf(show=True)
# plots = openfll.plot_mf(e, show=True)
# Только одна выбранная переменная: x2 и y строиться не будут.
x1_plot = e.plot_mf("x1", show=True)
# Выбор отдельных переменных, явные диапазоны и сохранение PNG.
plots = e.plot_mf(
["x1", "x2", "y"],
ranges={"x1": (-15.0, 25.0), "x2": (-10.0, 20.0)},
show=False,
save_dir="membership_plots",
)
# Возвращаются matplotlib Figure и Axes для дальнейшей настройки.
plots["x1"].axes.set_title("Проверка параметров x1")
Для входов отображаются кривые степени принадлежности. Константные заключения выхода Сугено показываются вертикальными singleton-маркерами, поскольку они являются чёткими значениями, а не выходными нечёткими множествами.
2. Обучение модели через Scikit-Learn (SugenoRegressor)
from openfll.sklearn import SugenoModelSpec, SugenoRegressor
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.metrics import mean_squared_error, r2_score
# 1. Декларативная спецификация нечёткой структуры
spec = SugenoModelSpec(
inputs={
"x1": [("x1_low", "triangular", [-10, 0, 10]), ("x1_high", "triangular", [0, 10, 20])],
"x2": [("x2_low", "triangular", [-10, 0, 10]), ("x2_high", "triangular", [0, 10, 20])],
},
rules=[
'IF x1 IS "x1_low" AND x2 IS "x2_low" THEN y IS "c1"',
'IF x1 IS "x1_high" AND x2 IS "x2_high" THEN y IS "c2"',
],
output_name="y"
)
# 2. Обучение констант заключений правил методом наименьших квадратов
reg = SugenoRegressor(model_spec=spec, solver="ridge", alpha=0.01)
reg.fit(X_train, y_train)
# 3. Доступ к подобранным коэффициентам и обученному движку
print("Найденные константы c_r:", reg.coef_)
print("Ранг матрицы влияния:", reg.rank_)
y_pred = reg.predict(X_test)
# 4. Кросс-валидация и решётчатый поиск гиперпараметров
cv_scores = cross_val_score(reg, X_train, y_train, cv=5, scoring="r2")
param_grid = [
{"solver": ["lstsq"], "alpha": [0.0]},
{"solver": ["ridge"], "alpha": [0.01, 0.1, 1.0]},
]
grid = GridSearchCV(reg, param_grid, cv=3, error_score="raise")
grid.fit(X_train, y_train)
Производительность (Результаты бенчмаркинга)
Проведено масштабное профилирование пакетного инференса на выборках от 1 до 100 000 точек. Нативный батч-метод predict_batch() в C++ полностью исключает накладные расходы интерпретатора Python и GIL:
| Размер батча | Нативный batch (мс) | Python Scalar Loop (мс) | Ускорение (Speedup) | Пропускная способность |
|---|---|---|---|---|
| 10 | 0.005 мс | 0.024 мс | 4.8x | 2.00 млн сэмплов/с |
| 100 | 0.015 мс | 0.231 мс | 15.4x | 6.67 млн сэмплов/с |
| 1 000 | 0.108 мс | 2.285 мс | 21.2x | 9.26 млн сэмплов/с |
| 10 000 | 0.912 мс | 23.41 мс | 25.7x | 10.96 млн сэмплов/с |
| 100 000 | 9.010 мс | 487.5 мс | 54.1x | 11.10 млн сэмплов/с |
Графики ускорения и пропускной способности находятся в директории benchmarks/plots/.
Математический базис обучения (Sugeno-0)
Вывод модели Сугено нулевого порядка дефаззификатором взвешенного среднего (Weighted Average) описывается формулой: $$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$$
При фиксированных функциях принадлежности посылок и t-нормах нормализованные веса $\bar{w}r(x)$ зависят только от входного вектора $x$. Модель строго линейна по вектору констант $c$: $$y = A(X) \cdot c, \quad A{i, r} = \bar{w}_r(x_i)$$
- Погрешность аппроксимации $y = A \cdot c$ составляет менее $10^{-12}$ (машинная точность).
- Для вычисления матрицы $A(X)$ применяется метод базисной декомпозиции: при подаче базисного вектора $e_m = [0, \dots, 1, \dots, 0]$ нативный метод
predict_batch(X)возвращает в точности $m$-й столбец матрицы $A$ со скоростью C++.
Архитектурные ограничения версии v1
В текущей версии библиотеки действуют следующие архитектурные соглашения:
- Обучаемые параметры: обучаются только вещественные константы заключений правил ($c_r$). Функции принадлежности входов и структура правил фиксированы пользователем до
fit(). - Форма вывода: строго single-output регрессия (одна целевая непрерывная переменная).
- Глобальная уникальность имён MF: в ядре C++ имена функций принадлежности регистрируются глобально в движке (нельзя использовать имя
"low"для двух разных переменных; используйтеx1_low,x2_low). - Минимум две переменные в правиле: парсер правил OpenFLL требует не менее двух переменных в условии, соединённых t-нормой или s-нормой.
- Точки вне покрытия правил: если точка выборки лежит за пределами носителя всех нечётких правил, дефаззификатор возвращает
NaN($0.0 / 0.0$). Методfit()диагностирует такие точки и выбрасывает понятную ошибкуValueError.
Документация в формате DOCX
Сгенерирована подробная иллюстрированная академическая документация по проекту:
Документ содержит подробный архитектурный анализ, математические доказательства, результаты замеров производительности, 5 встроенных графиков высокого разрешения, таблицы параметров и руководство пользователя.
Лицензия
MIT License. См. файл LICENSE.
Metadata
Release files for openfll-python 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| openfll_python-0.2.0-cp314-cp314-win_amd64.whl | CPython 3.14 | CPython 3.14 | Windows x86-64 | Details for openfll_python-0.2.0-cp314-cp314-win_amd64.whl |
Release files / openfll_python-0.2.0-cp314-cp314-win_amd64.whl
| Download URL | openfll_python-0.2.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 1.3 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
18121aa7bf334a19c1e5eadb0222f1238eb14147a51cfb5a1ebcd10c23cfb08d
|
|
BLAKE2b-256 checksum How to use checksums |
46cc98575f7e4519f0d8d819c4746cc7e36e5f6bcfa93f606d7f69db7d975c33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logSecurity for openfll-python 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 1 file in this release has been uploaded with provenance metadata.
Attestation for openfll_python-0.2.0-cp314-cp314-win_amd64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.