1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
Version 6.0
===========
Overview
--------
* The FuzzyLite Libraries, namely fuzzylite and jfuzzylite, both in version 6.0, are licensed under the GNU General Public License version 3.
* By default, fuzzylite builds using C++11 instead of C++98.
* Important performance improvements.
* Refactored the following names for the operation of engines: from activation operator to implication operator, from accumulation operator to aggregation operator.
* Renamed the term `Accumulated` to `Aggregated`.
* New activation methods decouple the activation of rules from the rule block and provide different methods for activating rules (see Activation Methods).
* New class `ActivationFactory` provides a factory of activation methods.
* New class `Benchmark` to evaluate the performance and accuracy of engines.
* New class `Complexity` to estimate the computational complexity of an engine.
* New class `RScriptExporter` to export the surfaces of an engine using the `ggplot2` library.
* New class `Binary` term for binary edges.
* New `UnboundedSum` S-Norm in `SNormFactory`.
* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
* Added description strings to `Engine`, `Variable` and `RuleBlock`
* Privatized previously protected members of classes and subclasses of `Term`, `Variable`, `Rule`, `Defuzzifier`, `[Cloning|Construction]Factory`, `Importer`, `Exporter`, amongst others.
* Improved portability by replacing `int` for `std::size_t` where necessary, thereby additionally removing warnings in Windows 64bit
* Deleted `Operation.cpp` and inlined its methods into `Operation.h`
* Updated `.travis.yml` to use Docker, and build using g++ (versions 6, 5, 4.9, 4.8, 4.7) and clang (versions 3.8, 3.7, 3.6, and 3.5).
* Added `appveyor.yml` to use continuous integration in Windows under Visual Studio 2013 and 2015.
* Added some unit tests and support for future unit tests.
* Bug fixes.
* New example of hybrid engines.
* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
* New R scripts for each example and its respective surfaces in `pdf` formats.
Activation Method
-----------------
* New activation methods determine the activation of rules in a rule block. Specifically, the activation methods compute the activation degrees of the rules and the activation order of the rules.
* Seven activation methods available: General, First, Last, Highest, Lowest, Proportional and Threshold.
* If no activation method is supplied, an instance of General will be automatically set.
* New class `General` activates every rule following the insertion order in the rule block.
* New classes `First` and `Last` activate the first and last $n$ rules (following insertion order) whose activation degrees are greater than or equal to a given threshold.
* New classes `Highest` and `Lowest` activate the first and last $n$ rules sorted (descending or ascending) by activation degree.
* New class `Proportional` activates every rule with an activation degree proportional to the activation degrees of the other rules.
* New class `Threshold` activates every rule that satisfies a given comparison operator and a given threshold.
* New class `ActivationFactory` provides a factory of activation methods.
Defuzzifier
-----------
* Overall performance improvements
* The new default resolution of integral defuzzifiers is 100 (from 200 in previous version)
* Importantly simplified `WeightedAverage` and `WeightedSum` by not using the implication and aggregation operators.
* New experimental classes `WeightedAverageCustom` and `WeightedSumCustom` which use the implication and aggregation operators to compute the weighted averages and weighted sums, respectively.
Factory
-------
* New class `ActivationFactory` to register activation methods.
* New method `FactoryManager::activation()` to get the activation factory.
* Inlined methods in [CloningFactory|ConstructionFactory].h
* Fixed bug in `CloningFactory::deregisterObject()`. Bug: Object was deleted before removing it from the map, leaving an invalid object in the map which would cause a segmentation fault. Solution: Remove the object from the map before deleting it.
* New `abs` function in `FunctionFactory` to compute the absolute value of a number.
* New `UnboundedSum` S-Norm in `SNormFactory`.
Hedge
-----
* Added `FL_IOVERRIDE` identifiers to hedge Extremely
* Added `FL_IFINAL` final identifiers to `Hedge` classes (except `Any`).
Importer and Exporter
---------------------
* New `RScriptExporter` generates an R script that uses the `ggplot2` library to produce the surfaces of an engine for each pair of input variables on each output variable.
* Updated `Fll[Importer|Exporter]` to import and export the newly named properties `implication` and `aggregation` (previously known as `activation` and `accumulation`). However, the `FllImporter` has backward compatibility with the previous property names.
* In `Fll[Importer|Exporter]`, added `lock-range` property of input variables, `activation` property for activation methods in rule blocks, and `description` property to `[Input|Output]Variable` and `RuleBlock`.
* Added default option to generate C++ and Java code using the actual names of the input variables, output variables, and rule blocks, instead of the generic `[input|output]Variable` and `ruleBlock` names.
* Updated [Cpp|Java][Import|Export] to generate code using the `description` of an engine if available, the `implication` instead of the `activation`, and the `aggregation` instead of the `accumulation`.
* Removed compatibility between `[Fcl|Fis]Exporter` and `fuzzylite`. In previous versions, these exporters produced additional tags that were only relevant to `fuzzylite`, so that an engine written in these languages could also support the features in `fuzzylite`. However, in doing so, Matlab, Octave and JFuzzyLogic would fail to import the engines written in their own languages because they would not recognize the `fuzzylite` features. Hence, in order to generate code compatible with Matlab, Octave, and JFuzzyLogic, the `fuzzylite` features are removed from the code.
* Refactored methods [Cpp|Java|Fll|Fis|Fcl]Exporter::toString([S|T]Norm*) to take `::toString(Norm*)`.
* Renamed methods FisImporter::extract[SNorm|TNorm|Defuzzifier]() to FisImporter::translate[SNorm|TNorm|Defuzzifier]()
* Fixed bug causing segmentation fault when malformed term in FuzzyLite Language
Norms
-----
* New class `UnboundedSum` to compute sum between any two values and hence reflect Matlab's and Octave's `sum` aggregation operator.
* New classes `SNormFunction` and `TNormFunction` to create custom functions on any two values using the `Function` class.
* Fixed bug computing the `NormalizedSum` S-Norm.
Rule
----
* Added properties `fl::scalar activationDegree`, `bool triggered` and `bool enabled` to a `Rule`. The `activationDegree` property stores the activation degree of the rule in order to avoid recomputing it when requesting it. The `triggered` property indicates whether the rule was triggered (i.e., whether the antecedent modified the consequent). The `enabled` property determines whether the rule can be triggered (by default, a rule is always enabled unless programmatically indicated otherwise).
* Decoupled computing the activation degree and triggering the rule. Previously, the activation degree of a rule was computed and triggered at the same time using `Rule::activate(TNorm* conjunction, SNorm* disjunction, TNorm* implication)`. Currently, there are two methods: `fl::scalar activateWith(TNorm* conjunction, SNorm* disjunction)`, which computes, stores and returns the activation degree of the rule; and `trigger(TNorm* implication)`, which, if the rule is enabled and the activation degree is greater than zero, then the rule is triggered to modify the consequent.
* Renamed `RuleBlock::activation` operator to `RuleBlock::implication` operator, and so its respective getters and setters.
* Added `RuleBlock::activation` method and respective getters and setters.
* In `RuleBlock::activate()`, if there is no activation method, the `General` activation method is automatically set in order to have backward compatibility.
* Fixed bug in `RuleBlock` to reset and clone the implication operator. Bug: implication operator is not copied and reset. Fix: copy and reset implication operator when cloning the `RuleBlock`.
* Added identifier `FL_IFINAL` to classes `Proposition` and `Operator`.
Term
----
* Performance improvements.
* `Discrete` term uses binary search instead of linear search, hence significantly improving performance.
* `Discrete` term can create a `Discrete` term from any other term.
* New `Binary` edge term.
* Added method `bool Term::isMonotonic()` to determine whether the term is monotonic (returns true only for `Concave`, `Ramp`, `Sigmoid`, `SShape`, and `ZShape`).
* Refactored static method `WeightedDefuzzifier::tsukamoto()` into non-static method `Term::tsukamoto()`, which is overriden by each of the terms that can be used for `tsukamoto` controllers.
* Privatized `Term::name` and the properties of each subclass of `Term`.
* Inlined generic methods in `[Linear|Discrete].h`
* Renamed `Activated::activation` operator to `Activated::implication` and its respective getters and setters.
* Renamed `Accumulated` term to `Aggregated` term, and its `accumulation` operator to `aggregation` operator including getters and setters.
* For performance improvements, terms of `Aggregated` term are copies of objects in stack memory rather than pointers to objects in heap memory.
* Refactored static `Term::updateReference()` to non-static being overrided by `Linear`, `Function`.
* Added enum `[Ramp|Sigmoid]::Direction` to specify the direction of the term.
* Added `Term::clone()` method to create a copy of any term.
* Fixed bug in `Function` term. Bug: given a formula = "tan(y)" and a map["y"] = 1.0, and executing `Function::load(formula)`, then the map of variables is reset because `load()` calls `unload()` first, causing the deregistration of variable `y`. Solution: Removed method `unload()` from `load()`, thereby causing future `load()` not to reset variables.
* Fixed bug in `Function` when enclosing variable in double parenthesis.
Variable
--------
* Refactored `[Input|Output]Variable::[get|set][Input|Output]Value()` to a single value in `Variable::[get|set]Value()`.
* Refactored `OutputVariable::[is|set]LockedOutputValueInRange()` to its parent `Variable::[is|set]LockValueInRange()`.
* Added option to lock value in range to input variables by refactoring `OutputVariable::lockValueInRange` to `Variable::lockValueInRange`.
* Renamed `OutputVariable::[is|set]LockedPreviousValue()` to `OutputVariable::[is|set]LockPreviousValue()`.
* Added wrapping method `OutputVariable::[get|set]Aggregation()`.
* For performance improvements, added enum `Variable::Type` and methods `Variable::type()` to indicate whether the variable is of `Type::InputVariable` or `Type::OutputVariable`. Thus, it is no longer necessary to `dynamic_cast` variables to find out whether they are input or output variables.
Benchmark
---------
* Benchmark the time it takes your engine to perform a given number of evaluations (available only when building using C++11) over a given number of independent runs.
* Measure the accuracy of the engine using the mean squared error between the obtained values and the expected values.
* Export the benchmark results to text.
Complexity
----------
* New complexity methods in the components involved in the operation of an engine.
* Complexity methods are completely decoupled from the operation of an engine, so they do not affect the performance of the engines.
Console
-------
* Benchmark engines from the FuzzyLite Console
* Hybrid example in Console
Engine
------
* Description string for Engine
* Changed signature of `::configure(TNorm* conjunction, SNorm* disjunction, TNorm* activation, SNorm* accumulation, int resolution)` to `::configure(TNorm* conjunction, SNorm* SNorm* disjunction, TNorm* implication, SNorm* aggregation, Activation* activation)`, where `implication` and `aggregation` are better names for activation and accumulation (respectively), and the `activation` refers to an activation method (see Activation Methods)
Exception.h
-----------
* Definition FL_BACKTRACE_OFF in Exception.cpp renamed to FL_BACKTRACE, hence functionality is changed.
fuzzylite.h
-----------
* Removed definitions FL_VERSION, FL_DATE from fuzzylite.h
* Renamed fuzzylite::debug() to fuzzylite::isDebugging()
* Renamed fuzzylite::logging() to fuzzylite::isLogging()
* Inlined methods of fuzzylite.h
* Removed definition `FL_CPP11` and replaced it for `FL_CPP98`. By default, `FL_CPP98` is not defined, hence building using `C++11`.
Examples
--------
* New example of hybrid engines.
* New example on obstacle avoidance for Mamdani, Takagi-Sugeno, and Hybrid engines.
* New R scripts for each example and its respective surfaces in `pdf` formats.
* Updated examples to use the new properties `InputVariable::lock-range`, `Engine::description`, `[Input|Output]Variable::description`, `RuleBlock::description`, `RuleBlock::implication`, `RuleBlock::activation`, and `OutputVariable::aggregation`.
* Updated C++ and Java examples to reflect variable names instead of generic names.
|