By: Juan Rada-Vilela, Ph.D.
License Introduction Features Example Bulding from source Binaries What's next What's new : General, Macros, Operation, Engine, Input Variables and Output Variables, Linguistic Terms, Linear and Discrete Terms, Function Term, [T|S]Norms and Hedges, Rules, Rule Blocks, Weighted Defuzzifiers, Integral Defuzzifiers, Importers and Exporters, Examples, Console, Fixed Bugs and Leaks
fuzzylite will always be free and open source. However, fuzzylite is no longer released under the Apache License. Since version 5.0, fuzzylite is dual-licensed under the GNU Lesser General Public License (LGPL) v3.0 and a paid commercial license.
In brief, an important restriction the LGPL imposes on your closed-source application is that you are no longer allowed to statically link against fuzzylite. If your application requires static linking, you will need to purchase a commercial license from FuzzyLite Limited. Please, contact [email protected] for commercial licenses, and refer to the GNU LGPL for further information on your rights.
The change of license is an attempt to raise funds in order to be able to work part-time in the development of the fuzzylite family of products, namely fuzzylite (C++), jfuzzylite (Java), pyfuzzylite (Python), and QtFuzzyLite (Windows/Linux/Mac).
There are still many things to do!
Besides donations, you can significantly contribute by purchasing a license of the entirely new QtFuzzyLite commercial application. In addition, if you require (paid) private support, please contact [email protected].
fuzzylite is a free and open-source fuzzy logic control library programmed in C++ for multiple platforms (Windows, Linux, Mac, iOS). Its goal is to allow you to easily create fuzzy logic controllers in a few steps utilizing object-oriented programming without requiring any third-party libraries.
If you are using fuzzylite, please cite the following reference in your article:
Juan Rada-Vilela. fuzzylite: a fuzzy logic control library, 2014. URL http://www.fuzzylite.com.
@misc{fl::fuzzylite,
author={Juan Rada-Vilela},
title={fuzzylite: a fuzzy logic control library},
url={http://www.fuzzylite.com},
year={2014}}Controllers Types (5) Mamdani, Takagi-Sugeno, Larsen, Tsukamoto, Inverse Tsukamoto
Linguistic terms Basic (4) triangle, trapezoid, rectangle, discrete. Extended (9) bell, cosine, gaussian, gaussian product, pi-shape, sigmoid difference, sigmoid product, spike. Edges (4) concave, ramp, sigmoid, s-shape, z-shape. Functions (3) constant, linear, function.
Conjunction and Activation T-Norm (7) minimum, algebraic product, bounded difference, drastic product, einstein product, hamacher product, nilpotent minimum.
Disjunction and Accumulation S-Norm (8) maximum, algebraic sum, bounded sum, normalized sum, drastic sum, einstein sum, hamacher sum, nilpotent maximum.
Defuzzifiers Integral (5) centroid, bisector, smallest of maximum, largest of maximum, mean of maximum, Weighted (2) weighted average, weighted sum.
Hedges Types (6) any, not, extremely, seldom, somewhat, very.
Import Types (3) FuzzyLite Language fll, Fuzzy Inference System fis, Fuzzy Control Language fcl.
Export Types (6) C++, Java, FuzzyLite Language fll, FuzzyLite Dataset fld, Fuzzy Inference System fis, Fuzzy Control Language fcl.
Examples (30+) of Mamdani, Takagi-Sugeno and Tsukamoto controllers from fuzzylite, Octave and Matlab, each included in the following formats: C++, Java, fll, fld, fis, and fcl.
#include "fl/Headers.h"
int main(int argc, char* argv[]){
using namespace fl;
Engine* engine = new Engine("simple-dimmer");
InputVariable* ambient = new InputVariable;
ambient->setName("Ambient");
ambient->setRange(0.000, 1.000);
ambient->addTerm(new Triangle("DARK", 0.000, 0.500));
ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.750));
ambient->addTerm(new Triangle("BRIGHT", 0.500, 1.000));
engine->addInputVariable(ambient);
OutputVariable* power = new OutputVariable;
power->setName("Power");
power->setRange(0.000, 2.000);
power->setDefaultValue(fl::nan);
power->addTerm(new Triangle("LOW", 0.000, 1.000));
power->addTerm(new Triangle("MEDIUM", 0.500, 1.500));
power->addTerm(new Triangle("HIGH", 1.000, 2.000));
engine->addOutputVariable(power);
RuleBlock* ruleblock = new RuleBlock;
ruleblock->addRule(Rule::parse("if Ambient is DARK then Power is HIGH", engine));
ruleblock->addRule(Rule::parse("if Ambient is MEDIUM then Power is MEDIUM", engine));
ruleblock->addRule(Rule::parse("if Ambient is BRIGHT then Power is LOW", engine));
engine->addRuleBlock(ruleblock);
engine->configure("", "", "Minimum", "Maximum", "Centroid");
std::string status;
if (not engine->isReady(&status))
throw Exception("Engine not ready. "
"The following errors were encountered:\n" + status, FL_AT);
for (int i = 0; i < 50; ++i){
scalar light = ambient->getMinimum() + i * (ambient->range() / 50);
ambient->setInputValue(light);
engine->process();
FL_LOG("Ambient.input = " << Op::str(light) << " -> " <<
"Power.output = " << Op::str(power->getOutputValue()));
}
}- Source code documentation
- Type-2 Fuzzy Logic Controllers
- Adaptive Neuro-Fuzzy Inference System (ANFIS)
- Fuzzy C-means data clustering
Building from source requires you to have CMake installed.
The files fuzzylite/build.bat and fuzzylite/build.sh are automatic build scripts for Windows and Unix platforms, respectively. The usage of these scripts is presented as follows.
> build.bat help
Usage: build.bat [options]
where [options] can be any of the following:
all builds fuzzylite in debug and release mode (default)
debug builds fuzzylite in debug mode
release builds fuzzylite in release mode
clean erases previous builds
help shows this information$ ./build.sh help
Usage: [bash] ./build.sh [options]
where [options] can be any of the following:
all builds fuzzylite in debug and release mode (default)
debug builds fuzzylite in debug mode
release builds fuzzylite in release mode
clean erases previous builds
help shows this information(important) After executing the building script, the binaries will be built and stored in the sub-folders release/bin and debug/bin.
For more advanced building options, please check the contents of fuzzylite/build.bat or fuzzylite/build.sh, and the contents of fuzzylite/CMakeLists.txt.
The following building options are available:
-DFL_USE_FLOAT=ON builds the binaries using typedef float fl::scalar instead of typedef double fl::scalar (default is OFF, i.e., double is used)
-DFL_BACKTRACE=OFF disables the backtrace information in case of errors (default in Unix platforms is ON, and in Windows platforms is OFF). In Windows, the backtrace information requires the library dbghelp, which should be available in your system.
-DFL_CPP11=ON builds fuzzylite utilizing C++11 features (default is OFF, i.e., C++98)
-DCMAKE_BUILD_TYPE=[Debug|Release] sets the mode of your build. You can only build one mode at a time with a single CMake script.
After building from source, the following are the relevant binaries that will be created in release mode. In debug mode, binaries will append a d at the end of the name (e.g., fuzzylited.dll).
- console application:
fuzzylite.exe - shared library:
fuzzylite.dll,fuzzylite.lib - static library:
fuzzylite-static.lib
- console application:
fuzzylite - shared library:
libfuzzylite.so - static library:
libfuzzylite.a
- console application:
fuzzylite - shared library:
libfuzzylite.dylib - static library:
libfuzzylite.a
The console application of fuzzylite allows you to import and export your controllers. Its usage can be obtained executing the console binary. In addition, the FuzzyLite Interactive Console is activated when exporting to fld without providing an output file. The interactive console allows you to evaluate any controller by manually providing the input the values.
The entire fuzzylite library has been thoroughly revised, refactored, validated, and significantly improved. The following sections detail the changes and enhancements of version 5.0. Users of previous versions are strongly encouraged to carefully read the list before migrating to version 5.0. Important changes and enhancements are marked as (important), (VERY important) and (EXTREMELY important).
- (important)
fuzzylite v5.0is dual-licensed under the GNU LGPL v3.0 and a paid commercial license. - Support for both
C++98andC++11using the latest features. - Support for multiple compilers
g++,Clang,MSVC. - Refactoring of many classes to improve design and performance.
- (important) Performance improvements of Takagi-Sugeno controllers by over 55% with respect to v4.0 (estimate based on the average performance on the examples included).
- Smart pointers in many classes take care of automatically deleting objects when setting new pointers (
Accumulated,FactoryManager,Function,OutputVariable,Rule, andRuleBlock).
- (important) Exceptions are thrown when any of the following
RuleBlock::[conjunction|disjunction|activation],Accumulated::accumulation, andOutputVariable::defuzzifierare required but set tofl::null, thereby replacing the operations that would lead to[signal 11] Segmentation faultto operations that throw afl::Exceptioninstead.
- Automatic build script to build
fuzzyliteindebugandreleasemode. - Binaries of debug libraries are renamed to append the letter
d(e.g.,fuzzylited.dll,libfuzzylited.so). - (important) New file
fuzzylite/src/m/compare.mto compare the output values of yourfuzzyliteengines with the evaluation of the same engine in Octave/Matlab. - (important) There is practically no difference between the output values obtained with
fuzzyliteand those obtained with Octave/Matlab. Based on the examples, the average mean square error (MSE) between the output values is less than7.3e-12(or0.0000000000073) due to negligible differences in floating-point arithmetic. The results and comparison can be found inexamples/examples.mat. - (important) Source code of applications based on version 4.0 will most likely not compile with version 5.0.
- Minor bugs and memory leaks fixed.
####Macros
- (important) Added support for
C++11with smart pointers, method identifiers, move constructors and move operators as follows. For precise information, refer to filefuzzylite/fl/fuzzylite.h. - (important) Macros for identifiers are defined as
FL_IOVERRIDE override,FL_IFINAL final,FL_IDEFAULT = default,FL_IDELETE = delete,FL_INOEXCEPT noexcept,FL_DEFAULT_COPY(Class),FL_DEFAULT_MOVE(Class), andFL_DEFAULT_COPY_AND_MOVE(Class). - (important) Added macro
FL_unique_ptrto refer tostd::auto_ptr(C++98) orstd::unique_ptr(C++11), and its respectiveFL_move_ptr(x)to move a smart pointer, albeitFL_move_ptr(x)is not used within the library as it is not needed. - (important) Added global variables
const long fl::null = 0Lto refer to the null pointer inC++98andconst std::nullptr_t null = nullptrto refer to the null pointer inC++11. - (important) Renamed macro
FL_DEBUGtoFL_DBG. - (important) Renamed macros
FL_BEGIN_DEBUG_BLOCKandFL_END_DEBUG_BLOCKtoFL_DEBUG_BEGINandFL_DEBUG_END, respectively. - (important) Renamed macro
FL_EXPORTtoFL_API - (EXTREMELY important) Added macro definitions
FL_EXPORT_LIBRARYandFL_IMPORT_LIBRARY. If you are buildingfuzzyliteas a shared library, you need to defineFL_EXPORT_LIBRARY. If you are buildingfuzzyliteexecutable and it utilizes thefuzzyliteshared library, you need to defineFL_IMPORT_LIBRARY. If you are buildingfuzzyliteas a static library and/or buildingfuzzyliteexecutable using thefuzzylitestatic library, then you do not need to define eitherFL_[IMPORT|EXPORT]_LIBRARY. Note that the same conditions apply for your application. This is particularly important in Windows platforms, asFL_IMPORT_LIBRARYandFL_EXPORT_LIBRARYdefineFL_APIto__declspec(dllimport)and__declspec(dllexport), respectively. If in doubt, please checkfuzzylite/CMakeLists.txt
- (important) Added method
Operation::toScalar(std::string x, scalar alternative) FL_INOEXCEPTwhich returnsalternativeifxis not a validscalar, and never throws an exception. - (important) Added method
Operation::toScalar(std::string x)that returns the scalar value ofxor throws afl::Exceptionifxis not a validscalar. - (VERY important) Marked method (from v4.0)
Operation::toScalar(std::string, bool, scalar) FL_IDELETE;and removed its implementation such that its usage is prevented at compile time inC++11and at linker time inC++98. Please, use the appropriateOp::toScalarmethods mentioned above.
- Renamed method
Op::isNantoOp::isNaN.
- Added method
fl::Op::isFinite(x)which returnsnot (isNaN(x) or isInf(x)). - Changed
fl::Op::isEq(a,b)to returntrueifa == b == NaN. - Changed
fl::Op::isEq(a,b)to returntrueifa == b == Inf. - Changes to
fl::Op::isEqaffect other comparison methodsfl::Op::is[Lt|LEq|GEq|Gt]. - Added shortcuts of comparisons
fl::Op::[gt,lt,ge,le,eq,neq](scalar a, scalar b), mostly to provide binary versions (withoutmacheps) for termFunction. - Deleted method
Op::repeat. - Removed method
fuzzylite::configuration(). - Changed default
fuzzylite::_macheps = 1e-6;. - Renamed method
Op::makeValidIdtoOp::validName, which now returns"unnamed"for empty strings.
####Engine
- (VERY important) Moved
Engine::hedges(and relevant methods) toRule::hedges. - Added enumeration for the type of engine:
enum Engine::Type{Mamdani, Larsen, TakagiSugeno, Tsukamoto, InverseTsukamoto, Hybrid, Unknown}. - Added method
Type Engine::type(std::string* name, std::string* reason)to infer the type of the engine based on its configuration, additionally provides the name of the type and the inference reasons for its type. - (important) Changed method
Engine::isReady(std::string)to satisfy the default operation of controllers. The methodEngine::isReady(std::string)was initially conceived to provide information before a potential[signal 11] Segmentation faulthappened due to improper configuration. However, given the improved handling of signals and exceptions mentioned in Section General, using methodEngine::isReady(std::string)is not necessary except for providing suggestions of what could potentially cause an error. - Added methods
Engine::set[Input|Output]Variables(std::vector)andEngine::setRuleBlocks(std::vector). - Added methods
Engine::[input|output]Variables()andEngine::ruleBlocks()to return mutable references. - Added method
Engine::variables()to retrieve a vector (copy) containing theInputVariablesfollowed by theOutputVariables. - Added method
Engine::updateReferences()to update the references to the engine in all the necessary linguistic terms (i.e.,LinearandFunction). - Added method
Engine::clone(). - Added copy constructors, assignment operators, and default move constructor to
Engine.
####Input Variables and Output Variables
- (important) Added methods
OutputVariable::[get|set]OutputValue()to [retrieve|store] value from defuzzification - (important) Changed return type of
scalar OutputVariable::defuzzify()tovoid OutputVariable::defuzzify()because now it automatically stores the defuzzified output value, and also stores the previous valid output value regardless of locks. Like in version 4.0, ifOutputVariable::lockPreviousOutputValue=true, and the defuzzified output value is not valid (i.e.,[NaN|Inf]) or no rules were activated, then the defuzzified output value is replaced for the previous valid output value. - Removed method
OutputVariable::defuzzifyNoLocks(). - Renamed variable
OutputVariable::lastValidOutputValuetoOutputVariable::previousOutputValue. - (important) Renamed method
OutputVariable::[get|set]LastValidOutput()toOutputVariable::[get|set]PreviousOutputValue(). - Renamed variable
OutputVariable::lockValidOutputtoOutputVariable::lockPreviousOutputValue. - (important) Renamed method
OutputVariable::setLockValidOutput()toOutputVariable::setLockPreviousOutputValue(). - (important) Renamed method
OutputVariable::isLockingValidOutput()toOutputVariable::isLockedPreviousOutputValue(). - Renamed variable
OutputVariable::lockOutputRangetoOutputVariable::lockOutputValueInRange. - (important) Renamed method
OutputVariable::setLockOutputRange()toOutputVariable::setLockOutputValueInRange(). - (important) Renamed method
OutputVariable::isLockingOutputRange()toOutputVariable::isLockedOutputValueInRange(). - Added methods
std::string InputVariable::fuzzyInputValue()andstd::string OutputVariable::fuzzyOutputValue(). - Added method
OutputVariable::clear()to clear the fuzzy output, and setOutputVariable::previousOutputValue = fl::nanand setOutputVariable::outputValue = fl::nan. - Added copy constructors, assignment operators, move constructors and move operators to [Input|Output]Variable.
- Added method
Variable::terms()to return mutable reference. - (important) Changed
OutputVariable::[defuzzifier|fuzzyOutput]to smart pointers (FL_unique_ptr).
- (VERY important) Added Term::[get|set]Height to define the height of integral terms, and multiply their respective membership functions accordingly.
- Added copy constructors, assignment operators, move constructors and move operators to every
Term. - (VERY important) Parameters of all terms are set by default to
fl::nan. - (important) Renamed method
Term::copy()toTerm::clone()in everyTerm. - Added method
Term::updateReference(Term*, Engine*)to ensureLinearandFunctionterms have updated pointers to theEngine(useful when cloning and copy-constructing).
- (important) Added linguistic terms
Concave,CosineandSpike.
- (important) Changed
Accumulatedto takeActivated*terms instead ofconst Terms*. - Removed
constfrom return type of methodSNorm* Accumulated::[get|set]Accumulation(). - Changed
Accumulated::accumulationto a smart pointer (FL_unique_ptr). - Added method
Accumulated::terms()to return mutable reference. - (important) Renamed methods
Triangle::[set|get][A|B|C]to::[set|get]Vertex[A|B|C]. - (important) Renamed methods
Trapezoid::[set|get][A|B|C|D]to::[set|get]Vertex[A|B|C|D]. - (important) Renamed term
ThresholdedtoActivated. - (important) Renamed methods
Thresholded::[set|get]Threshold()toActivated::[set|get]Degree(). - Added enumeration
[Ramp|Sigmoid]::Direction{ NEGATIVE, ZERO, POSITIVE }to refer to the slope. - Added methods
Ramp::direction()andSigmoid::direction()to retrieve direction of slope. - Removed Exception Specification from methods in
Discrete,LinearandFunctionterms.
- (important) Changed
Linearfrom having pointers to the input variables to having a pointer to theEngine. - Changed visibility of
Linear::coefficientstoprotected. - (important) Added methods
Linear::coefficients(),Linear::setCoefficients(). Linearterm no longer throws exception wheninputVariables != |coefficients|.- (important) Removed public vector of variables
Discrete::[x|y]. - (important) Added a
typedef std::pair<scalar, scalar> Discrete::Pair. - (important) Changed representation of
Discrete::[x|y]fromstd::vector<scalar>tostd::vector<Discrete::Pair>. - Added methods
Discrete::setXY()andDiscrete::xy()to set and get the new representation of pairs. - Added methods
Discrete::xy(int index)to retrieveDiscrete::Pairatindex. - (important) Added methods
Discrete::toPairs(std::vector<scalar>)which throws an exception if the vector is missing a value (i.e.,std::vector<scalar>.size() % 2 != 0), andDiscrete::toPairs(std::vector<scalar>, scalar missingValue)which addsmissingValuein casestd::vector<scalar>.size() %2 == 1, hence never throwing an exception. - Added method
Discrete::toVector(std::vector<Discrete::Pair>)to convertstd::vector<Discrete::Pair>to astd::vector<scalar>. - Added method
Discrete::formatXY()to get pairs(x,y)nicely formatted.
####Function Term
- (important) Merged structs
Function::OperatorandFunction::BuiltInFunctioninto a singlestruct Function::Element. - (EXTREMELY important) Changed the precedence of all built-in instances of
Function::Elementof typeOperatorstarting from100and decreasing by10. The precedence of built-in operators is the following:(100)Logical not[!]and Negation[~];(90)Power[^];(80)Multiplication[*], Division[/]and Modulo[%];(70)Addition[+]and Subtraction[-];(60)Logical AND[and]and Logical OR[or]. If you have registered your own operators, please adjust their precedence as required. - Added to
Functionbuilt-in comparison functionsgt,lt,ge,le,eqand operator logical not!. - Modified typedefs
Function::UnaryandFunction::Binaryto takescalarinstead ofdouble. - Changed
public Function::roottoprotected Function::_rootand it is now a smart pointer (FL_unique_ptr). - Added method
Function::root()to return pointer toFunction::root. - (EXTREMELY important) Moved built-in functions and operators from
Functionto aFunctionFactory.
- (important) Fixed operation when using multiple hedges to operate from right-most to left-most, e.g.
if Ambient is not very extremely bright, now evaluates as followsnot(very(extremely(bright))). - Added
TNormnilpotent minimum andSNormnilpotent maximum.
- Added clone methods to every
Norm. - Added clone methods to every
Hedge. - (VERY important) Moved
Engine::hedgestoRule::hedges.
- (VERY important) Moved
Engine::hedges(and methods) toRule::hedges. - Added method
Rule::isLoaded()to determine whether a rule was properly parsed and thus can be activated. - Added method
Rule::unload()to allow the existence of a rule in an inactive state (useful for invalid rules). - (important) Removed variable
Rule::FL_ASSIGNSand methodRule::assignsKeyword(), for which the symbol=in rules is no longer valid. - Changed visibility of method
Rule::setText()topublic. - Added method
Rule::load(const Engine*). - Changed
Rule::[antecedent|consequent]to smart pointers (FL_unique_ptr). - (important) Renamed method
Antecedent::[get|set]Root()toAntecedent::[get|set]Expression(). - Added methods
[Antecedent|Consequent]::[get|set]Text(). - (important) Added methods
[Antecedent|Consequent]::[load|unload](), with the same objective asRule::[load|unload]().
- Added method
RuleBlock::reloadRules(). - Added method
RuleBlock::setRules(std::vector). - Added method
RuleBlock::rules()to return mutable reference. - Removed
constfromTNormandSNorminRuleBlock::[get|set][Conjunction|Disjunction|Activation](), respectively. - Changed
RuleBlock::[conjunction|disjunction|activation]to smart pointers (FL_unique_ptr). - (VERY important) Added basic rule chaining such that an
OutputVariablecan be utilized in theAntecedentof aRule. For example, considering the ruleif Power is high then InversePower is low, wherePowerandInversePowerare both output variables, the activation degree of theAntecedentwill correspond to the accumulated activation degree of the termhighin the fuzzy output ofPower. IfPower::accumulation = none, the accumulated activation degree of the termhighwill be computed as the regular sum of the activation degrees of termhighin the fuzzy output ofPower. Otherwise, the accumulated activation degree is computed utilizing thePower::accumulationoperator.
- (VERY important) Performance improvements of Takagi-Sugeno controllers by over 55% (with respect to v4.0) based on the average performance on the examples included.
- (important) Created class
WeightedDefuzzifierfrom which classesWeighted[Average|Sum]are derived. - (important) Added enumeration
WeightedDefuzzifier::Type{Automatic, TakagiSugeno, Tsukamoto}and respective methodsWeightedDefuzzifier::[get|set]Type()andWeightedDefuzzifer::getTypeName(). - Added method
WeightedDefuzzifier::inferType(Term*)to automatically determine theWeightedDefuzzifier::Typebased on the class ofTerm. - (important) By default,
WeightedDefuzzifier::type = Automatic, which automatically infers the type based on theWeightedDefuzzifier::inferType(). - (important) There is a small performance penalty when using
WeightedDefuzzifier::type = AutomaticbecauseWeightedDefuzzifier::inferType()performs threedynamic_cast<>. - (important) Deleted class
Tsukamoto. Its methodstatic tsukamoto()was moved tovirtual WeightedDefuzzifier::tsukamoto(), which allows overriding it - Added support for
TsukamotowithConcaveterms.
-
(EXTREMELY important) In version 5.0, the traditional operation of Takagi-Sugeno and Tsukamoto controllers is achieved by setting
OutputVariable::accumulation = none. Unlike version 4.0, theRuleBlock::activationwill not have any effect on Takagi-Sugeno nor Tsukamoto controllers, for whichRuleBlock::activationshould also be set tonone. More information about the roles of theOutputVariable::accumulationandRuleBlock::activationoperators are detailed as follows. Refer to sciweavers to convert LaTeX equations. -
(VERY important) In version 5.0, the role of the
RuleBlock::activationTNormon theWeighted[Average|Sum]always performs a regular multiplication of the weights and the values (i.e.,$w_i \times z_j$ ) regardless of theTNormchosen. In other words, selecting anyRuleBlock::activationforWeighted[Average|Sum]is irrelevant, and should be set tononeas everyTNormwill have the same multiplication effect. This operation is different fromfuzzyliteversion 4.0, where theRuleBlock::activationoperator was utilized to multiply the weights and values (i.e.$w_i \otimes z_j$ ), and therefore the traditional operation of theWeighted[Average|Sum]was achieved whenRuleBlock::activation = AlgebraicProduct;. -
(VERY important) In version 5.0, the role of the
OutputVariable::accumulation = noneon theWeighted[Average|Sum]results in a regular sum of the multiplied weights and values, i.e.,$\dfrac{\sum_i^n w_i \times z_j}{\sum_i^n w_i}$ . However, if theOutputVariable::accumulation != none, the role of theSNormwill be to accumulate the activation degrees of the repeated terms in the fuzzy output of the variable. For example, considering the rulesif Ambient is dark then Power is highandif Ambient is medium then Power is high, for any input value ofAmbientthat activates both rules, the fuzzy output ofPowerwill have the termhighactivated with the degree fromRule 1, and the termhighactivated with the degree fromRule 2. Since the termhighappears twice in the fuzzy output, the role of the accumulation operator will be to accumulate the activation degree ofhighresulting in$\dfrac{(w_1 \oplus w_2) \times z_{high}}{(w_1 \oplus w_2)}$ . If another term were activated, the result would be$\dfrac{(w_1 \oplus w_2) \times z_{high} + w_i \times z_j}{(w_1 \oplus w_2) + w_i}$ . In version 4.0, the accumulation operator had no effect on theWeighted[Average|Sum].
- (important) Proper handling of indefinite integral defuzzification, that is, returning
fl::nanwhen[minimum|maximum]=[NaN|Inf]. - Default resolution of integration is defined as
static int IntegralDefuzzifier::defaultResolution=200, and can be changed viastatic IntegralDefuzzifier::setDefaultResolution().
- (important) In
fuzzylite, the accumulation operator has been for several versions associated with the output variables and not with the rule blocks, despite that the FCL format and other fuzzy logic control libraries associate the accumulation operator with the rule blocks. The argument for such a decision is thatfuzzyliteprovides coherent support for multiple rule blocks operating on the same engine and on the same output variables. For example, if multiple rule blocks operate on the same output variables, it only makes sense to have a single accumulation operator associated with each output variable such that the defuzzifier can naturally operate over the accumulated fuzzy output. Differently, if the accumulation operator were associated with the rule block, the possibility of having different accumulation operators in different rule blocks questions (1) the possibility of having multiple rule blocks operating over the same output variables; and (2) the usage of different accumulation operators over the accumulation and defuzzification processes. Certainly, if (1) is not possible, i.e, different rule blocks only operate on different output variables, then (2) is not a problem because the accumulation process and defuzzification of each variable will only have a single accumulation operator. It is therefore that the association of the accumulation operator with the output variable infuzzyliteprovides a better design and an additional feature that allows having multiple rule blocks operating over the same output variables.
- Added copy constructors, assignment operators, move constructors and move operators.
- Added method
Defuzzifier::clone().
- (EXTREMELY important) Since terms have a new
heightproperty,[Fll|Fis|Fcl]Exporterexports terms with an additionalscalarat the end, which indicates theheightof the term. However, ifheight=1.0, the additional scalar is not exported. - (EXTREMELY important) In
[Fll|Fis|Fcl]Importer, when importing terms, if there is an additionalscalarit will be assumed as theheightof the term. For example,term: high Gaussian 1.0 0.5 0.75will create aGaussianterm with mean1.0, standard deviation0.5and height0.75. This is extremely important because there are some examples from Matlab infisformat that append a useless0.0to some terms. - (EXTREMELY important) In
FisExporter, if the Takagi-Sugeno controller has noactivationoraccumulationoperators (as it should generally be the case), Octave and Matlab will not be able to import thefisfile. To overcome this issue, you will have to setImpMethod="min"andAggMethod="max", whereImpMethodandAggMethodare just dummy operators that can be set to anyTNormandSNorm, respectively.
- (important) Improved compatibility of the exported code obtained with
[Fis|Fcl]Exporterby exporting the additional features offuzzyliteonly when these are different from the default operation. For example, the following features will not be exported given their values:[Input|Output]Variable::enabled = true;,OutputVariable::lock-previous = false;,OutputVariable::lock-range = false;, amongst others.
- (important) Renamed FLL property
'lock-valid'to'lock-previous'. - (important) Renamed FIS property
'LockValid'to'LockPrevious'. - (important) Renamed FCL property
'LOCK: VALID'to'LOCK: PREVIOUS'.
- (important) Export your controllers to files using
[Fll|Fld|Fis|Fcl]Exporter::toFile(). - (important) Import your controllers from files using
[Fll|Fis|Fcl]Importer::fromFile(). - (important)
FldExporterexports the FuzzyLite Dataset of an engine utilizing the input values of another FuzzyLite Dataset.
FldExporterno longer restarts the engine when exporting.- (important) Renamed method
FldExporter::toWriter()toFldExporter::write(). - Removed variable and methods for property
int FldExporter::_maximum. - Added option in
CppExporterto prepend the namespace prefixfl::to the classes, and by default it does not prepend prefix. - Improvement accuracy of
FisImporterwhen importingfisfiles whose scalar values have more than three decimal numbers. - Renamed methods in
[Fis|Fcl]Importer::extract*to[Fis|Fcl]Importer::parse*.
- Created a generic
CloningFactory<T>to create clones of objects. - (important) Created
FunctionFactorybased onCloningFactory<Function::Element>where function operators and methods are stored to be cloned as necessary byFunction. Additional functions and operators can be easily registered. - (VERY important) Moved built-in functions and operators from
FunctiontoFunctionFactory. - Renamed methods
Factory<T>::[register|deregister]Class()toFactory<T>::[register|deregister]Constructor(). - (important) Renamed
Factory<T>toConstructionFactory<T>. - Renamed
typedef Factory::Creatortotypedef Factory::Constructor. - Changed pointers of
FactoryManagerto smart pointers (FL_unique_ptr).
- (important) Added two examples for basic rule chaining:
mamdani/SimpleDimmerInverse.fllandmamdani/Laundry.fll. - Included the
originalexample files infisformat. - Added conversion of
examples/original/*.fistoexamples/original/*.fll. - Modified
original/takagi-sugenoexamples to reflectactivation: none; accumulation: none;. - Updated FLD examples produced from the
originalexamples.
- (important) Added file
fuzzylite/src/m/compare.mto compare the output values of yourfuzzyliteengines with the evaluation of the same engine in Octave/Matlab. - (important) Added file
examples/examples.matcontaining the comparison of the output values betweenfuzzyliteand Matlab's Fuzzy Logic Toolbox.
- Added code to perform benchmarks in Linux.
- (important) Console includes option to import custom input dataset from file an export its respective output values.
- (important) Created the FuzzyLite Interactive Console, which can be started by specifying an input file and the output format, e.g.,
fuzzylite -i SimpleDimmer.fll -of fld. - Console provides more information about its usage.
#### Fixes Bugs and Leaks
- (important) Fixed operation when using multiple hedges to operate from right-most to left-most, e.g.
if Ambient is not very extremely brightevaluates as followsnot(very(extremely(bright))).
- (important) Fixed membership functions of specific cases of
Trianglewhena=borb=c, andTrapezoidwhena=borc=d. - Fixed minor memory leak at
~RuleBlock::[conjunction|disjunction|activation]. - Fixed minor memory leak at
~Accumulated::accumulation. - Fixed minor memory leak at
~OutputVariable::defuzzifier. - Fixed minor memory leak at
~Function::Node. - Fixed minor memory leak at
~FactoryManager::[factories]. - Fixed some rethrowing of exceptions to provide proper information about errors. Specifically, changed some rethrown exceptions from
throw ex;to justthrow; - Fixed building using
-DFL_USE_FLOAT=ON
For more information, visit www.fuzzylite.com.
fuzzylite® is a registered trademark of FuzzyLite Limited.
Copyright © 2010-2015 FuzzyLite Limited. All rights reserved.
