Metadata-Version: 2.4
Name: ex_fuzzy
Version: 3.1.0
Summary: Library to perform explainable AI using fuzzy logic.
Home-page: https://github.com/Fuminides/ex-fuzzy
Download-URL: https://pypi.org/project/ex-fuzzy/
Maintainer: Javier Fumanal Idocin
Maintainer-email: javierfumanalidocin@gmail.com
License: GPL-3.0
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.7
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy
Requires-Dist: matplotlib
Requires-Dist: pymoo>=0.6.2
Requires-Dist: pandas
Requires-Dist: scikit-learn
Provides-Extra: gpu
Requires-Dist: torch; extra == "gpu"
Provides-Extra: evox
Requires-Dist: evox>=1.3.0; extra == "evox"
Requires-Dist: torch>=2.6.0; extra == "evox"
Provides-Extra: docs
Requires-Dist: sphinx>=5.0.0; extra == "docs"
Requires-Dist: pydata-sphinx-theme>=0.13.0; extra == "docs"
Requires-Dist: sphinx-design>=0.4.0; extra == "docs"
Requires-Dist: myst-parser>=0.18.0; extra == "docs"
Requires-Dist: sphinx-copybutton>=0.5.0; extra == "docs"
Requires-Dist: sphinx-autobuild>=2021.3.14; extra == "docs"
Requires-Dist: nbsphinx>=0.8.0; extra == "docs"
Requires-Dist: sphinxcontrib-bibtex>=2.5.0; extra == "docs"
Requires-Dist: sphinx-gallery>=0.11.0; extra == "docs"
Requires-Dist: sphinx-autodoc-typehints>=1.19.0; extra == "docs"
Requires-Dist: sphinx-autoapi>=2.1.0; extra == "docs"
Requires-Dist: pygments>=2.12.0; extra == "docs"
Requires-Dist: jupyter>=1.0.0; extra == "docs"
Requires-Dist: ipykernel>=6.0.0; extra == "docs"
Requires-Dist: sphinx-math-dollar>=1.2.0; extra == "docs"
Requires-Dist: seaborn>=0.11.0; extra == "docs"
Requires-Dist: sphinxext-opengraph>=0.7.0; extra == "docs"
Requires-Dist: sphinx-external-toc>=0.3.0; extra == "docs"
Requires-Dist: doc8>=0.11.0; extra == "docs"
Requires-Dist: rstcheck>=6.0.0; extra == "docs"
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: sphinx>=5.0.0; extra == "dev"
Requires-Dist: pydata-sphinx-theme>=0.13.0; extra == "dev"
Requires-Dist: sphinx-design>=0.4.0; extra == "dev"
Requires-Dist: myst-parser>=0.18.0; extra == "dev"
Requires-Dist: sphinx-copybutton>=0.5.0; extra == "dev"
Requires-Dist: sphinx-autobuild>=2021.3.14; extra == "dev"
Requires-Dist: nbsphinx>=0.8.0; extra == "dev"
Requires-Dist: sphinxcontrib-bibtex>=2.5.0; extra == "dev"
Requires-Dist: sphinx-gallery>=0.11.0; extra == "dev"
Requires-Dist: sphinx-autodoc-typehints>=1.19.0; extra == "dev"
Requires-Dist: sphinx-autoapi>=2.1.0; extra == "dev"
Requires-Dist: pygments>=2.12.0; extra == "dev"
Requires-Dist: jupyter>=1.0.0; extra == "dev"
Requires-Dist: ipykernel>=6.0.0; extra == "dev"
Requires-Dist: sphinx-math-dollar>=1.2.0; extra == "dev"
Requires-Dist: seaborn>=0.11.0; extra == "dev"
Requires-Dist: sphinxext-opengraph>=0.7.0; extra == "dev"
Requires-Dist: sphinx-external-toc>=0.3.0; extra == "dev"
Requires-Dist: doc8>=0.11.0; extra == "dev"
Requires-Dist: rstcheck>=6.0.0; extra == "dev"
Provides-Extra: all
Requires-Dist: doc8>=0.11.0; extra == "all"
Requires-Dist: evox>=1.3.0; extra == "all"
Requires-Dist: ipykernel>=6.0.0; extra == "all"
Requires-Dist: jupyter>=1.0.0; extra == "all"
Requires-Dist: myst-parser>=0.18.0; extra == "all"
Requires-Dist: nbsphinx>=0.8.0; extra == "all"
Requires-Dist: pydata-sphinx-theme>=0.13.0; extra == "all"
Requires-Dist: pygments>=2.12.0; extra == "all"
Requires-Dist: pytest; extra == "all"
Requires-Dist: pytest-cov; extra == "all"
Requires-Dist: rstcheck>=6.0.0; extra == "all"
Requires-Dist: seaborn>=0.11.0; extra == "all"
Requires-Dist: sphinx-autoapi>=2.1.0; extra == "all"
Requires-Dist: sphinx-autobuild>=2021.3.14; extra == "all"
Requires-Dist: sphinx-autodoc-typehints>=1.19.0; extra == "all"
Requires-Dist: sphinx-copybutton>=0.5.0; extra == "all"
Requires-Dist: sphinx-design>=0.4.0; extra == "all"
Requires-Dist: sphinx-external-toc>=0.3.0; extra == "all"
Requires-Dist: sphinx-gallery>=0.11.0; extra == "all"
Requires-Dist: sphinx-math-dollar>=1.2.0; extra == "all"
Requires-Dist: sphinx>=5.0.0; extra == "all"
Requires-Dist: sphinxcontrib-bibtex>=2.5.0; extra == "all"
Requires-Dist: sphinxext-opengraph>=0.7.0; extra == "all"
Requires-Dist: torch; extra == "all"
Requires-Dist: torch>=2.6.0; extra == "all"
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: download-url
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: maintainer
Dynamic: maintainer-email
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: summary

