Fuzzy Control
A type-safe, production-ready fuzzy logic control library for Rust.
Features
- Type-safe membership degrees: Enforces the [0, 1] constraint at the type level
- Generic numeric types: Use
f64,f32, or custom numeric types for both domain and membership values - Comprehensive membership functions: Triangular, Trapezoidal, Gaussian, and extensible
- Mamdani inference: Complete implementation with configurable operators
- Multiple defuzzification methods: Centroid, Bisector, Mean/Smallest/Largest of Maximum, Weighted Average
- Flexible rule system: Support for AND/OR operators and rule weights
- SVG visualization: Built-in plotting for membership functions, fuzzification, aggregation, and control surfaces
- No external dependencies: Only requires
num-traitsfor numeric abstractions
Installation
Add this to your Cargo.toml:
[]
= "0.1.0"
Quick Start
use *;
use *;
use *;
use HashMap;
Core Concepts
Membership Functions
Define how crisp values map to fuzzy membership degrees:
// Triangular membership function
let cold = new?;
// Trapezoidal for flat peaks
let comfortable = new?;
// Gaussian for smooth transitions
let warm = new?;
Linguistic Variables
Group fuzzy sets under a named variable:
let mut temperature = new;
temperature.add_set;
temperature.add_set;
temperature.add_set;
Fuzzy Rules
Express control logic in IF-THEN format:
// Simple rule
let rule = new;
// Rule with multiple conditions
let rule = new;
// Rule with weight
let rule = rule.with_weight;
Defuzzification
Convert fuzzy outputs to crisp values:
// Centroid (most common)
let defuzz = new?;
let outputs = controller.evaluate?;
// Or use the convenience method
let outputs = controller.evaluate_centroid?;
// Other methods available:
// - Bisector
// - MeanOfMaximum
// - SmallestOfMaximum
// - LargestOfMaximum
// - WeightedAverage
Visualization
Generate SVG visualizations for analysis and debugging:
use *;
// Plot membership functions
let svg = plot_membership_functions?;
write?;
// Visualize fuzzification
let svg = plot_fuzzification?;
write?;
// Show rule firing strengths
let inputs = from;
let svg = plot_rule_evaluation?;
write?;
// Visualize output aggregation
let defuzz = new?;
let svg = plot_output_aggregation?;
write?;
// Generate control surface (2-input systems)
let svg = plot_control_surface?;
write?;
Advanced Usage
Custom Numeric Types
Use different numeric types for domain and membership:
// f32 for memory efficiency
let controller = builder
.add_input
.build;
// Mix types: f64 domain, f32 membership
let controller = builder
.add_input
.build;
Custom Operators
Provide custom T-norms and S-norms:
use *;
let controller = builder
.with_t_norm
.with_s_norm
.add_input
.build;
Batch Operations
Add multiple variables and rules at once:
let controller = builder
.add_inputs
.add_outputs
.add_rules
.build;
Examples
See the examples/ directory for complete examples:
temperature_control.rs- Simple temperature control systemhvac_system.rs- Multi-input HVAC controllervisualizations.rs- Generate all visualization types
Run examples with:
Testing
Run the comprehensive test suite:
Run tests with output:
Architecture
The library is organized into several modules:
- Core types:
MembershipDegree,Floattrait - Membership functions:
membership_functionsmodule - Fuzzy sets:
FuzzySet,LinguisticVariable - Rules:
FuzzyRule,Condition,Consequent - Operators:
TNorm,SNormtraits and implementations - Controller:
FuzzyControllerand builder - Defuzzification: Multiple defuzzification methods
- Visualization: SVG plotting utilities
Contributing
Contributions are welcome! Please feel free to submit pull requests or open issues.
License
This project is dual-licensed under MIT or Apache-2.0. You may choose either license.
References
- Zadeh, L.A. (1965). "Fuzzy Sets". Information and Control.
- Mamdani, E.H. (1974). "Application of fuzzy algorithms for control of simple dynamic plant"
- Takagi, T. and Sugeno, M. (1985). "Fuzzy identification of systems"
Roadmap
- Sugeno-style inference
- Additional membership function types (Sigmoid, Bell, etc.)
- Performance optimizations
- Serialization support
- WASM support for web applications