Reading / writing functionalities
Parse Julia code
#
FuzzyLogic.@mamfis
— Macro
Parse julia code into a MamdaniFuzzySystem
. See extended help for an example.
Extended help
Example
fis = @mamfis function tipper(service, food)::tip
service := begin
domain = 0:10
poor = GaussianMF(0.0, 1.5)
good = GaussianMF(5.0, 1.5)
excellent = GaussianMF(10.0, 1.5)
end
food := begin
domain = 0:10
rancid = TrapezoidalMF(-2, 0, 1, 3)
delicious = TrapezoidalMF(7, 9, 10, 12)
end
tip := begin
domain = 0:30
cheap = TriangularMF(0, 5, 10)
average = TriangularMF(10, 15, 20)
generous = TriangularMF(20, 25, 30)
end
and = ProdAnd
or = ProbSumOr
implication = ProdImplication
service == poor || food == rancid --> tip == cheap
service == good --> tip == average
service == excellent || food == delicious --> tip == generous
aggregator = ProbSumAggregator
defuzzifier = BisectorDefuzzifier
end
# output
tipper
Inputs:
-------
service ∈ [0, 10] with membership functions:
poor = GaussianMF{Float64}(0.0, 1.5)
good = GaussianMF{Float64}(5.0, 1.5)
excellent = GaussianMF{Float64}(10.0, 1.5)
food ∈ [0, 10] with membership functions:
rancid = TrapezoidalMF{Int64}(-2, 0, 1, 3)
delicious = TrapezoidalMF{Int64}(7, 9, 10, 12)
Outputs:
--------
tip ∈ [0, 30] with membership functions:
cheap = TriangularMF{Int64}(0, 5, 10)
average = TriangularMF{Int64}(10, 15, 20)
generous = TriangularMF{Int64}(20, 25, 30)
Inference rules:
----------------
(service is poor ∨ food is rancid) --> tip is cheap
service is good --> tip is average
(service is excellent ∨ food is delicious) --> tip is generous
Settings:
---------
- ProdAnd()
- ProbSumOr()
- ProdImplication()
- ProbSumAggregator()
- BisectorDefuzzifier(100)
#
FuzzyLogic.@sugfis
— Macro
Parse julia code into a SugenoFuzzySystem
. See extended help for an example.
Extended help
Example
fis = @sugfis function tipper(service, food)::tip
service := begin
domain = 0:10
poor = GaussianMF(0.0, 1.5)
good = GaussianMF(5.0, 1.5)
excellent = GaussianMF(10.0, 1.5)
end
food := begin
domain = 0:10
rancid = TrapezoidalMF(-2, 0, 1, 3)
delicious = TrapezoidalMF(7, 9, 10, 12)
end
tip := begin
domain = 0:30
cheap = 0
average = food
generous = 2service, food, -2
end
service == poor && food == rancid --> tip == cheap
service == good --> tip == average
service == excellent || food == delicious --> tip == generous
end
# output
tipper
Inputs:
-------
service ∈ [0, 10] with membership functions:
poor = GaussianMF{Float64}(0.0, 1.5)
good = GaussianMF{Float64}(5.0, 1.5)
excellent = GaussianMF{Float64}(10.0, 1.5)
food ∈ [0, 10] with membership functions:
rancid = TrapezoidalMF{Int64}(-2, 0, 1, 3)
delicious = TrapezoidalMF{Int64}(7, 9, 10, 12)
Outputs:
--------
tip ∈ [0, 30] with membership functions:
cheap = 0
average = food
generous = 2service + food - 2
Inference rules:
----------------
(service is poor ∧ food is rancid) --> tip is cheap
service is good --> tip is average
(service is excellent ∨ food is delicious) --> tip is generous
Settings:
---------
- ProdAnd()
- ProbSumOr()
Generate Julia code
#
FuzzyLogic.compilefis
— Function
compilefis(
fname::AbstractString,
fis::FuzzyLogic.AbstractFuzzySystem
) -> Any
compilefis(
fname::AbstractString,
fis::FuzzyLogic.AbstractFuzzySystem,
name::Symbol
) -> Any
Compile the fuzzy inference system into stand-alone Julia code. If the first argument is a string, it write the code in the given file, otherwise it returns the Julia expression of the code.
Inputs
-
fname::AbstractString
— file where to write -
fis::AbstractFuzzySystem
— fuzzy system to compile -
name::Symbol
— name of the generated function, defaultfis.name
Notes
Only type-1 inference systems are supported
Read from file
#
FuzzyLogic.readfis
— Function
readfis(file::String) -> FuzzyLogic.AbstractFuzzySystem
readfis(
file::String,
fmt::Union{Nothing, Symbol}
) -> FuzzyLogic.AbstractFuzzySystem
Read a fuzzy system from a file using a specified format.
Inputs
-
file::String
— path to the file to read. -
fmt::Union{Symbol,Nothing}
— input format of the file. Ifnothing
, it is inferred from the file extension.
Supported formats are
-
:fcl
— Fuzzy Control Language (corresponding file extension.fcl
) -
:fml
— Fuzzy Markup Language (corresponding file extension.xml
) -
:matlab
— Matlab fis (corresponding file extension.fis
)
Parse FCL
#
FuzzyLogic.FCLParser.parse_fcl
— Function
parse_fcl(s::String)::AbstractFuzzySystem
Parse a fuzzy inference system from a string representation in Fuzzy Control Language (FCL).
Inputs
-
s::String
— string describing a fuzzy system in FCL conformant to the IEC 1131-7 standard.
Notes
The parsers can read FCL comformant to IEC 1131-7, with the following remarks:
-
Sugeno (system with singleton outputs) shall use COGS as defuzzifier.
-
the
RANGE
keyword is required for both fuzzification and defuzzification blocks. -
Only the required
MAX
accumulator is supported. -
Default value for defuzzification not supported.
-
Optional local variables are not supported.
With the exceptions above, the parser supports all required and optional features of the standard (tables 6.1-1 and 6.1-2). In addition, it also supports the following features:
-
Piecewise linear functions can have any number of points.
-
Membership degrees in piecewise linear functions points can be any number between and .
Parse FML
#
FuzzyLogic.FMLParser.parse_fml
— Function
parse_fml(s::String)::AbstractFuzzySystem
Parse a fuzzy inference system from a string representation in Fuzzy Markup Language (FML).
Inputs
-
s::String
— string describing a fuzzy system in FML conformant to the IEEE 1855-2016 standard.
Notes
The parsers can read FML comformant to IEEE 1855-2016, with the following remarks:
-
only Mamdani and Sugeno are supported.
-
Operators
and
andor
definitions should be set in the rule base block. Definitions at individual rules are ignored. -
Modifiers are not supported.
Parse Matlab
#
FuzzyLogic.MatlabParser.parse_matlabfis
— Function
parse_matlabfis(s::AbstractString)
Parse a fuzzy inference system from a string in Matlab FIS format.
#
FuzzyLogic.MatlabParser.@matlabfis_str
— Macro
String macro to parse Matlab fis formats. See parse_matlabfis
for more details.