<p align="center">
  <img src="https://github.com/user-attachments/assets/74380868-0bee-4251-b09c-57e8ad65f2e5" width="200" height="200">
</p>

<h1 align="center">Ex-Fuzzy</h1>

<p align="center">
  <i>🚀 A modern, explainable fuzzy logic library for Python</i>
</p>

<p align="center">
  <a href="https://pypi.org/project/ex-fuzzy/">
    <img alt="PyPI" src="https://img.shields.io/pypi/v/ex-fuzzy?color=blue&style=flat-square">
  </a>
  <a href="https://pypi.org/project/ex-fuzzy/">
    <img alt="PyPI - Python Version" src="https://img.shields.io/pypi/pyversions/ex-fuzzy?style=flat-square">
  </a>
  <a href="https://github.com/Fuminides/ex-fuzzy/actions/workflows/tests.yml">
    <img alt="Tests" src="https://github.com/Fuminides/ex-fuzzy/actions/workflows/tests.yml/badge.svg">
  </a>
  <a href="https://codecov.io/gh/Fuminides/ex-fuzzy">
    <img alt="codecov" src="https://codecov.io/gh/Fuminides/ex-fuzzy/branch/main/graph/badge.svg">
  </a>
  <a href="https://github.com/Fuminides/ex-fuzzy/blob/main/LICENSE">
    <img alt="License" src="https://img.shields.io/github/license/Fuminides/ex-fuzzy?style=flat-square">
  </a>
  <a href="https://github.com/Fuminides/ex-fuzzy/stargazers">
    <img alt="GitHub Stars" src="https://img.shields.io/github/stars/Fuminides/ex-fuzzy?style=flat-square">
  </a>
  <a href="https://www.sciencedirect.com/science/article/pii/S0925231224008191">
    <img alt="Paper" src="https://img.shields.io/badge/Paper-Neurocomputing-green?style=flat-square">
  </a>
</p>



---

## 🎯 Overview

**Ex-Fuzzy** is a comprehensive Python library for **explainable artificial intelligence** through fuzzy logic programming. Built with a focus on accessibility and visualization, it enables researchers and practitioners to create interpretable machine learning models using fuzzy association rules.

### Why Ex-Fuzzy?

