Skip to content

Install

bulanik is pure Python with no runtime dependencies. The core installs on its own; three extras add the optional parts.

From PyPI

pip install bulanik                 # core: numbers, aggregation, sets, inference, type-2, ANFIS, MCDM
pip install "bulanik[lumix]"        # + the LumiX bridge (bulanik.lumix)
pip install "bulanik[sezgi]"        # + the sezgi bridge (bulanik.sezgi)
pip install "bulanik[plot]"         # + figures (bulanik.plot)
pip install "bulanik[lumix,sezgi,plot]"   # everything

With uv: uv add bulanik or uv add "bulanik[lumix,sezgi,plot]".

Extra Adds Installs
(none) everything except the three parts below nothing
lumix bulanik.lumix: linear BWM, Zimmermann fuzzy programming, scores as LumiX data lumix-opt>=0.3.2, ortools>=9.8
sezgi bulanik.sezgi: nonlinear and fuzzy BWM, ANFIS training with metaheuristics sezgi>=0.1.6
plot bulanik.plot: membership, orthopair, inference and MCDM figures in a light and a dark theme matplotlib>=3.8

Importing a bridge or bulanik.plot without its extra raises an ImportError that names the extra to install. The rest of bulanik never imports them.

Python versions

bulanik supports Python 3.10, 3.11, 3.12 and 3.13. Building this documentation site needs Python 3.11 or newer, because the docs build pins a matplotlib release that has no Python 3.10 wheel.

From a checkout (development)

git clone https://github.com/tdelphi1981/bulanik.git
cd bulanik
uv sync                      # core + the dev group (pytest, hypothesis, LumiX, OR-Tools, sezgi, matplotlib)
uv run pytest -q             # tests and doctests

# or with pip
pip install -e ".[lumix,sezgi,plot]"

To build this site locally (Python 3.11 or newer):

uv sync --group docs
uv run --group docs mkdocs serve          # live preview
uv run --group docs mkdocs build --strict # the same check CI runs

The docs group includes the bridge packages and matplotlib, so every code block in the documentation runs when the site is built.

Verify the install

This block runs when the site is built, so what you see is real output from the installed version:

import importlib.util

import bulanik

print("bulanik", bulanik.__version__)
for module, extra in [("lumix", "lumix"), ("sezgi", "sezgi"), ("matplotlib", "plot")]:
    found = importlib.util.find_spec(module) is not None
    print(f"extra {extra!r}: {'available' if found else 'not installed'}")
bulanik 0.3.0
extra 'lumix': available
extra 'sezgi': available
extra 'plot': available