- 🔍 **Explainable AI**: Create interpretable models that humans can understand. Support for classification and regression problems.
- 📊 **Rich Visualizations**: Beautiful plots and graphs for fuzzy sets and rules.
- 🛠️ **Scikit-learn Compatible**: Familiar API for machine learning practitioners.
- 🚀 **High Performance**: Optimized algorithms with optional GPU support using Evox (https://github.com/EMI-Group/evox).

## ✨ Features


### **Explainable Rule-Based Learning**
- **Fuzzy Association Rules**: For both classification and regression problems with genetic fine-tuning.
- **FERL Rule Trees**: Greedy fuzzy rule learning with native belief,
  plausibility, ignorance, and set-valued predictions.
- **Out-of-the-box Results**: Complete compatibility with scikit-learn, minimal to none fuzzy knowledge required to obtain good results.
- **Complete Complexity Control**: Number of rules, rule length, linguistic variables, etc. can be specified by the user with strong and soft constrains.
- **Statistical Analysis of Results**: Confidence intervals for all rule quality metrics, repeated experiments for rule robustness.
- **Conformal Predictions Supported Out-of-the-box**: Use Rule classifiers with conformal guarantees to obtain more reliable classification/regression.

###  **Complete Rule Base Visualization and Validation**
- **Comprehensive Plots**: Visualize fuzzy sets and rules.
- **Robustness Metrics**: Compute validation of rules, ensure linguistic meaning of fuzzy partitions, robustness metrics for rules and space partitions, reproducible experiments, etc.

###  **Advanced Learning Routines**
- **Multiple Backend Support**: Choose between PyMoo (CPU) and EvoX (GPU-accelerated) backends for evolutionary optimization.
- **Genetic Algorithms**: Rule base optimization supports fine-tuning of different hyperparameters, like tournament size, crossover rate, etc.
- **GPU Genetic Acceleration**: EvoX backend with PyTorch provides significant speedups for large datasets and complex rule bases.
- **Extensible Architecture**: Easy to extend with custom components.

### **Complete Fuzzy Logic Systems Support**
- **Multiple Fuzzy Set Types**: Classic, Interval-Valued Type-2, and General Type-2 fuzzy sets
- **Linguistic Variables**: Automatic generation with quantile-based optimization.

## 🚀 Quick Start

### Installation

Install Ex-Fuzzy using pip:

```bash
# Basic installation (CPU only, PyMoo backend)
pip install ex-fuzzy

# With GPU support (EvoX backend with PyTorch)
pip install "ex-fuzzy[evox]"
```

### Basic Usage

```python
from ex_fuzzy import BaseFuzzyRulesClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load data
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Create and train fuzzy classifier
classifier = BaseFuzzyRulesClassifier(
    nRules=15,
    nAnts=4,
    backend="pymoo"  # or "evox" for GPU acceleration
)

# Train the model
classifier.fit(X_train, y_train)

# Make predictions
predictions = classifier.predict(X_test)

# Evaluate and visualize fuzzy partitions
from ex_fuzzy.eval_tools import eval_fuzzy_model
eval_fuzzy_model(classifier, X_train, y_train, X_test, y_test,
                plot_partitions=True)
```

### FERL Evidential Classification

`FERL` learns a fuzzy rule tree and derives Dempster--Shafer evidence directly
from rule firing strengths. It is implemented natively in Ex-Fuzzy and needs no
separate fuzzy-tree package.

```python
from ex_fuzzy import FERL

ferl = FERL(max_rules=15, random_state=0)
ferl.fit(X_train, y_train)

predictions = ferl.predict(X_test)
betp, belief, plausibility, ignorance = ferl.predict_credal(X_test)
prediction_sets = ferl.predict_set(X_test)
ferl.print_tree()
```

Use `split_mode="learned"` for data-driven soft split locations or
`partition="mdlp"` for supervised trapezoidal partitions. Native FERL sets are
calibration-free evidential outputs; use `ConformalFuzzyClassifier` when a
finite-sample marginal coverage guarantee is required.

For higher accuracy with the same evidential outputs, `DeepFERL` grows a deep
tree of learned, Gini-placed soft splits and votes over its leaves.

### Regression Usage

`BaseFuzzyRulesRegressor` learns interpretable Type-1 rules for continuous
targets. It supports crisp Takagi-Sugeno consequents and fuzzy Mamdani
consequents.

```python
from ex_fuzzy import BaseFuzzyRulesRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

X, y = make_regression(n_samples=500, n_features=5, noise=5.0, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0
)

regressor = BaseFuzzyRulesRegressor(
    nRules=20,
    nAnts=3,
    consequent_type="crisp",  # use "fuzzy" for Mamdani consequents
    backend="pymoo",
)
regressor.fit(X_train, y_train, n_gen=50, pop_size=50)

predictions = regressor.predict(X_test)
print(f"Test R2: {regressor.score(X_test, y_test):.3f}")
regressor.print_rules()
```

## 📊 Visualizations

Ex-Fuzzy provides beautiful visualizations to understand your fuzzy models:

<p align="center">
  <img src="https://github.com/user-attachments/assets/858ae72b-6504-4173-b81b-b11a3caf802f" height="280" title="Type-1 Fuzzy Sets">
</p>

<p align="center">
  <img src="https://github.com/user-attachments/assets/6ffff71c-49e5-4437-94e3-3b821f799643" height="280" title="Type-2 Fuzzy Sets">
  <img src="https://github.com/Fuminides/ex-fuzzy/assets/12574757/b356a09f-4c66-45c9-8362-ebdbda684669" height="280" title="General Type-2 Fuzzy Sets">
</p>

### 📈 Statistical Analysis

Monitor pattern stability and variable usage across multiple runs:

<p align="center">
  <img src="https://github.com/user-attachments/assets/4e57469d-6cc6-4a9c-a256-dba052a91045" height="300" title="Usage per Class">
  <img src="https://github.com/user-attachments/assets/819f0988-deeb-4c8d-8cca-d8dd75e437f7" height="300" title="Usage per Variable">
</p>

### 🎯 Bootstrap Confidence Intervals

Obtain statistical confidence intervals for your metrics:

<p align="center">
  <img src="https://github.com/user-attachments/assets/4d5d9d77-4ac4-474e-8ac2-6a146085ae53" alt="Bootstrap Analysis" style="border: 2px solid #ddd; border-radius: 8px; padding: 10px;" />
</p>

## ⚡ Performance

### Accuracy and model size on 67 KEEL datasets

![Test accuracy, rules per model and training time for Ex-Fuzzy's Genetic Search Rules, Mine+Search and FERL learners against logistic regression, decision tree, random forest and gradient boosting baselines on 67 KEEL classification datasets](docs/performance/keel.svg)

### Ex-Fuzzy 2.0 vs Ex-Fuzzy 3.0 training speed



![T1 complete-fit scaling from 1,000 to 100,000 samples and 10 to 200 features](docs/performance/t1_scaling.svg)

Our implementation is getting more efficient! This experiment crosses **1,000 / 10,000 / 100,000 samples**
with **10 / 50 / 200 features**, for both fixed and optimized partitions. All of them using CPU backend.

### EvoX GPU acceleration

A three-seed benchmark compared identical EvoX CPU and CUDA
searches on 100,000 samples and 200 features (Type-1, 20 rules, 4 antecedents,
population 40 and 5 generations):

![EvoX CPU vs GPU complete fit on 100,000 samples and 200 features: fixed partitions 521.3 s vs 22.8 s (22.87× faster), optimized partitions 729.2 s vs 37.6 s (19.38× faster)](docs/performance/evox_gpu.svg)

### Backend Comparison

Ex-Fuzzy supports two evolutionary optimization backends:

| Backend | Hardware | Best For |
|---------|----------|----------|
| **PyMoo** | CPU | Classification/regression on small datasets, checkpoint support |
| **EvoX** | GPU/CPU | Batched classification/regression on large datasets |

### When to Use Each Backend

**Use PyMoo** when:
- Working with small to medium datasets
- Running on CPU-only environments
- Need checkpoint/resume functionality
- Memory is limited

**Use EvoX** when:
- Have GPU available (CUDA recommended)
- Working with large datasets (>10,000 samples)
- No checkpointing (Evox does not support checkpointing yet)

Both backends automatically batch operations to fit available memory and large datasets are processed in chunks to prevent out-of-memory errors.


## 🛠️ Examples

### 🔬 Interactive Jupyter Notebooks

Try our hands-on examples in Google Colab:

| Topic | Description | Colab Link |
|-------|-------------|------------|
| **Basic Classification** | Introduction to fuzzy classification | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1nEIcHEH-FqhJWK-ngPew_gqe82n1Dr2v/view?usp=sharing) |
| **Custom Loss Functions** | Advanced optimization techniques | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1ciajhHTK0PACgT2bGdfpcisCL8MRgiHa/view?usp=sharing) |
| **Rule File Loading** | Working with text-based rule files | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1vNAXfQDnLOdTktQ1gyrtEKwjSmNIlSUc/view?usp=sharing) |
| **Advanced Rules** | Using pre-computed rule populations | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1jsjCcBDR9ZE-qEOJcCYCHmtNmwdrYvPh/view?usp=sharing) |
| **Temporal Fuzzy Sets** | Time-aware fuzzy reasoning | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1J6T44KBIOdY06BbsO8AvE-X3gRohohIR/view?usp=sharing) |
| **Rule Mining** | Automatic rule discovery | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://drive.google.com/file/d/1qWlL-A_B21FpdtplMDHzg1M7r5tjbN6g/view?usp=sharing) |
| **Fuzzy Regression** | Interpretable continuous prediction | [📓 Notebook](Demos/regression_demo.ipynb) |
| **EvoX Backend** | GPU-accelerated training with EvoX | [🐍 Script](Demos/evox_backend_demo.py) |
| **Conformal Learning** | Set-valued predictions with calibrated coverage | [📓 Notebook](Demos/conformal_learning_demo.ipynb) |
| **FERL** | Evidential fuzzy rule-tree classification | [🐍 Script](Demos/demos_module/ferl_demo.py) |

#### Real Applications
  - Ex-Fuzzy in fNIRS data: https://github.com/jjcato9/ex_fuzzy_fnirs_demo
### 💻 Code Examples

<details>
<summary><b>📊 Fuzzy Partition Visualization</b></summary>

```python
# Plot fuzzy variable partitions
classifier.plot_fuzzy_variables()
```
</details>

<details>
<summary><b>🚀 GPU-Accelerated Training (EvoX Backend)</b></summary>

```python
from ex_fuzzy import BaseFuzzyRulesClassifier, BaseFuzzyRulesRegressor

# Create classifier with EvoX backend for GPU acceleration
classifier = BaseFuzzyRulesClassifier(
    nRules=30,
    nAnts=4,
    backend='evox',  # Use GPU-accelerated EvoX backend
    verbose=True
)

# Train with GPU acceleration
classifier.fit(X_train, y_train, 
              n_gen=50,
              pop_size=100)

# Early stopping is enabled by default:
# patience=10, min_delta=1e-4

# Regression uses the same EvoX backend. Both crisp and fuzzy
# consequents are evaluated in memory-aware PyTorch batches.
regressor = BaseFuzzyRulesRegressor(
    nRules=30,
    nAnts=4,
    consequent_type="crisp",
    backend="evox",
)
regressor.fit(X_reg_train, y_reg_train, n_gen=50, pop_size=100)

# CUDA is selected automatically when available; otherwise EvoX uses CPU.
print(regressor.optimization_device_)  # "cuda" or "cpu"
print(regressor.gpu_accelerated_)      # True only when CUDA was used
```
</details>

<details>
<summary><b>🧪 Bootstrap Analysis</b></summary>

```python
from ex_fuzzy.bootstrapping_test import generate_bootstrap_samples

# Generate bootstrap samples
bootstrap_samples = generate_bootstrap_samples(X_train, y_train, n_samples=100)

# Evaluate model stability
bootstrap_results = []
for X_boot, y_boot in bootstrap_samples:
    classifier_boot = BaseFuzzyRulesClassifier(nRules=10)
    classifier_boot.fit(X_boot, y_boot)
    accuracy = classifier_boot.score(X_test, y_test)
    bootstrap_results.append(accuracy)

print(f"Bootstrap confidence interval: {np.percentile(bootstrap_results, [2.5, 97.5])}")
```
</details>

## 📚 Documentation

- **📖 [User Guide](https://github.com/Fuminides/ex-fuzzy/wiki)**: Comprehensive tutorials and examples
- **🔧 [API Reference](https://github.com/Fuminides/ex-fuzzy/wiki/API)**: Detailed function and class documentation
- **🚀 [Quick Start Guide](https://github.com/Fuminides/ex-fuzzy/wiki/Quick-Start)**: Get up and running fast
- **📊 [Examples Gallery](https://github.com/Fuminides/ex-fuzzy/tree/main/Demos)**: Real-world use cases

## 🛡️ Requirements

### Core Dependencies
- **Python** >= 3.7
- **NumPy** >= 1.19.0
- **Pandas** >= 1.2.0
- **Matplotlib** >= 3.3.0
- **PyMOO** >= 0.6.0

### Optional Dependencies
- **EvoX** >= 1.3.0 (for GPU-accelerated evolutionary optimization)
- **PyTorch** >= 2.6.0 (required by EvoX)
- **Scikit-learn** >= 0.24.0 (for compatibility examples)

## 🤝 Contributing

We welcome contributions from the community! Here's how you can help:

### Bug Reports
Found a bug? Please [open an issue](https://github.com/Fuminides/ex-fuzzy/issues) with:
- Clear description of the problem
- Steps to reproduce
- Expected vs actual behavior
- System information

### Feature Requests
Have an idea? [Submit a feature request](https://github.com/Fuminides/ex-fuzzy/issues) with:
- Clear use case description
- Proposed API design
- Implementation considerations

### 💻 Code Contributions
1. Fork the repository
2. Create a feature branch: `git checkout -b feature-name`
3. Make your changes with tests
4. Run the test suite: `pytest tests/ -v`
5. Submit a pull request

### 🧪 Running Tests
```bash
# Install test dependencies
pip install pytest pytest-cov

# Run all tests
pytest tests/ -v

# Run tests with coverage report
pytest tests/ --cov=ex_fuzzy --cov-report=html

# Run specific test file
pytest tests/test_fuzzy_sets_comprehensive.py -v
```


## 📄 License

This project is licensed under the **AGPL v3 License** - see the [LICENSE](LICENSE) file for details.

## 📑 Citation

If you use Ex-Fuzzy in your research, please cite our paper:

```bibtex
@article{fumanalex2024,
  title = {Ex-Fuzzy: A library for symbolic explainable AI through fuzzy logic programming},
  journal = {Neurocomputing},
  pages = {128048},
  year = {2024},
  issn = {0925-2312},
  doi = {10.1016/j.neucom.2024.128048},
  url = {https://www.sciencedirect.com/science/article/pii/S0925231224008191},
  author = {Javier Fumanal-Idocin and Javier Andreu-Perez}
}
```

## 👥 Main Authors

- **[Javier Fumanal-Idocin](https://github.com/Fuminides)** - *Lead Developer*
- **[Javier Andreu-Perez](https://github.com/jandreu)** - *Development manager & Licensing officer*

## 🌟 Acknowledgments

- Special thanks to all [contributors](https://github.com/Fuminides/ex-fuzzy/graphs/contributors)
- This research has been supported by EU Horizon Europe under the Marie Skłodowska-Curie COFUND grant No 101081327 YUFE4Postdocs.
---

<p align="center">
  <b>⭐ Star us on GitHub if you find Ex-Fuzzy useful!</b><br>
  <a href="https://github.com/Fuminides/ex-fuzzy/stargazers">
    <img src="https://img.shields.io/github/stars/Fuminides/ex-fuzzy?style=social" alt="GitHub Stars">
  </a>
</p>
