diff options
Diffstat (limited to 'examples')
183 files changed, 29948 insertions, 0 deletions
diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..6525a9a --- /dev/null +++ b/examples/README.md @@ -0,0 +1,13 @@ +Disclaimer +========== + +The following folders contain examples from Matlab and Octave distributions. The examples are presented in the following formats: fuzzylite v5.0 `.cpp`, jfuzzylite v5.0 `.java`, FuzzyLite Language `.fll`, FuzzyLite Dataset `.fld`, Fuzzy Inference System `.fis`, and Fuzzy Controller Language `.fcl`. The formats were created automatically utilizing the `[Cpp|Java|Fll|Fld|Fis|Fcl]Exporter`. + +The original files from Matlab and Octave distributions are contained within the folder `original`, although the following files from Matlab were modified to remove the fourth parameter of the term `gbellmf`, which is not required for its configuration. + ++ [`examples/original/mamdani/matlab/mam21.fis`](/examples/original/mamdani/matlab/mam21.fis) + ++ [`examples/original/mamdani/matlab/mam22.fis`](/examples/original/mamdani/matlab/mam22.fis) + +In addition to the original examples, the examples are presented in the FuzzyLite Language to include scalar values with at least the same number of decimal places, and a proper configuration in the cases of Takagi-Sugeno controllers (i.e., `RuleBlock::activation = none` and `OutputVariable::accumulation = none`) to satisfy the regular operation of the controllers in `fuzzylite` v5.0. + diff --git a/examples/application/CMakeLists.txt b/examples/application/CMakeLists.txt new file mode 100644 index 0000000..3ec0869 --- /dev/null +++ b/examples/application/CMakeLists.txt @@ -0,0 +1,140 @@ +cmake_minimum_required(VERSION 2.8.8) + +project(FuzzyLiteDemo CXX) + +#Some default policies and variables +if (APPLE) + cmake_policy(SET CMP0042 NEW) +endif() +if (MSVC) + cmake_policy(SET CMP0054 NEW) +endif() + +if(NOT CMAKE_VERBOSE_MAKEFILE) + set(CMAKE_VERBOSE_MAKEFILE false) +endif() + +if( NOT CMAKE_BUILD_TYPE ) + set( CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo +MinSizeRel." FORCE ) +endif() + +option(FL_BACKTRACE "Provide backtrace information in case of errors" ON) +option(FL_STATIC "Statically link to fuzzylite libraries" ON) + +set(BacktraceLibrary) + +if (MSVC AND FL_BACKTRACE) + set(BacktraceLibrary dbghelp) +endif() + +if (CMAKE_BUILD_TYPE MATCHES Debug) + set(FL_DEBUG ON) +else() + set(FL_DEBUG OFF) +endif() + + +set(FL_SYSTEM_LIBRARY FALSE) #Finds the library installed in the system +set(FL_LIBRARY_DIR) + +if (NOT FL_SYSTEM_LIBRARY) + #it is possible to find the FuzzyLiteLibrary locally as follows, + #assuming the submodule of fuzzylite is added to the ${PROJECT_SOURCE_DIR}: + set(FL_HOME ${PROJECT_SOURCE_DIR}/../../fuzzylite/) + set(FL_INCLUDE_DIR ${FL_HOME}) + if (FL_DEBUG) + set(FL_LIBRARY_DIR ${FL_HOME}/debug/bin) + else() + set(FL_LIBRARY_DIR ${FL_HOME}/release/bin) + endif() + message("Finding FuzzyLiteLibrary locally at ${FL_LIBRARY_DIR}") + + include_directories(${FL_INCLUDE_DIR}) +endif() + +set(FL_POSTFIX) +if (FL_STATIC) + set(FL_POSTFIX "-static") +endif() +if (FL_DEBUG) + set(FL_POSTFIX "${FL_POSTFIX}-debug") +endif() + +set(FL_LIBRARY_NAME fuzzylite${FL_POSTFIX}) +find_library (FuzzyLiteLibrary ${FL_LIBRARY_NAME} HINTS ${FL_LIBRARY_DIR}) + +if (MSVC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19) +#C++11 not available before Visual Studio 2015 + if (NOT FL_CPP98) + set(FL_CPP98 ON) + endif() +endif() + + +#if building using C++98 +if(FL_CPP98) + add_definitions(-DFL_CPP98) + if(NOT MSVC) + #Set C++98 by default in Clang and others + add_definitions(-std=c++98) + endif() +else() + if(NOT MSVC) + #Set C++11 by default in Clang and others + add_definitions(-std=c++11) + endif() +endif(FL_CPP98) + +#we add the definition of the building path to remove it when using macro FL_LOG +add_definitions(-DFL_BUILD_PATH="${CMAKE_SOURCE_DIR}") #used to determine +#we add the sources +set(sources src/main.cpp) + + + +if(MSVC) +#Set compilation flags in Windows + set(CMAKE_CXX_FLAGS "/W4 /EHsc") + #Wx: Treat warnings as errors. W4: All warnings + #http://msdn.microsoft.com/en-us/library/thxezb7y.aspx + #EHsc: call destructors on __try __catch, and to ignore C4530: C++ exception handler used. Note, unwind semantics are not enabled +endif() + + +#we create the binary +add_executable(binary ${sources}) +if (NOT FL_STATIC) + target_compile_definitions(binary PRIVATE FL_IMPORT_LIBRARY) +endif() +#linking the fuzzylite library +target_link_libraries (binary ${FuzzyLiteLibrary} ${BacktraceLibrary}) +#setting the name of the product +set_target_properties(binary PROPERTIES OUTPUT_NAME FuzzyLiteDemo) +#specially for windows +set_target_properties(binary PROPERTIES OUTPUT_NAME FuzzyLiteDemo IMPORT_PREFIX tmp-) #To prevent LNK1149 in Windows +#in case of building on debug mode +set_target_properties(binary PROPERTIES DEBUG_POSTFIX d) + + + +message("=====================================") +message("FuzzyLite Demo v6.0\n") +message("FL_HOME=${FL_HOME}") +message("FL_LIBRARY_NAME=${FL_LIBRARY_NAME}") +message("FuzzyLiteLibrary=${FuzzyLiteLibrary}") +message("") +message("FL_BACKTRACE=${FL_BACKTRACE}") +message("FL_STATIC=${FL_STATIC}") +message("FL_DEBUG=${FL_DEBUG}") +message("CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") +message("CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}") +message("CMAKE_CXX_COMPILER_VERSION=${CMAKE_CXX_COMPILER_VERSION}") +message("CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}") +message("COMPILE_DEFINITIONS:") +get_directory_property(fl-definitions DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +foreach(d ${fl-definitions}) + message( STATUS "Defined: " ${d} ) +endforeach() +message("=====================================\n") + diff --git a/examples/application/clean.sh b/examples/application/clean.sh new file mode 100755 index 0000000..4f4bc9c --- /dev/null +++ b/examples/application/clean.sh @@ -0,0 +1 @@ +rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake FuzzyLiteDemo
\ No newline at end of file diff --git a/examples/application/compile.bat b/examples/application/compile.bat new file mode 100644 index 0000000..8baf5a3 --- /dev/null +++ b/examples/application/compile.bat @@ -0,0 +1,24 @@ +FL_HOME="../../fuzzylite/" + +rem Static Linking +rem -------------- +rem For C++11 +cl.exe src/main.cpp %FL_HOME%/release/bin/fuzzylite-static.lib /I%FL_HOME% /EHsc /MD + +rem For C++98 +cl.exe src/main.cpp %FL_HOME%/release/bin/fuzzylite-static.lib /I%FL_HOME% /DFL_CPP98=ON /EHsc /MD + + +rem Dynamic Linking +rem --------------- +rem For C++11 +rem For C++11 +cl.exe src/main.cpp %FL_HOME%/release/bin/fuzzylite-static.lib /I%FL_HOME% /DFL_IMPORT_LIBRARY /EHsc /MD + +rem For C++98 +cl.exe src/main.cpp %FL_HOME%/release/bin/fuzzylite-static.lib /I%FL_HOME% /DFL_CPP98=ON /DFL_IMPORT_LIBRARY /EHsc /MD + +rem Note: when using dynamic linking, the path to fuzzylite libraries must be specified. For example, run from console the following: + +set PATH="%FL_HOME%\release\bin;%PATH%" +example-dynamic-11.exe diff --git a/examples/application/compile.sh b/examples/application/compile.sh new file mode 100755 index 0000000..1ea1aa4 --- /dev/null +++ b/examples/application/compile.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +FL_HOME="../../fuzzylite/" + +#Static Linking +#-------------- +#For C++11 +g++ src/main.cpp -oexample-static-11 -I$FL_HOME -L$FL_HOME/release/bin -lfuzzylite-static -std=c++11 + +#For C++98 +g++ src/main.cpp -oexample-static-98 -I$FL_HOME -L$FL_HOME/release/bin -lfuzzylite-static -DFL_CPP98=ON -Wno-non-literal-null-conversion + + +#Dynamic Linking +#--------------- +#For C++11 +g++ src/main.cpp -oexample-dynamic-11 -I$FL_HOME -L$FL_HOME/release/bin -lfuzzylite -std=c++11 + +#For C++98 +g++ src/main.cpp -oexample-dynamic-98 -I$FL_HOME -L$FL_HOME/release/bin -lfuzzylite -DFL_CPP98=ON -Wno-non-literal-null-conversion + +#Note: when using dynamic linking, the path to fuzzylite libraries must be specified. For example, run from console the following: + +LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FL_HOME/release/bin; +./example-dynamic-11 diff --git a/examples/application/src/main.cpp b/examples/application/src/main.cpp new file mode 100644 index 0000000..d547b72 --- /dev/null +++ b/examples/application/src/main.cpp @@ -0,0 +1,16 @@ + +#include "fl/Headers.h" + +int main(int argc, char** argv){ + FL_IUNUSED(argc); + FL_IUNUSED(argv); + + using namespace fl; + + Engine* hybrid = Console::hybrid(); + FL_LOG("Hybrid Demo: FuzzyLite Dataset"); + FL_LOG("==============================="); + FL_LOG(FldExporter().toString(hybrid)); + delete hybrid; + +}
\ No newline at end of file diff --git a/examples/examples.R b/examples/examples.R new file mode 100644 index 0000000..7b905bf --- /dev/null +++ b/examples/examples.R @@ -0,0 +1,16 @@ +directories = c("mamdani/", "mamdani/matlab/", "mamdani/octave/", "takagi-sugeno/", "takagi-sugeno/matlab/", "takagi-sugeno/octave/", "tsukamoto/", "hybrid") +baseDirectory = getwd() + +for (directory in directories){ + message("Processing directory: ", directory) + setwd(directory) + rScripts = list.files(".", pattern = ".R$") + for (i in seq(1, length(rScripts))){ + rScript = rScripts[i] + message(sprintf("\tProcessing file %i/%i: %s", i, length(rScripts), rScript)) + scriptEnvironment = new.env() + sys.source(rScript, scriptEnvironment) + rm(scriptEnvironment) + } + setwd(baseDirectory) +} diff --git a/examples/hybrid/ObstacleAvoidance.R b/examples/hybrid/ObstacleAvoidance.R new file mode 100644 index 0000000..5a94543 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.R @@ -0,0 +1,86 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "ObstacleAvoidance" +engine.fll = "Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left" + +engine.fldFile = "ObstacleAvoidance.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs mSteer") + +engine.plot.o1_i1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("mSteer vs obstacle") + +engine.plot.i1_o2 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs tsSteer") + +engine.plot.o2_i1 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("tsSteer vs obstacle") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/hybrid/ObstacleAvoidance.cpp b/examples/hybrid/ObstacleAvoidance.cpp new file mode 100644 index 0000000..a5e42e1 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.cpp @@ -0,0 +1,75 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("ObstacleAvoidance"); +engine->setDescription(""); + +InputVariable* obstacle = new InputVariable; +obstacle->setName("obstacle"); +obstacle->setDescription(""); +obstacle->setEnabled(true); +obstacle->setRange(0.000, 1.000); +obstacle->setLockValueInRange(false); +obstacle->addTerm(new Ramp("left", 1.000, 0.000)); +obstacle->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addInputVariable(obstacle); + +OutputVariable* mSteer = new OutputVariable; +mSteer->setName("mSteer"); +mSteer->setDescription(""); +mSteer->setEnabled(true); +mSteer->setRange(0.000, 1.000); +mSteer->setLockValueInRange(false); +mSteer->setAggregation(new Maximum); +mSteer->setDefuzzifier(new Centroid(100)); +mSteer->setDefaultValue(fl::nan); +mSteer->setLockPreviousValue(false); +mSteer->addTerm(new Ramp("left", 1.000, 0.000)); +mSteer->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addOutputVariable(mSteer); + +OutputVariable* tsSteer = new OutputVariable; +tsSteer->setName("tsSteer"); +tsSteer->setDescription(""); +tsSteer->setEnabled(true); +tsSteer->setRange(0.000, 1.000); +tsSteer->setLockValueInRange(false); +tsSteer->setAggregation(new Maximum); +tsSteer->setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer->setDefaultValue(fl::nan); +tsSteer->setLockPreviousValue(false); +tsSteer->addTerm(new Constant("left", 0.333)); +tsSteer->addTerm(new Constant("right", 0.666)); +engine->addOutputVariable(tsSteer); + +RuleBlock* mamdani = new RuleBlock; +mamdani->setName("mamdani"); +mamdani->setDescription(""); +mamdani->setEnabled(true); +mamdani->setConjunction(fl::null); +mamdani->setDisjunction(fl::null); +mamdani->setImplication(new AlgebraicProduct); +mamdani->setActivation(new General); +mamdani->addRule(Rule::parse("if obstacle is left then mSteer is right", engine)); +mamdani->addRule(Rule::parse("if obstacle is right then mSteer is left", engine)); +engine->addRuleBlock(mamdani); + +RuleBlock* takagiSugeno = new RuleBlock; +takagiSugeno->setName("takagiSugeno"); +takagiSugeno->setDescription(""); +takagiSugeno->setEnabled(true); +takagiSugeno->setConjunction(fl::null); +takagiSugeno->setDisjunction(fl::null); +takagiSugeno->setImplication(fl::null); +takagiSugeno->setActivation(new General); +takagiSugeno->addRule(Rule::parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno->addRule(Rule::parse("if obstacle is right then tsSteer is left", engine)); +engine->addRuleBlock(takagiSugeno); + + +} diff --git a/examples/hybrid/ObstacleAvoidance.fcl b/examples/hybrid/ObstacleAvoidance.fcl new file mode 100644 index 0000000..81a30a7 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fcl @@ -0,0 +1,49 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK ObstacleAvoidance + +VAR_INPUT + obstacle: REAL; +END_VAR + +VAR_OUTPUT + mSteer: REAL; + tsSteer: REAL; +END_VAR + +FUZZIFY obstacle + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; +END_FUZZIFY + +DEFUZZIFY mSteer + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY tsSteer + RANGE := (0.000 .. 1.000); + TERM left := 0.333; + TERM right := 0.666; + METHOD : COGS; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK mamdani + ACT : PROD; + RULE 1 : if obstacle is left then mSteer is right + RULE 2 : if obstacle is right then mSteer is left +END_RULEBLOCK + +RULEBLOCK takagiSugeno + RULE 1 : if obstacle is left then tsSteer is right + RULE 2 : if obstacle is right then tsSteer is left +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/hybrid/ObstacleAvoidance.fis b/examples/hybrid/ObstacleAvoidance.fis new file mode 100644 index 0000000..1bf0476 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fis @@ -0,0 +1,43 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='ObstacleAvoidance' +Type='hybrid' +Version=6.0 +NumInputs=1 +NumOutputs=2 +NumRules=4 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='obstacle' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output1] +Name='mSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output2] +Name='tsSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'constant',[0.333] +MF2='right':'constant',[0.666] + +[Rules] +# RuleBlock mamdani +1.000 , 2.000 0.000 (1.000) : 1 +2.000 , 1.000 0.000 (1.000) : 1 +# RuleBlock takagiSugeno +1.000 , 0.000 2.000 (1.000) : 1 +2.000 , 0.000 1.000 (1.000) : 1 diff --git a/examples/hybrid/ObstacleAvoidance.fld b/examples/hybrid/ObstacleAvoidance.fld new file mode 100644 index 0000000..bd96696 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fld @@ -0,0 +1,1025 @@ +obstacle mSteer tsSteer +0.000000000 0.666650000 0.666000000 +0.000977517 0.666650000 0.665674487 +0.001955034 0.666650000 0.665348974 +0.002932551 0.666650000 0.665023460 +0.003910068 0.666650000 0.664697947 +0.004887586 0.666650000 0.664372434 +0.005865103 0.666638485 0.664046921 +0.006842620 0.666625450 0.663721408 +0.007820137 0.666612389 0.663395894 +0.008797654 0.666599303 0.663070381 +0.009775171 0.666586193 0.662744868 +0.010752688 0.666573056 0.662419355 +0.011730205 0.666559894 0.662093842 +0.012707722 0.666546707 0.661768328 +0.013685239 0.666533494 0.661442815 +0.014662757 0.666520255 0.661117302 +0.015640274 0.666498518 0.660791789 +0.016617791 0.666472271 0.660466276 +0.017595308 0.666445974 0.660140762 +0.018572825 0.666419626 0.659815249 +0.019550342 0.666393229 0.659489736 +0.020527859 0.666366781 0.659164223 +0.021505376 0.666340282 0.658838710 +0.022482893 0.666313732 0.658513196 +0.023460411 0.666287131 0.658187683 +0.024437928 0.666260479 0.657862170 +0.025415445 0.666228313 0.657536657 +0.026392962 0.666188686 0.657211144 +0.027370479 0.666148986 0.656885630 +0.028347996 0.666109209 0.656560117 +0.029325513 0.666069358 0.656234604 +0.030303030 0.666029432 0.655909091 +0.031280547 0.665989429 0.655583578 +0.032258065 0.665949351 0.655258065 +0.033235582 0.665909196 0.654932551 +0.034213099 0.665868966 0.654607038 +0.035190616 0.665826169 0.654281525 +0.036168133 0.665773005 0.653956012 +0.037145650 0.665719742 0.653630499 +0.038123167 0.665666380 0.653304985 +0.039100684 0.665612917 0.652979472 +0.040078201 0.665559355 0.652653959 +0.041055718 0.665505693 0.652328446 +0.042033236 0.665451930 0.652002933 +0.043010753 0.665398066 0.651677419 +0.043988270 0.665344101 0.651351906 +0.044965787 0.665290034 0.651026393 +0.045943304 0.665223628 0.650700880 +0.046920821 0.665156655 0.650375367 +0.047898338 0.665089559 0.650049853 +0.048875855 0.665022339 0.649724340 +0.049853372 0.664954994 0.649398827 +0.050830890 0.664887525 0.649073314 +0.051808407 0.664819932 0.648747801 +0.052785924 0.664752213 0.648422287 +0.053763441 0.664684369 0.648096774 +0.054740958 0.664616398 0.647771261 +0.055718475 0.664539056 0.647445748 +0.056695992 0.664458237 0.647120235 +0.057673509 0.664377270 0.646794721 +0.058651026 0.664296156 0.646469208 +0.059628543 0.664214895 0.646143695 +0.060606061 0.664133485 0.645818182 +0.061583578 0.664051926 0.645492669 +0.062561095 0.663970218 0.645167155 +0.063538612 0.663888361 0.644841642 +0.064516129 0.663806354 0.644516129 +0.065493646 0.663717900 0.644190616 +0.066471163 0.663623109 0.643865103 +0.067448680 0.663528148 0.643539589 +0.068426197 0.663433016 0.643214076 +0.069403715 0.663337714 0.642888563 +0.070381232 0.663242240 0.642563050 +0.071358749 0.663146594 0.642237537 +0.072336266 0.663050776 0.641912023 +0.073313783 0.662954785 0.641586510 +0.074291300 0.662858620 0.641260997 +0.075268817 0.662758885 0.640935484 +0.076246334 0.662650011 0.640609971 +0.077223851 0.662540943 0.640284457 +0.078201369 0.662431683 0.639958944 +0.079178886 0.662322229 0.639633431 +0.080156403 0.662212581 0.639307918 +0.081133920 0.662102739 0.638982405 +0.082111437 0.661992701 0.638656891 +0.083088954 0.661882468 0.638331378 +0.084066471 0.661772039 0.638005865 +0.085043988 0.661660863 0.637680352 +0.086021505 0.661537806 0.637354839 +0.086999022 0.661414534 0.637029326 +0.087976540 0.661291048 0.636703812 +0.088954057 0.661167346 0.636378299 +0.089931574 0.661043428 0.636052786 +0.090909091 0.660919294 0.635727273 +0.091886608 0.660794942 0.635401760 +0.092864125 0.660670373 0.635076246 +0.093841642 0.660545585 0.634750733 +0.094819159 0.660420579 0.634425220 +0.095796676 0.660285492 0.634099707 +0.096774194 0.660147932 0.633774194 +0.097751711 0.660010136 0.633448680 +0.098729228 0.659872104 0.633123167 +0.099706745 0.659733835 0.632797654 +0.100684262 0.659595328 0.632472141 +0.101661779 0.659456582 0.632146628 +0.102639296 0.659317597 0.631821114 +0.103616813 0.659178373 0.631495601 +0.104594330 0.659038909 0.631170088 +0.105571848 0.658892208 0.630844575 +0.106549365 0.658740291 0.630519062 +0.107526882 0.658588119 0.630193548 +0.108504399 0.658435689 0.629868035 +0.109481916 0.658283002 0.629542522 +0.110459433 0.658130057 0.629217009 +0.111436950 0.657976852 0.628891496 +0.112414467 0.657823389 0.628565982 +0.113391984 0.657669665 0.628240469 +0.114369501 0.657515680 0.627914956 +0.115347019 0.657357242 0.627589443 +0.116324536 0.657190916 0.627263930 +0.117302053 0.657024315 0.626938416 +0.118279570 0.656857437 0.626612903 +0.119257087 0.656690282 0.626287390 +0.120234604 0.656522850 0.625961877 +0.121212121 0.656355139 0.625636364 +0.122189638 0.656187149 0.625310850 +0.123167155 0.656018879 0.624985337 +0.124144673 0.655850329 0.624659824 +0.125122190 0.655680041 0.624334311 +0.126099707 0.655499270 0.624008798 +0.127077224 0.655318205 0.623683284 +0.128054741 0.655136845 0.623357771 +0.129032258 0.654955190 0.623032258 +0.130009775 0.654773238 0.622706745 +0.130987292 0.654590990 0.622381232 +0.131964809 0.654408443 0.622055718 +0.132942326 0.654225598 0.621730205 +0.133919844 0.654042454 0.621404692 +0.134897361 0.653859010 0.621079179 +0.135874878 0.653664982 0.620753666 +0.136852395 0.653469436 0.620428152 +0.137829912 0.653273578 0.620102639 +0.138807429 0.653077407 0.619777126 +0.139784946 0.652880922 0.619451613 +0.140762463 0.652684123 0.619126100 +0.141739980 0.652487008 0.618800587 +0.142717498 0.652289577 0.618475073 +0.143695015 0.652091829 0.618149560 +0.144672532 0.651893763 0.617824047 +0.145650049 0.651687855 0.617498534 +0.146627566 0.651477831 0.617173021 +0.147605083 0.651267477 0.616847507 +0.148582600 0.651056794 0.616521994 +0.149560117 0.650845780 0.616196481 +0.150537634 0.650634436 0.615870968 +0.151515152 0.650422759 0.615545455 +0.152492669 0.650210750 0.615219941 +0.153470186 0.649998407 0.614894428 +0.154447703 0.649785731 0.614568915 +0.155425220 0.649567877 0.614243402 +0.156402737 0.649343393 0.613917889 +0.157380254 0.649118566 0.613592375 +0.158357771 0.648893393 0.613266862 +0.159335288 0.648667875 0.612941349 +0.160312805 0.648442011 0.612615836 +0.161290323 0.648215799 0.612290323 +0.162267840 0.647989239 0.611964809 +0.163245357 0.647762331 0.611639296 +0.164222874 0.647535073 0.611313783 +0.165200391 0.647305221 0.610988270 +0.166177908 0.647066320 0.610662757 +0.167155425 0.646827060 0.610337243 +0.168132942 0.646587441 0.610011730 +0.169110459 0.646347463 0.609686217 +0.170087977 0.646107124 0.609360704 +0.171065494 0.645866424 0.609035191 +0.172043011 0.645625361 0.608709677 +0.173020528 0.645383936 0.608384164 +0.173998045 0.645142147 0.608058651 +0.174975562 0.644899993 0.607733138 +0.175953079 0.644647002 0.607407625 +0.176930596 0.644393373 0.607082111 +0.177908113 0.644139372 0.606756598 +0.178885630 0.643884998 0.606431085 +0.179863148 0.643630251 0.606105572 +0.180840665 0.643375130 0.605780059 +0.181818182 0.643119633 0.605454545 +0.182795699 0.642863761 0.605129032 +0.183773216 0.642607513 0.604803519 +0.184750733 0.642350886 0.604478006 +0.185728250 0.642086038 0.604152493 +0.186705767 0.641818123 0.603826979 +0.187683284 0.641549824 0.603501466 +0.188660802 0.641281142 0.603175953 +0.189638319 0.641012074 0.602850440 +0.190615836 0.640742621 0.602524927 +0.191593353 0.640472782 0.602199413 +0.192570870 0.640202555 0.601873900 +0.193548387 0.639931940 0.601548387 +0.194525904 0.639660937 0.601222874 +0.195503421 0.639384233 0.600897361 +0.196480938 0.639102138 0.600571848 +0.197458456 0.638819650 0.600246334 +0.198435973 0.638536767 0.599920821 +0.199413490 0.638253490 0.599595308 +0.200391007 0.637969817 0.599269795 +0.201368524 0.637685747 0.598944282 +0.202346041 0.637401280 0.598618768 +0.203323558 0.637116415 0.598293255 +0.204301075 0.636831150 0.597967742 +0.205278592 0.636542613 0.597642229 +0.206256109 0.636246466 0.597316716 +0.207233627 0.635949918 0.596991202 +0.208211144 0.635652966 0.596665689 +0.209188661 0.635355612 0.596340176 +0.210166178 0.635057853 0.596014663 +0.211143695 0.634759688 0.595689150 +0.212121212 0.634461118 0.595363636 +0.213098729 0.634162142 0.595038123 +0.214076246 0.633862757 0.594712610 +0.215053763 0.633562423 0.594387097 +0.216031281 0.633252376 0.594061584 +0.217008798 0.632941920 0.593736070 +0.217986315 0.632631055 0.593410557 +0.218963832 0.632319779 0.593085044 +0.219941349 0.632008091 0.592759531 +0.220918866 0.631695992 0.592434018 +0.221896383 0.631383479 0.592108504 +0.222873900 0.631070553 0.591782991 +0.223851417 0.630757212 0.591457478 +0.224828935 0.630443455 0.591131965 +0.225806452 0.630121364 0.590806452 +0.226783969 0.629797178 0.590480938 +0.227761486 0.629472576 0.590155425 +0.228739003 0.629147559 0.589829912 +0.229716520 0.628822125 0.589504399 +0.230694037 0.628496272 0.589178886 +0.231671554 0.628170002 0.588853372 +0.232649071 0.627843312 0.588527859 +0.233626588 0.627516202 0.588202346 +0.234604106 0.627188671 0.587876833 +0.235581623 0.626855159 0.587551320 +0.236559140 0.626517443 0.587225806 +0.237536657 0.626179308 0.586900293 +0.238514174 0.625840753 0.586574780 +0.239491691 0.625501777 0.586249267 +0.240469208 0.625162379 0.585923754 +0.241446725 0.624822559 0.585598240 +0.242424242 0.624482316 0.585272727 +0.243401760 0.624141649 0.584947214 +0.244379277 0.623800557 0.584621701 +0.245356794 0.623455725 0.584296188 +0.246334311 0.623104704 0.583970674 +0.247311828 0.622753262 0.583645161 +0.248289345 0.622401397 0.583319648 +0.249266862 0.622049109 0.582994135 +0.250244379 0.621696398 0.582668622 +0.251221896 0.621343261 0.582343109 +0.252199413 0.620989700 0.582017595 +0.253176931 0.620635712 0.581692082 +0.254154448 0.620281297 0.581366569 +0.255131965 0.619925265 0.581041056 +0.256109482 0.619561189 0.580715543 +0.257086999 0.619196691 0.580390029 +0.258064516 0.618831769 0.580064516 +0.259042033 0.618466424 0.579739003 +0.260019550 0.618100655 0.579413490 +0.260997067 0.617734460 0.579087977 +0.261974585 0.617367839 0.578762463 +0.262952102 0.617000791 0.578436950 +0.263929619 0.616633316 0.578111437 +0.264907136 0.616265413 0.577785924 +0.265884653 0.615889366 0.577460411 +0.266862170 0.615512088 0.577134897 +0.267839687 0.615134387 0.576809384 +0.268817204 0.614756264 0.576483871 +0.269794721 0.614377718 0.576158358 +0.270772239 0.613998747 0.575832845 +0.271749756 0.613619351 0.575507331 +0.272727273 0.613239530 0.575181818 +0.273704790 0.612859282 0.574856305 +0.274682307 0.612478608 0.574530792 +0.275659824 0.612091947 0.574205279 +0.276637341 0.611702189 0.573879765 +0.277614858 0.611312012 0.573554252 +0.278592375 0.610921415 0.573228739 +0.279569892 0.610530398 0.572903226 +0.280547410 0.610138959 0.572577713 +0.281524927 0.609747097 0.572252199 +0.282502444 0.609354813 0.571926686 +0.283479961 0.608962106 0.571601173 +0.284457478 0.608568974 0.571275660 +0.285434995 0.608171886 0.570950147 +0.286412512 0.607769974 0.570624633 +0.287390029 0.607367648 0.570299120 +0.288367546 0.606964906 0.569973607 +0.289345064 0.606561748 0.569648094 +0.290322581 0.606158173 0.569322581 +0.291300098 0.605754180 0.568997067 +0.292277615 0.605349770 0.568671554 +0.293255132 0.604944940 0.568346041 +0.294232649 0.604539690 0.568020528 +0.295210166 0.604132380 0.567695015 +0.296187683 0.603718665 0.567369501 +0.297165200 0.603304542 0.567043988 +0.298142717 0.602890009 0.566718475 +0.299120235 0.602475066 0.566392962 +0.300097752 0.602059712 0.566067449 +0.301075269 0.601643947 0.565741935 +0.302052786 0.601227769 0.565416422 +0.303030303 0.600811179 0.565090909 +0.304007820 0.600394176 0.564765396 +0.304985337 0.599976759 0.564439883 +0.305962854 0.599551726 0.564114370 +0.306940371 0.599126182 0.563788856 +0.307917889 0.598700236 0.563463343 +0.308895406 0.598273888 0.563137830 +0.309872923 0.597847137 0.562812317 +0.310850440 0.597419982 0.562486804 +0.311827957 0.596992424 0.562161290 +0.312805474 0.596564460 0.561835777 +0.313782991 0.596136092 0.561510264 +0.314760508 0.595707318 0.561184751 +0.315738025 0.595272860 0.560859238 +0.316715543 0.594836296 0.560533724 +0.317693060 0.594399340 0.560208211 +0.318670577 0.593961991 0.559882698 +0.319648094 0.593524248 0.559557185 +0.320625611 0.593086112 0.559231672 +0.321603128 0.592647581 0.558906158 +0.322580645 0.592208655 0.558580645 +0.323558162 0.591769334 0.558255132 +0.324535679 0.591329617 0.557929619 +0.325513196 0.590886006 0.557604106 +0.326490714 0.590438847 0.557278592 +0.327468231 0.589991307 0.556953079 +0.328445748 0.589543385 0.556627566 +0.329423265 0.589095081 0.556302053 +0.330400782 0.588646394 0.555976540 +0.331378299 0.588197324 0.555651026 +0.332355816 0.587747870 0.555325513 +0.333333333 0.587298033 0.555000000 +0.334310850 0.586847811 0.554674487 +0.335288368 0.586395337 0.554348974 +0.336265885 0.585938031 0.554023460 +0.337243402 0.585480357 0.553697947 +0.338220919 0.585022313 0.553372434 +0.339198436 0.584563900 0.553046921 +0.340175953 0.584105117 0.552721408 +0.341153470 0.583645965 0.552395894 +0.342130987 0.583186441 0.552070381 +0.343108504 0.582726546 0.551744868 +0.344086022 0.582266280 0.551419355 +0.345063539 0.581805253 0.551093842 +0.346041056 0.581338270 0.550768328 +0.347018573 0.580870934 0.550442815 +0.347996090 0.580403243 0.550117302 +0.348973607 0.579935197 0.549791789 +0.349951124 0.579466795 0.549466276 +0.350928641 0.578998038 0.549140762 +0.351906158 0.578528925 0.548815249 +0.352883675 0.578059455 0.548489736 +0.353861193 0.577589628 0.548164223 +0.354838710 0.577119444 0.547838710 +0.355816227 0.576644207 0.547513196 +0.356793744 0.576167703 0.547187683 +0.357771261 0.575690860 0.546862170 +0.358748778 0.575213679 0.546536657 +0.359726295 0.574736158 0.546211144 +0.360703812 0.574258297 0.545885630 +0.361681329 0.573780096 0.545560117 +0.362658847 0.573301554 0.545234604 +0.363636364 0.572822672 0.544909091 +0.364613881 0.572343449 0.544583578 +0.365591398 0.571860698 0.544258065 +0.366568915 0.571375542 0.543932551 +0.367546432 0.570890065 0.543607038 +0.368523949 0.570404267 0.543281525 +0.369501466 0.569918146 0.542956012 +0.370478983 0.569431703 0.542630499 +0.371456500 0.568944938 0.542304985 +0.372434018 0.568457849 0.541979472 +0.373411535 0.567970438 0.541653959 +0.374389052 0.567482703 0.541328446 +0.375366569 0.566992805 0.541002933 +0.376344086 0.566499534 0.540677419 +0.377321603 0.566005960 0.540351906 +0.378299120 0.565512083 0.540026393 +0.379276637 0.565017903 0.539700880 +0.380254154 0.564523420 0.539375367 +0.381231672 0.564028633 0.539049853 +0.382209189 0.563533542 0.538724340 +0.383186706 0.563038147 0.538398827 +0.384164223 0.562542448 0.538073314 +0.385141740 0.562045786 0.537747801 +0.386119257 0.561544954 0.537422287 +0.387096774 0.561043840 0.537096774 +0.388074291 0.560542444 0.536771261 +0.389051808 0.560040764 0.536445748 +0.390029326 0.559538801 0.536120235 +0.391006843 0.559036555 0.535794721 +0.391984360 0.558534026 0.535469208 +0.392961877 0.558031212 0.535143695 +0.393939394 0.557528114 0.534818182 +0.394916911 0.557024732 0.534492669 +0.395894428 0.556517268 0.534167155 +0.396871945 0.556009189 0.533841642 +0.397849462 0.555500848 0.533516129 +0.398826979 0.554992247 0.533190616 +0.399804497 0.554483383 0.532865103 +0.400782014 0.553974258 0.532539589 +0.401759531 0.553464870 0.532214076 +0.402737048 0.552955221 0.531888563 +0.403714565 0.552445308 0.531563050 +0.404692082 0.551935134 0.531237537 +0.405669599 0.551422112 0.530912023 +0.406647116 0.550907660 0.530586510 +0.407624633 0.550392969 0.530260997 +0.408602151 0.549878039 0.529935484 +0.409579668 0.549362870 0.529609971 +0.410557185 0.548847462 0.529284457 +0.411534702 0.548331815 0.528958944 +0.412512219 0.547815928 0.528633431 +0.413489736 0.547299802 0.528307918 +0.414467253 0.546783436 0.527982405 +0.415444770 0.546265287 0.527656891 +0.416422287 0.545745069 0.527331378 +0.417399804 0.545224637 0.527005865 +0.418377322 0.544703989 0.526680352 +0.419354839 0.544183126 0.526354839 +0.420332356 0.543662048 0.526029326 +0.421309873 0.543140754 0.525703812 +0.422287390 0.542619244 0.525378299 +0.423264907 0.542097518 0.525052786 +0.424242424 0.541575577 0.524727273 +0.425219941 0.541052744 0.524401760 +0.426197458 0.540527383 0.524076246 +0.427174976 0.540001832 0.523750733 +0.428152493 0.539476090 0.523425220 +0.429130010 0.538950158 0.523099707 +0.430107527 0.538424035 0.522774194 +0.431085044 0.537897722 0.522448680 +0.432062561 0.537371217 0.522123167 +0.433040078 0.536844521 0.521797654 +0.434017595 0.536317635 0.521472141 +0.434995112 0.535790557 0.521146628 +0.435972630 0.535260701 0.520821114 +0.436950147 0.534730668 0.520495601 +0.437927664 0.534200469 0.520170088 +0.438905181 0.533670106 0.519844575 +0.439882698 0.533139577 0.519519062 +0.440860215 0.532608883 0.519193548 +0.441837732 0.532078024 0.518868035 +0.442815249 0.531546999 0.518542522 +0.443792766 0.531015810 0.518217009 +0.444770283 0.530484454 0.517891496 +0.445747801 0.529951246 0.517565982 +0.446725318 0.529417377 0.517240469 +0.447702835 0.528883370 0.516914956 +0.448680352 0.528349224 0.516589443 +0.449657869 0.527814939 0.516263930 +0.450635386 0.527280516 0.515938416 +0.451612903 0.526745953 0.515612903 +0.452590420 0.526211252 0.515287390 +0.453567937 0.525676412 0.514961877 +0.454545455 0.525141432 0.514636364 +0.455522972 0.524605346 0.514310850 +0.456500489 0.524068300 0.513985337 +0.457478006 0.523531142 0.513659824 +0.458455523 0.522993872 0.513334311 +0.459433040 0.522456490 0.513008798 +0.460410557 0.521918997 0.512683284 +0.461388074 0.521381392 0.512357771 +0.462365591 0.520843675 0.512032258 +0.463343109 0.520305846 0.511706745 +0.464320626 0.519767905 0.511381232 +0.465298143 0.519229421 0.511055718 +0.466275660 0.518689863 0.510730205 +0.467253177 0.518150220 0.510404692 +0.468230694 0.517610493 0.510079179 +0.469208211 0.517070682 0.509753666 +0.470185728 0.516530787 0.509428152 +0.471163245 0.515990807 0.509102639 +0.472140762 0.515450743 0.508777126 +0.473118280 0.514910594 0.508451613 +0.474095797 0.514370361 0.508126100 +0.475073314 0.513829968 0.507800587 +0.476050831 0.513288569 0.507475073 +0.477028348 0.512747115 0.507149560 +0.478005865 0.512205604 0.506824047 +0.478983382 0.511664036 0.506498534 +0.479960899 0.511122412 0.506173021 +0.480938416 0.510580732 0.505847507 +0.481915934 0.510038995 0.505521994 +0.482893451 0.509497202 0.505196481 +0.483870968 0.508955352 0.504870968 +0.484848485 0.508413446 0.504545455 +0.485826002 0.507870980 0.504219941 +0.486803519 0.507328390 0.503894428 +0.487781036 0.506785773 0.503568915 +0.488758553 0.506243127 0.503243402 +0.489736070 0.505700453 0.502917889 +0.490713587 0.505157751 0.502592375 +0.491691105 0.504615020 0.502266862 +0.492668622 0.504072261 0.501941349 +0.493646139 0.503529474 0.501615836 +0.494623656 0.502986658 0.501290323 +0.495601173 0.502443695 0.500964809 +0.496578690 0.501900652 0.500639296 +0.497556207 0.501357608 0.500313783 +0.498533724 0.500814565 0.499988270 +0.499511241 0.500271522 0.499662757 +0.500488759 0.499728478 0.499337243 +0.501466276 0.499185435 0.499011730 +0.502443793 0.498642392 0.498686217 +0.503421310 0.498099348 0.498360704 +0.504398827 0.497556305 0.498035191 +0.505376344 0.497013342 0.497709677 +0.506353861 0.496470526 0.497384164 +0.507331378 0.495927739 0.497058651 +0.508308895 0.495384980 0.496733138 +0.509286413 0.494842249 0.496407625 +0.510263930 0.494299547 0.496082111 +0.511241447 0.493756873 0.495756598 +0.512218964 0.493214227 0.495431085 +0.513196481 0.492671610 0.495105572 +0.514173998 0.492129020 0.494780059 +0.515151515 0.491586554 0.494454545 +0.516129032 0.491044648 0.494129032 +0.517106549 0.490502798 0.493803519 +0.518084066 0.489961005 0.493478006 +0.519061584 0.489419268 0.493152493 +0.520039101 0.488877588 0.492826979 +0.521016618 0.488335964 0.492501466 +0.521994135 0.487794396 0.492175953 +0.522971652 0.487252885 0.491850440 +0.523949169 0.486711431 0.491524927 +0.524926686 0.486170032 0.491199413 +0.525904203 0.485629639 0.490873900 +0.526881720 0.485089406 0.490548387 +0.527859238 0.484549257 0.490222874 +0.528836755 0.484009193 0.489897361 +0.529814272 0.483469213 0.489571848 +0.530791789 0.482929318 0.489246334 +0.531769306 0.482389507 0.488920821 +0.532746823 0.481849780 0.488595308 +0.533724340 0.481310137 0.488269795 +0.534701857 0.480770579 0.487944282 +0.535679374 0.480232095 0.487618768 +0.536656891 0.479694154 0.487293255 +0.537634409 0.479156325 0.486967742 +0.538611926 0.478618608 0.486642229 +0.539589443 0.478081003 0.486316716 +0.540566960 0.477543510 0.485991202 +0.541544477 0.477006128 0.485665689 +0.542521994 0.476468858 0.485340176 +0.543499511 0.475931700 0.485014663 +0.544477028 0.475394654 0.484689150 +0.545454545 0.474858568 0.484363636 +0.546432063 0.474323588 0.484038123 +0.547409580 0.473788748 0.483712610 +0.548387097 0.473254047 0.483387097 +0.549364614 0.472719484 0.483061584 +0.550342131 0.472185061 0.482736070 +0.551319648 0.471650776 0.482410557 +0.552297165 0.471116630 0.482085044 +0.553274682 0.470582623 0.481759531 +0.554252199 0.470048754 0.481434018 +0.555229717 0.469515546 0.481108504 +0.556207234 0.468984190 0.480782991 +0.557184751 0.468453001 0.480457478 +0.558162268 0.467921976 0.480131965 +0.559139785 0.467391117 0.479806452 +0.560117302 0.466860423 0.479480938 +0.561094819 0.466329894 0.479155425 +0.562072336 0.465799531 0.478829912 +0.563049853 0.465269332 0.478504399 +0.564027370 0.464739299 0.478178886 +0.565004888 0.464209443 0.477853372 +0.565982405 0.463682365 0.477527859 +0.566959922 0.463155479 0.477202346 +0.567937439 0.462628783 0.476876833 +0.568914956 0.462102278 0.476551320 +0.569892473 0.461575965 0.476225806 +0.570869990 0.461049842 0.475900293 +0.571847507 0.460523910 0.475574780 +0.572825024 0.459998168 0.475249267 +0.573802542 0.459472617 0.474923754 +0.574780059 0.458947256 0.474598240 +0.575757576 0.458424423 0.474272727 +0.576735093 0.457902482 0.473947214 +0.577712610 0.457380756 0.473621701 +0.578690127 0.456859246 0.473296188 +0.579667644 0.456337952 0.472970674 +0.580645161 0.455816874 0.472645161 +0.581622678 0.455296011 0.472319648 +0.582600196 0.454775363 0.471994135 +0.583577713 0.454254931 0.471668622 +0.584555230 0.453734713 0.471343109 +0.585532747 0.453216564 0.471017595 +0.586510264 0.452700198 0.470692082 +0.587487781 0.452184072 0.470366569 +0.588465298 0.451668185 0.470041056 +0.589442815 0.451152538 0.469715543 +0.590420332 0.450637130 0.469390029 +0.591397849 0.450121961 0.469064516 +0.592375367 0.449607031 0.468739003 +0.593352884 0.449092340 0.468413490 +0.594330401 0.448577888 0.468087977 +0.595307918 0.448064866 0.467762463 +0.596285435 0.447554692 0.467436950 +0.597262952 0.447044779 0.467111437 +0.598240469 0.446535130 0.466785924 +0.599217986 0.446025742 0.466460411 +0.600195503 0.445516617 0.466134897 +0.601173021 0.445007753 0.465809384 +0.602150538 0.444499152 0.465483871 +0.603128055 0.443990811 0.465158358 +0.604105572 0.443482732 0.464832845 +0.605083089 0.442975268 0.464507331 +0.606060606 0.442471886 0.464181818 +0.607038123 0.441968788 0.463856305 +0.608015640 0.441465974 0.463530792 +0.608993157 0.440963445 0.463205279 +0.609970674 0.440461199 0.462879765 +0.610948192 0.439959236 0.462554252 +0.611925709 0.439457556 0.462228739 +0.612903226 0.438956160 0.461903226 +0.613880743 0.438455046 0.461577713 +0.614858260 0.437954214 0.461252199 +0.615835777 0.437457552 0.460926686 +0.616813294 0.436961853 0.460601173 +0.617790811 0.436466458 0.460275660 +0.618768328 0.435971367 0.459950147 +0.619745846 0.435476580 0.459624633 +0.620723363 0.434982097 0.459299120 +0.621700880 0.434487917 0.458973607 +0.622678397 0.433994040 0.458648094 +0.623655914 0.433500466 0.458322581 +0.624633431 0.433007195 0.457997067 +0.625610948 0.432517297 0.457671554 +0.626588465 0.432029562 0.457346041 +0.627565982 0.431542151 0.457020528 +0.628543500 0.431055062 0.456695015 +0.629521017 0.430568297 0.456369501 +0.630498534 0.430081854 0.456043988 +0.631476051 0.429595733 0.455718475 +0.632453568 0.429109935 0.455392962 +0.633431085 0.428624458 0.455067449 +0.634408602 0.428139302 0.454741935 +0.635386119 0.427656551 0.454416422 +0.636363636 0.427177328 0.454090909 +0.637341153 0.426698446 0.453765396 +0.638318671 0.426219904 0.453439883 +0.639296188 0.425741703 0.453114370 +0.640273705 0.425263842 0.452788856 +0.641251222 0.424786321 0.452463343 +0.642228739 0.424309140 0.452137830 +0.643206256 0.423832297 0.451812317 +0.644183773 0.423355793 0.451486804 +0.645161290 0.422880556 0.451161290 +0.646138807 0.422410372 0.450835777 +0.647116325 0.421940545 0.450510264 +0.648093842 0.421471075 0.450184751 +0.649071359 0.421001962 0.449859238 +0.650048876 0.420533205 0.449533724 +0.651026393 0.420064803 0.449208211 +0.652003910 0.419596757 0.448882698 +0.652981427 0.419129066 0.448557185 +0.653958944 0.418661730 0.448231672 +0.654936461 0.418194747 0.447906158 +0.655913978 0.417733720 0.447580645 +0.656891496 0.417273454 0.447255132 +0.657869013 0.416813559 0.446929619 +0.658846530 0.416354035 0.446604106 +0.659824047 0.415894883 0.446278592 +0.660801564 0.415436100 0.445953079 +0.661779081 0.414977687 0.445627566 +0.662756598 0.414519643 0.445302053 +0.663734115 0.414061969 0.444976540 +0.664711632 0.413604663 0.444651026 +0.665689150 0.413152189 0.444325513 +0.666666667 0.412701967 0.444000000 +0.667644184 0.412252130 0.443674487 +0.668621701 0.411802676 0.443348974 +0.669599218 0.411353606 0.443023460 +0.670576735 0.410904919 0.442697947 +0.671554252 0.410456615 0.442372434 +0.672531769 0.410008693 0.442046921 +0.673509286 0.409561153 0.441721408 +0.674486804 0.409113994 0.441395894 +0.675464321 0.408670383 0.441070381 +0.676441838 0.408230666 0.440744868 +0.677419355 0.407791345 0.440419355 +0.678396872 0.407352419 0.440093842 +0.679374389 0.406913888 0.439768328 +0.680351906 0.406475752 0.439442815 +0.681329423 0.406038009 0.439117302 +0.682306940 0.405600660 0.438791789 +0.683284457 0.405163704 0.438466276 +0.684261975 0.404727140 0.438140762 +0.685239492 0.404292682 0.437815249 +0.686217009 0.403863908 0.437489736 +0.687194526 0.403435540 0.437164223 +0.688172043 0.403007576 0.436838710 +0.689149560 0.402580018 0.436513196 +0.690127077 0.402152863 0.436187683 +0.691104594 0.401726112 0.435862170 +0.692082111 0.401299764 0.435536657 +0.693059629 0.400873818 0.435211144 +0.694037146 0.400448274 0.434885630 +0.695014663 0.400023241 0.434560117 +0.695992180 0.399605824 0.434234604 +0.696969697 0.399188821 0.433909091 +0.697947214 0.398772231 0.433583578 +0.698924731 0.398356053 0.433258065 +0.699902248 0.397940288 0.432932551 +0.700879765 0.397524934 0.432607038 +0.701857283 0.397109991 0.432281525 +0.702834800 0.396695458 0.431956012 +0.703812317 0.396281335 0.431630499 +0.704789834 0.395867620 0.431304985 +0.705767351 0.395460310 0.430979472 +0.706744868 0.395055060 0.430653959 +0.707722385 0.394650230 0.430328446 +0.708699902 0.394245820 0.430002933 +0.709677419 0.393841827 0.429677419 +0.710654936 0.393438252 0.429351906 +0.711632454 0.393035094 0.429026393 +0.712609971 0.392632352 0.428700880 +0.713587488 0.392230026 0.428375367 +0.714565005 0.391828114 0.428049853 +0.715542522 0.391431026 0.427724340 +0.716520039 0.391037894 0.427398827 +0.717497556 0.390645187 0.427073314 +0.718475073 0.390252903 0.426747801 +0.719452590 0.389861041 0.426422287 +0.720430108 0.389469602 0.426096774 +0.721407625 0.389078585 0.425771261 +0.722385142 0.388687988 0.425445748 +0.723362659 0.388297811 0.425120235 +0.724340176 0.387908053 0.424794721 +0.725317693 0.387521392 0.424469208 +0.726295210 0.387140718 0.424143695 +0.727272727 0.386760470 0.423818182 +0.728250244 0.386380649 0.423492669 +0.729227761 0.386001253 0.423167155 +0.730205279 0.385622282 0.422841642 +0.731182796 0.385243736 0.422516129 +0.732160313 0.384865613 0.422190616 +0.733137830 0.384487912 0.421865103 +0.734115347 0.384110634 0.421539589 +0.735092864 0.383734587 0.421214076 +0.736070381 0.383366684 0.420888563 +0.737047898 0.382999209 0.420563050 +0.738025415 0.382632161 0.420237537 +0.739002933 0.382265540 0.419912023 +0.739980450 0.381899345 0.419586510 +0.740957967 0.381533576 0.419260997 +0.741935484 0.381168231 0.418935484 +0.742913001 0.380803309 0.418609971 +0.743890518 0.380438811 0.418284457 +0.744868035 0.380074735 0.417958944 +0.745845552 0.379718703 0.417633431 +0.746823069 0.379364288 0.417307918 +0.747800587 0.379010300 0.416982405 +0.748778104 0.378656739 0.416656891 +0.749755621 0.378303602 0.416331378 +0.750733138 0.377950891 0.416005865 +0.751710655 0.377598603 0.415680352 +0.752688172 0.377246738 0.415354839 +0.753665689 0.376895296 0.415029326 +0.754643206 0.376544275 0.414703812 +0.755620723 0.376199443 0.414378299 +0.756598240 0.375858351 0.414052786 +0.757575758 0.375517684 0.413727273 +0.758553275 0.375177441 0.413401760 +0.759530792 0.374837621 0.413076246 +0.760508309 0.374498223 0.412750733 +0.761485826 0.374159247 0.412425220 +0.762463343 0.373820692 0.412099707 +0.763440860 0.373482557 0.411774194 +0.764418377 0.373144841 0.411448680 +0.765395894 0.372811329 0.411123167 +0.766373412 0.372483798 0.410797654 +0.767350929 0.372156688 0.410472141 +0.768328446 0.371829998 0.410146628 +0.769305963 0.371503728 0.409821114 +0.770283480 0.371177875 0.409495601 +0.771260997 0.370852441 0.409170088 +0.772238514 0.370527424 0.408844575 +0.773216031 0.370202822 0.408519062 +0.774193548 0.369878636 0.408193548 +0.775171065 0.369556545 0.407868035 +0.776148583 0.369242788 0.407542522 +0.777126100 0.368929447 0.407217009 +0.778103617 0.368616521 0.406891496 +0.779081134 0.368304008 0.406565982 +0.780058651 0.367991909 0.406240469 +0.781036168 0.367680221 0.405914956 +0.782013685 0.367368945 0.405589443 +0.782991202 0.367058080 0.405263930 +0.783968719 0.366747624 0.404938416 +0.784946237 0.366437577 0.404612903 +0.785923754 0.366137243 0.404287390 +0.786901271 0.365837858 0.403961877 +0.787878788 0.365538882 0.403636364 +0.788856305 0.365240312 0.403310850 +0.789833822 0.364942147 0.402985337 +0.790811339 0.364644388 0.402659824 +0.791788856 0.364347034 0.402334311 +0.792766373 0.364050082 0.402008798 +0.793743891 0.363753534 0.401683284 +0.794721408 0.363457387 0.401357771 +0.795698925 0.363168850 0.401032258 +0.796676442 0.362883585 0.400706745 +0.797653959 0.362598720 0.400381232 +0.798631476 0.362314253 0.400055718 +0.799608993 0.362030183 0.399730205 +0.800586510 0.361746510 0.399404692 +0.801564027 0.361463233 0.399079179 +0.802541544 0.361180350 0.398753666 +0.803519062 0.360897862 0.398428152 +0.804496579 0.360615767 0.398102639 +0.805474096 0.360339063 0.397777126 +0.806451613 0.360068060 0.397451613 +0.807429130 0.359797445 0.397126100 +0.808406647 0.359527218 0.396800587 +0.809384164 0.359257379 0.396475073 +0.810361681 0.358987926 0.396149560 +0.811339198 0.358718858 0.395824047 +0.812316716 0.358450176 0.395498534 +0.813294233 0.358181877 0.395173021 +0.814271750 0.357913962 0.394847507 +0.815249267 0.357649114 0.394521994 +0.816226784 0.357392487 0.394196481 +0.817204301 0.357136239 0.393870968 +0.818181818 0.356880367 0.393545455 +0.819159335 0.356624870 0.393219941 +0.820136852 0.356369749 0.392894428 +0.821114370 0.356115002 0.392568915 +0.822091887 0.355860628 0.392243402 +0.823069404 0.355606627 0.391917889 +0.824046921 0.355352998 0.391592375 +0.825024438 0.355100007 0.391266862 +0.826001955 0.354857853 0.390941349 +0.826979472 0.354616064 0.390615836 +0.827956989 0.354374639 0.390290323 +0.828934506 0.354133576 0.389964809 +0.829912023 0.353892876 0.389639296 +0.830889541 0.353652537 0.389313783 +0.831867058 0.353412559 0.388988270 +0.832844575 0.353172940 0.388662757 +0.833822092 0.352933680 0.388337243 +0.834799609 0.352694779 0.388011730 +0.835777126 0.352464927 0.387686217 +0.836754643 0.352237669 0.387360704 +0.837732160 0.352010761 0.387035191 +0.838709677 0.351784201 0.386709677 +0.839687195 0.351557989 0.386384164 +0.840664712 0.351332125 0.386058651 +0.841642229 0.351106607 0.385733138 +0.842619746 0.350881434 0.385407625 +0.843597263 0.350656607 0.385082111 +0.844574780 0.350432123 0.384756598 +0.845552297 0.350214269 0.384431085 +0.846529814 0.350001593 0.384105572 +0.847507331 0.349789250 0.383780059 +0.848484848 0.349577241 0.383454545 +0.849462366 0.349365564 0.383129032 +0.850439883 0.349154220 0.382803519 +0.851417400 0.348943206 0.382478006 +0.852394917 0.348732523 0.382152493 +0.853372434 0.348522169 0.381826979 +0.854349951 0.348312145 0.381501466 +0.855327468 0.348106237 0.381175953 +0.856304985 0.347908171 0.380850440 +0.857282502 0.347710423 0.380524927 +0.858260020 0.347512992 0.380199413 +0.859237537 0.347315877 0.379873900 +0.860215054 0.347119078 0.379548387 +0.861192571 0.346922593 0.379222874 +0.862170088 0.346726422 0.378897361 +0.863147605 0.346530564 0.378571848 +0.864125122 0.346335018 0.378246334 +0.865102639 0.346140990 0.377920821 +0.866080156 0.345957546 0.377595308 +0.867057674 0.345774402 0.377269795 +0.868035191 0.345591557 0.376944282 +0.869012708 0.345409010 0.376618768 +0.869990225 0.345226762 0.376293255 +0.870967742 0.345044810 0.375967742 +0.871945259 0.344863155 0.375642229 +0.872922776 0.344681795 0.375316716 +0.873900293 0.344500730 0.374991202 +0.874877810 0.344319959 0.374665689 +0.875855327 0.344149671 0.374340176 +0.876832845 0.343981121 0.374014663 +0.877810362 0.343812851 0.373689150 +0.878787879 0.343644861 0.373363636 +0.879765396 0.343477150 0.373038123 +0.880742913 0.343309718 0.372712610 +0.881720430 0.343142563 0.372387097 +0.882697947 0.342975685 0.372061584 +0.883675464 0.342809084 0.371736070 +0.884652981 0.342642758 0.371410557 +0.885630499 0.342484320 0.371085044 +0.886608016 0.342330335 0.370759531 +0.887585533 0.342176611 0.370434018 +0.888563050 0.342023148 0.370108504 +0.889540567 0.341869943 0.369782991 +0.890518084 0.341716998 0.369457478 +0.891495601 0.341564311 0.369131965 +0.892473118 0.341411881 0.368806452 +0.893450635 0.341259709 0.368480938 +0.894428152 0.341107792 0.368155425 +0.895405670 0.340961091 0.367829912 +0.896383187 0.340821627 0.367504399 +0.897360704 0.340682403 0.367178886 +0.898338221 0.340543418 0.366853372 +0.899315738 0.340404672 0.366527859 +0.900293255 0.340266165 0.366202346 +0.901270772 0.340127896 0.365876833 +0.902248289 0.339989864 0.365551320 +0.903225806 0.339852068 0.365225806 +0.904203324 0.339714508 0.364900293 +0.905180841 0.339579421 0.364574780 +0.906158358 0.339454415 0.364249267 +0.907135875 0.339329627 0.363923754 +0.908113392 0.339205058 0.363598240 +0.909090909 0.339080706 0.363272727 +0.910068426 0.338956572 0.362947214 +0.911045943 0.338832654 0.362621701 +0.912023460 0.338708952 0.362296188 +0.913000978 0.338585466 0.361970674 +0.913978495 0.338462194 0.361645161 +0.914956012 0.338339137 0.361319648 +0.915933529 0.338227961 0.360994135 +0.916911046 0.338117532 0.360668622 +0.917888563 0.338007299 0.360343109 +0.918866080 0.337897261 0.360017595 +0.919843597 0.337787419 0.359692082 +0.920821114 0.337677771 0.359366569 +0.921798631 0.337568317 0.359041056 +0.922776149 0.337459057 0.358715543 +0.923753666 0.337349989 0.358390029 +0.924731183 0.337241115 0.358064516 +0.925708700 0.337141380 0.357739003 +0.926686217 0.337045215 0.357413490 +0.927663734 0.336949224 0.357087977 +0.928641251 0.336853406 0.356762463 +0.929618768 0.336757760 0.356436950 +0.930596285 0.336662286 0.356111437 +0.931573803 0.336566984 0.355785924 +0.932551320 0.336471852 0.355460411 +0.933528837 0.336376891 0.355134897 +0.934506354 0.336282100 0.354809384 +0.935483871 0.336193646 0.354483871 +0.936461388 0.336111639 0.354158358 +0.937438905 0.336029782 0.353832845 +0.938416422 0.335948074 0.353507331 +0.939393939 0.335866515 0.353181818 +0.940371457 0.335785105 0.352856305 +0.941348974 0.335703844 0.352530792 +0.942326491 0.335622730 0.352205279 +0.943304008 0.335541763 0.351879765 +0.944281525 0.335460944 0.351554252 +0.945259042 0.335383602 0.351228739 +0.946236559 0.335315631 0.350903226 +0.947214076 0.335247787 0.350577713 +0.948191593 0.335180068 0.350252199 +0.949169110 0.335112475 0.349926686 +0.950146628 0.335045006 0.349601173 +0.951124145 0.334977661 0.349275660 +0.952101662 0.334910441 0.348950147 +0.953079179 0.334843345 0.348624633 +0.954056696 0.334776372 0.348299120 +0.955034213 0.334709966 0.347973607 +0.956011730 0.334655899 0.347648094 +0.956989247 0.334601934 0.347322581 +0.957966764 0.334548070 0.346997067 +0.958944282 0.334494307 0.346671554 +0.959921799 0.334440645 0.346346041 +0.960899316 0.334387083 0.346020528 +0.961876833 0.334333620 0.345695015 +0.962854350 0.334280258 0.345369501 +0.963831867 0.334226995 0.345043988 +0.964809384 0.334173831 0.344718475 +0.965786901 0.334131034 0.344392962 +0.966764418 0.334090804 0.344067449 +0.967741935 0.334050649 0.343741935 +0.968719453 0.334010571 0.343416422 +0.969696970 0.333970568 0.343090909 +0.970674487 0.333930642 0.342765396 +0.971652004 0.333890791 0.342439883 +0.972629521 0.333851014 0.342114370 +0.973607038 0.333811314 0.341788856 +0.974584555 0.333771687 0.341463343 +0.975562072 0.333739521 0.341137830 +0.976539589 0.333712869 0.340812317 +0.977517107 0.333686268 0.340486804 +0.978494624 0.333659718 0.340161290 +0.979472141 0.333633219 0.339835777 +0.980449658 0.333606771 0.339510264 +0.981427175 0.333580374 0.339184751 +0.982404692 0.333554026 0.338859238 +0.983382209 0.333527729 0.338533724 +0.984359726 0.333501482 0.338208211 +0.985337243 0.333479745 0.337882698 +0.986314761 0.333466506 0.337557185 +0.987292278 0.333453293 0.337231672 +0.988269795 0.333440106 0.336906158 +0.989247312 0.333426944 0.336580645 +0.990224829 0.333413807 0.336255132 +0.991202346 0.333400697 0.335929619 +0.992179863 0.333387611 0.335604106 +0.993157380 0.333374550 0.335278592 +0.994134897 0.333361515 0.334953079 +0.995112414 0.333350000 0.334627566 +0.996089932 0.333350000 0.334302053 +0.997067449 0.333350000 0.333976540 +0.998044966 0.333350000 0.333651026 +0.999022483 0.333350000 0.333325513 +1.000000000 0.333350000 0.333000000 diff --git a/examples/hybrid/ObstacleAvoidance.fll b/examples/hybrid/ObstacleAvoidance.fll new file mode 100644 index 0000000..970221b --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.fll @@ -0,0 +1,43 @@ +Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left
\ No newline at end of file diff --git a/examples/hybrid/ObstacleAvoidance.java b/examples/hybrid/ObstacleAvoidance.java new file mode 100644 index 0000000..8196670 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.java @@ -0,0 +1,86 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class ObstacleAvoidance{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("ObstacleAvoidance"); +engine.setDescription(""); + +InputVariable obstacle = new InputVariable(); +obstacle.setName("obstacle"); +obstacle.setDescription(""); +obstacle.setEnabled(true); +obstacle.setRange(0.000, 1.000); +obstacle.setLockValueInRange(false); +obstacle.addTerm(new Ramp("left", 1.000, 0.000)); +obstacle.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addInputVariable(obstacle); + +OutputVariable mSteer = new OutputVariable(); +mSteer.setName("mSteer"); +mSteer.setDescription(""); +mSteer.setEnabled(true); +mSteer.setRange(0.000, 1.000); +mSteer.setLockValueInRange(false); +mSteer.setAggregation(new Maximum()); +mSteer.setDefuzzifier(new Centroid(100)); +mSteer.setDefaultValue(Double.NaN); +mSteer.setLockPreviousValue(false); +mSteer.addTerm(new Ramp("left", 1.000, 0.000)); +mSteer.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addOutputVariable(mSteer); + +OutputVariable tsSteer = new OutputVariable(); +tsSteer.setName("tsSteer"); +tsSteer.setDescription(""); +tsSteer.setEnabled(true); +tsSteer.setRange(0.000, 1.000); +tsSteer.setLockValueInRange(false); +tsSteer.setAggregation(new Maximum()); +tsSteer.setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer.setDefaultValue(Double.NaN); +tsSteer.setLockPreviousValue(false); +tsSteer.addTerm(new Constant("left", 0.333)); +tsSteer.addTerm(new Constant("right", 0.666)); +engine.addOutputVariable(tsSteer); + +RuleBlock mamdani = new RuleBlock(); +mamdani.setName("mamdani"); +mamdani.setDescription(""); +mamdani.setEnabled(true); +mamdani.setConjunction(null); +mamdani.setDisjunction(null); +mamdani.setImplication(new AlgebraicProduct()); +mamdani.setActivation(new General()); +mamdani.addRule(Rule.parse("if obstacle is left then mSteer is right", engine)); +mamdani.addRule(Rule.parse("if obstacle is right then mSteer is left", engine)); +engine.addRuleBlock(mamdani); + +RuleBlock takagiSugeno = new RuleBlock(); +takagiSugeno.setName("takagiSugeno"); +takagiSugeno.setDescription(""); +takagiSugeno.setEnabled(true); +takagiSugeno.setConjunction(null); +takagiSugeno.setDisjunction(null); +takagiSugeno.setImplication(null); +takagiSugeno.setActivation(new General()); +takagiSugeno.addRule(Rule.parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno.addRule(Rule.parse("if obstacle is right then tsSteer is left", engine)); +engine.addRuleBlock(takagiSugeno); + + +} +} diff --git a/examples/hybrid/ObstacleAvoidance.pdf b/examples/hybrid/ObstacleAvoidance.pdf Binary files differnew file mode 100644 index 0000000..ad74e68 --- /dev/null +++ b/examples/hybrid/ObstacleAvoidance.pdf diff --git a/examples/hybrid/tipper.R b/examples/hybrid/tipper.R new file mode 100644 index 0000000..ba11351 --- /dev/null +++ b/examples/hybrid/tipper.R @@ -0,0 +1,109 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "tipper" +engine.description = "(service and food) -> (tip)" +engine.fll = "Engine: tipper +description: (service and food) -> (tip) +InputVariable: service + description: quality of service + enabled: true + range: 0.000 10.000 + lock-range: true + term: poor Trapezoid 0.000 0.000 2.500 5.000 + term: good Triangle 2.500 5.000 7.500 + term: excellent Trapezoid 5.000 7.500 10.000 10.000 +InputVariable: food + description: quality of food + enabled: true + range: 0.000 10.000 + lock-range: true + term: rancid Trapezoid 0.000 0.000 2.500 7.500 + term: delicious Trapezoid 2.500 7.500 10.000 10.000 +OutputVariable: mTip + description: tip based on Mamdani inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: cheap Triangle 0.000 5.000 10.000 + term: average Triangle 10.000 15.000 20.000 + term: generous Triangle 20.000 25.000 30.000 +OutputVariable: tsTip + description: tip based on Takagi-Sugeno inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: cheap Constant 5.000 + term: average Constant 15.000 + term: generous Constant 25.000 +RuleBlock: mamdani + description: Mamdani inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: Minimum + activation: General + rule: if service is poor or food is rancid then mTip is cheap + rule: if service is good then mTip is average + rule: if service is excellent or food is delicious then mTip is generous with 0.5 + rule: if service is excellent and food is delicious then mTip is generous with 1.0 +RuleBlock: takagiSugeno + description: Takagi-Sugeno inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: none + activation: General + rule: if service is poor or food is rancid then tsTip is cheap + rule: if service is good then tsTip is average + rule: if service is excellent or food is delicious then tsTip is generous with 0.5 + rule: if service is excellent and food is delicious then tsTip is generous with 1.0" + +engine.fldFile = "tipper.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(service, food)) + + geom_tile(aes(fill=mTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=service, y=food, z=mTip), color="black") + + ggtitle("(service, food) = mTip") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(food, service)) + + geom_tile(aes(fill=mTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=food, y=service, z=mTip), color="black") + + ggtitle("(food, service) = mTip") + +engine.plot.i1i2_o2 = ggplot(engine.df, aes(service, food)) + + geom_tile(aes(fill=tsTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=service, y=food, z=tsTip), color="black") + + ggtitle("(service, food) = tsTip") + +engine.plot.i2i1_o2 = ggplot(engine.df, aes(food, service)) + + geom_tile(aes(fill=tsTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=food, y=service, z=tsTip), color="black") + + ggtitle("(food, service) = tsTip") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, engine.plot.i1i2_o2, engine.plot.i2i1_o2, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/hybrid/tipper.cpp b/examples/hybrid/tipper.cpp new file mode 100644 index 0000000..57bcc78 --- /dev/null +++ b/examples/hybrid/tipper.cpp @@ -0,0 +1,92 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("tipper"); +engine->setDescription("(service and food) -> (tip)"); + +InputVariable* service = new InputVariable; +service->setName("service"); +service->setDescription("quality of service"); +service->setEnabled(true); +service->setRange(0.000, 10.000); +service->setLockValueInRange(true); +service->addTerm(new Trapezoid("poor", 0.000, 0.000, 2.500, 5.000)); +service->addTerm(new Triangle("good", 2.500, 5.000, 7.500)); +service->addTerm(new Trapezoid("excellent", 5.000, 7.500, 10.000, 10.000)); +engine->addInputVariable(service); + +InputVariable* food = new InputVariable; +food->setName("food"); +food->setDescription("quality of food"); +food->setEnabled(true); +food->setRange(0.000, 10.000); +food->setLockValueInRange(true); +food->addTerm(new Trapezoid("rancid", 0.000, 0.000, 2.500, 7.500)); +food->addTerm(new Trapezoid("delicious", 2.500, 7.500, 10.000, 10.000)); +engine->addInputVariable(food); + +OutputVariable* mTip = new OutputVariable; +mTip->setName("mTip"); +mTip->setDescription("tip based on Mamdani inference"); +mTip->setEnabled(true); +mTip->setRange(0.000, 30.000); +mTip->setLockValueInRange(false); +mTip->setAggregation(new Maximum); +mTip->setDefuzzifier(new Centroid(100)); +mTip->setDefaultValue(fl::nan); +mTip->setLockPreviousValue(false); +mTip->addTerm(new Triangle("cheap", 0.000, 5.000, 10.000)); +mTip->addTerm(new Triangle("average", 10.000, 15.000, 20.000)); +mTip->addTerm(new Triangle("generous", 20.000, 25.000, 30.000)); +engine->addOutputVariable(mTip); + +OutputVariable* tsTip = new OutputVariable; +tsTip->setName("tsTip"); +tsTip->setDescription("tip based on Takagi-Sugeno inference"); +tsTip->setEnabled(true); +tsTip->setRange(0.000, 30.000); +tsTip->setLockValueInRange(false); +tsTip->setAggregation(fl::null); +tsTip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +tsTip->setDefaultValue(fl::nan); +tsTip->setLockPreviousValue(false); +tsTip->addTerm(new Constant("cheap", 5.000)); +tsTip->addTerm(new Constant("average", 15.000)); +tsTip->addTerm(new Constant("generous", 25.000)); +engine->addOutputVariable(tsTip); + +RuleBlock* mamdani = new RuleBlock; +mamdani->setName("mamdani"); +mamdani->setDescription("Mamdani inference"); +mamdani->setEnabled(true); +mamdani->setConjunction(new AlgebraicProduct); +mamdani->setDisjunction(new AlgebraicSum); +mamdani->setImplication(new Minimum); +mamdani->setActivation(new General); +mamdani->addRule(Rule::parse("if service is poor or food is rancid then mTip is cheap", engine)); +mamdani->addRule(Rule::parse("if service is good then mTip is average", engine)); +mamdani->addRule(Rule::parse("if service is excellent or food is delicious then mTip is generous with 0.5", engine)); +mamdani->addRule(Rule::parse("if service is excellent and food is delicious then mTip is generous with 1.0", engine)); +engine->addRuleBlock(mamdani); + +RuleBlock* takagiSugeno = new RuleBlock; +takagiSugeno->setName("takagiSugeno"); +takagiSugeno->setDescription("Takagi-Sugeno inference"); +takagiSugeno->setEnabled(true); +takagiSugeno->setConjunction(new AlgebraicProduct); +takagiSugeno->setDisjunction(new AlgebraicSum); +takagiSugeno->setImplication(fl::null); +takagiSugeno->setActivation(new General); +takagiSugeno->addRule(Rule::parse("if service is poor or food is rancid then tsTip is cheap", engine)); +takagiSugeno->addRule(Rule::parse("if service is good then tsTip is average", engine)); +takagiSugeno->addRule(Rule::parse("if service is excellent or food is delicious then tsTip is generous with 0.5", engine)); +takagiSugeno->addRule(Rule::parse("if service is excellent and food is delicious then tsTip is generous with 1.0", engine)); +engine->addRuleBlock(takagiSugeno); + + +} diff --git a/examples/hybrid/tipper.fcl b/examples/hybrid/tipper.fcl new file mode 100644 index 0000000..299dbb8 --- /dev/null +++ b/examples/hybrid/tipper.fcl @@ -0,0 +1,66 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK tipper + +VAR_INPUT + service: REAL; + food: REAL; +END_VAR + +VAR_OUTPUT + mTip: REAL; + tsTip: REAL; +END_VAR + +FUZZIFY service + RANGE := (0.000 .. 10.000); + TERM poor := Trapezoid 0.000 0.000 2.500 5.000; + TERM good := Triangle 2.500 5.000 7.500; + TERM excellent := Trapezoid 5.000 7.500 10.000 10.000; +END_FUZZIFY + +FUZZIFY food + RANGE := (0.000 .. 10.000); + TERM rancid := Trapezoid 0.000 0.000 2.500 7.500; + TERM delicious := Trapezoid 2.500 7.500 10.000 10.000; +END_FUZZIFY + +DEFUZZIFY mTip + RANGE := (0.000 .. 30.000); + TERM cheap := Triangle 0.000 5.000 10.000; + TERM average := Triangle 10.000 15.000 20.000; + TERM generous := Triangle 20.000 25.000 30.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY tsTip + RANGE := (0.000 .. 30.000); + TERM cheap := 5.000; + TERM average := 15.000; + TERM generous := 25.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK mamdani + AND : PROD; + OR : ASUM; + ACT : MIN; + RULE 1 : if service is poor or food is rancid then mTip is cheap + RULE 2 : if service is good then mTip is average + RULE 3 : if service is excellent or food is delicious then mTip is generous with 0.5 + RULE 4 : if service is excellent and food is delicious then mTip is generous with 1.0 +END_RULEBLOCK + +RULEBLOCK takagiSugeno + AND : PROD; + OR : ASUM; + RULE 1 : if service is poor or food is rancid then tsTip is cheap + RULE 2 : if service is good then tsTip is average + RULE 3 : if service is excellent or food is delicious then tsTip is generous with 0.5 + RULE 4 : if service is excellent and food is delicious then tsTip is generous with 1.0 +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/hybrid/tipper.fis b/examples/hybrid/tipper.fis new file mode 100644 index 0000000..abd850a --- /dev/null +++ b/examples/hybrid/tipper.fis @@ -0,0 +1,57 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='tipper' +Type='hybrid' +Version=6.0 +NumInputs=2 +NumOutputs=2 +NumRules=8 +AndMethod='prod' +OrMethod='probor' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='service' +Range=[0.000 10.000] +NumMFs=3 +MF1='poor':'trapmf',[0.000 0.000 2.500 5.000] +MF2='good':'trimf',[2.500 5.000 7.500] +MF3='excellent':'trapmf',[5.000 7.500 10.000 10.000] + +[Input2] +Name='food' +Range=[0.000 10.000] +NumMFs=2 +MF1='rancid':'trapmf',[0.000 0.000 2.500 7.500] +MF2='delicious':'trapmf',[2.500 7.500 10.000 10.000] + +[Output1] +Name='mTip' +Range=[0.000 30.000] +NumMFs=3 +MF1='cheap':'trimf',[0.000 5.000 10.000] +MF2='average':'trimf',[10.000 15.000 20.000] +MF3='generous':'trimf',[20.000 25.000 30.000] + +[Output2] +Name='tsTip' +Range=[0.000 30.000] +NumMFs=3 +MF1='cheap':'constant',[5.000] +MF2='average':'constant',[15.000] +MF3='generous':'constant',[25.000] + +[Rules] +# RuleBlock mamdani +1.000 1.000 , 1.000 0.000 (1.000) : 2 +2.000 0.000 , 2.000 0.000 (1.000) : 1 +3.000 2.000 , 3.000 0.000 (0.500) : 2 +3.000 2.000 , 3.000 0.000 (1.000) : 1 +# RuleBlock takagiSugeno +1.000 1.000 , 0.000 1.000 (1.000) : 2 +2.000 0.000 , 0.000 2.000 (1.000) : 1 +3.000 2.000 , 0.000 3.000 (0.500) : 2 +3.000 2.000 , 0.000 3.000 (1.000) : 1 diff --git a/examples/hybrid/tipper.fld b/examples/hybrid/tipper.fld new file mode 100644 index 0000000..7a8e29d --- /dev/null +++ b/examples/hybrid/tipper.fld @@ -0,0 +1,1025 @@ +service food mTip tsTip +0.000000000 0.000000000 4.998950210 5.000000000 +0.000000000 0.322580645 4.998950210 5.000000000 +0.000000000 0.645161290 4.998950210 5.000000000 +0.000000000 0.967741935 4.998950210 5.000000000 +0.000000000 1.290322581 4.998950210 5.000000000 +0.000000000 1.612903226 4.998950210 5.000000000 +0.000000000 1.935483871 4.998950210 5.000000000 +0.000000000 2.258064516 4.998950210 5.000000000 +0.000000000 2.580645161 5.314026132 5.160000000 +0.000000000 2.903225806 6.467756859 5.775193798 +0.000000000 3.225806452 7.452789474 6.353383459 +0.000000000 3.548387097 8.316896407 6.897810219 +0.000000000 3.870967742 9.067963620 7.411347518 +0.000000000 4.193548387 9.734585733 7.896551724 +0.000000000 4.516129032 10.322182298 8.355704698 +0.000000000 4.838709677 10.846060307 8.790849673 +0.000000000 5.161290323 11.316227524 9.203821656 +0.000000000 5.483870968 11.733949841 9.596273292 +0.000000000 5.806451613 12.115369655 9.969696970 +0.000000000 6.129032258 12.452152483 10.325443787 +0.000000000 6.451612903 12.762450565 10.664739884 +0.000000000 6.774193548 13.037607639 10.988700565 +0.000000000 7.096774194 13.291172539 11.298342541 +0.000000000 7.419354839 13.516499633 11.594594595 +0.000000000 7.741935484 13.570706205 11.666666667 +0.000000000 8.064516129 13.570706205 11.666666667 +0.000000000 8.387096774 13.570706205 11.666666667 +0.000000000 8.709677419 13.570706205 11.666666667 +0.000000000 9.032258065 13.570706205 11.666666667 +0.000000000 9.354838710 13.570706205 11.666666667 +0.000000000 9.677419355 13.570706205 11.666666667 +0.000000000 10.000000000 13.570706205 11.666666667 +0.322580645 0.000000000 4.998950210 5.000000000 +0.322580645 0.322580645 4.998950210 5.000000000 +0.322580645 0.645161290 4.998950210 5.000000000 +0.322580645 0.967741935 4.998950210 5.000000000 +0.322580645 1.290322581 4.998950210 5.000000000 +0.322580645 1.612903226 4.998950210 5.000000000 +0.322580645 1.935483871 4.998950210 5.000000000 +0.322580645 2.258064516 4.998950210 5.000000000 +0.322580645 2.580645161 5.314026132 5.160000000 +0.322580645 2.903225806 6.467756859 5.775193798 +0.322580645 3.225806452 7.452789474 6.353383459 +0.322580645 3.548387097 8.316896407 6.897810219 +0.322580645 3.870967742 9.067963620 7.411347518 +0.322580645 4.193548387 9.734585733 7.896551724 +0.322580645 4.516129032 10.322182298 8.355704698 +0.322580645 4.838709677 10.846060307 8.790849673 +0.322580645 5.161290323 11.316227524 9.203821656 +0.322580645 5.483870968 11.733949841 9.596273292 +0.322580645 5.806451613 12.115369655 9.969696970 +0.322580645 6.129032258 12.452152483 10.325443787 +0.322580645 6.451612903 12.762450565 10.664739884 +0.322580645 6.774193548 13.037607639 10.988700565 +0.322580645 7.096774194 13.291172539 11.298342541 +0.322580645 7.419354839 13.516499633 11.594594595 +0.322580645 7.741935484 13.570706205 11.666666667 +0.322580645 8.064516129 13.570706205 11.666666667 +0.322580645 8.387096774 13.570706205 11.666666667 +0.322580645 8.709677419 13.570706205 11.666666667 +0.322580645 9.032258065 13.570706205 11.666666667 +0.322580645 9.354838710 13.570706205 11.666666667 +0.322580645 9.677419355 13.570706205 11.666666667 +0.322580645 10.000000000 13.570706205 11.666666667 +0.645161290 0.000000000 4.998950210 5.000000000 +0.645161290 0.322580645 4.998950210 5.000000000 +0.645161290 0.645161290 4.998950210 5.000000000 +0.645161290 0.967741935 4.998950210 5.000000000 +0.645161290 1.290322581 4.998950210 5.000000000 +0.645161290 1.612903226 4.998950210 5.000000000 +0.645161290 1.935483871 4.998950210 5.000000000 +0.645161290 2.258064516 4.998950210 5.000000000 +0.645161290 2.580645161 5.314026132 5.160000000 +0.645161290 2.903225806 6.467756859 5.775193798 +0.645161290 3.225806452 7.452789474 6.353383459 +0.645161290 3.548387097 8.316896407 6.897810219 +0.645161290 3.870967742 9.067963620 7.411347518 +0.645161290 4.193548387 9.734585733 7.896551724 +0.645161290 4.516129032 10.322182298 8.355704698 +0.645161290 4.838709677 10.846060307 8.790849673 +0.645161290 5.161290323 11.316227524 9.203821656 +0.645161290 5.483870968 11.733949841 9.596273292 +0.645161290 5.806451613 12.115369655 9.969696970 +0.645161290 6.129032258 12.452152483 10.325443787 +0.645161290 6.451612903 12.762450565 10.664739884 +0.645161290 6.774193548 13.037607639 10.988700565 +0.645161290 7.096774194 13.291172539 11.298342541 +0.645161290 7.419354839 13.516499633 11.594594595 +0.645161290 7.741935484 13.570706205 11.666666667 +0.645161290 8.064516129 13.570706205 11.666666667 +0.645161290 8.387096774 13.570706205 11.666666667 +0.645161290 8.709677419 13.570706205 11.666666667 +0.645161290 9.032258065 13.570706205 11.666666667 +0.645161290 9.354838710 13.570706205 11.666666667 +0.645161290 9.677419355 13.570706205 11.666666667 +0.645161290 10.000000000 13.570706205 11.666666667 +0.967741935 0.000000000 4.998950210 5.000000000 +0.967741935 0.322580645 4.998950210 5.000000000 +0.967741935 0.645161290 4.998950210 5.000000000 +0.967741935 0.967741935 4.998950210 5.000000000 +0.967741935 1.290322581 4.998950210 5.000000000 +0.967741935 1.612903226 4.998950210 5.000000000 +0.967741935 1.935483871 4.998950210 5.000000000 +0.967741935 2.258064516 4.998950210 5.000000000 +0.967741935 2.580645161 5.314026132 5.160000000 +0.967741935 2.903225806 6.467756859 5.775193798 +0.967741935 3.225806452 7.452789474 6.353383459 +0.967741935 3.548387097 8.316896407 6.897810219 +0.967741935 3.870967742 9.067963620 7.411347518 +0.967741935 4.193548387 9.734585733 7.896551724 +0.967741935 4.516129032 10.322182298 8.355704698 +0.967741935 4.838709677 10.846060307 8.790849673 +0.967741935 5.161290323 11.316227524 9.203821656 +0.967741935 5.483870968 11.733949841 9.596273292 +0.967741935 5.806451613 12.115369655 9.969696970 +0.967741935 6.129032258 12.452152483 10.325443787 +0.967741935 6.451612903 12.762450565 10.664739884 +0.967741935 6.774193548 13.037607639 10.988700565 +0.967741935 7.096774194 13.291172539 11.298342541 +0.967741935 7.419354839 13.516499633 11.594594595 +0.967741935 7.741935484 13.570706205 11.666666667 +0.967741935 8.064516129 13.570706205 11.666666667 +0.967741935 8.387096774 13.570706205 11.666666667 +0.967741935 8.709677419 13.570706205 11.666666667 +0.967741935 9.032258065 13.570706205 11.666666667 +0.967741935 9.354838710 13.570706205 11.666666667 +0.967741935 9.677419355 13.570706205 11.666666667 +0.967741935 10.000000000 13.570706205 11.666666667 +1.290322581 0.000000000 4.998950210 5.000000000 +1.290322581 0.322580645 4.998950210 5.000000000 +1.290322581 0.645161290 4.998950210 5.000000000 +1.290322581 0.967741935 4.998950210 5.000000000 +1.290322581 1.290322581 4.998950210 5.000000000 +1.290322581 1.612903226 4.998950210 5.000000000 +1.290322581 1.935483871 4.998950210 5.000000000 +1.290322581 2.258064516 4.998950210 5.000000000 +1.290322581 2.580645161 5.314026132 5.160000000 +1.290322581 2.903225806 6.467756859 5.775193798 +1.290322581 3.225806452 7.452789474 6.353383459 +1.290322581 3.548387097 8.316896407 6.897810219 +1.290322581 3.870967742 9.067963620 7.411347518 +1.290322581 4.193548387 9.734585733 7.896551724 +1.290322581 4.516129032 10.322182298 8.355704698 +1.290322581 4.838709677 10.846060307 8.790849673 +1.290322581 5.161290323 11.316227524 9.203821656 +1.290322581 5.483870968 11.733949841 9.596273292 +1.290322581 5.806451613 12.115369655 9.969696970 +1.290322581 6.129032258 12.452152483 10.325443787 +1.290322581 6.451612903 12.762450565 10.664739884 +1.290322581 6.774193548 13.037607639 10.988700565 +1.290322581 7.096774194 13.291172539 11.298342541 +1.290322581 7.419354839 13.516499633 11.594594595 +1.290322581 7.741935484 13.570706205 11.666666667 +1.290322581 8.064516129 13.570706205 11.666666667 +1.290322581 8.387096774 13.570706205 11.666666667 +1.290322581 8.709677419 13.570706205 11.666666667 +1.290322581 9.032258065 13.570706205 11.666666667 +1.290322581 9.354838710 13.570706205 11.666666667 +1.290322581 9.677419355 13.570706205 11.666666667 +1.290322581 10.000000000 13.570706205 11.666666667 +1.612903226 0.000000000 4.998950210 5.000000000 +1.612903226 0.322580645 4.998950210 5.000000000 +1.612903226 0.645161290 4.998950210 5.000000000 +1.612903226 0.967741935 4.998950210 5.000000000 +1.612903226 1.290322581 4.998950210 5.000000000 +1.612903226 1.612903226 4.998950210 5.000000000 +1.612903226 1.935483871 4.998950210 5.000000000 +1.612903226 2.258064516 4.998950210 5.000000000 +1.612903226 2.580645161 5.314026132 5.160000000 +1.612903226 2.903225806 6.467756859 5.775193798 +1.612903226 3.225806452 7.452789474 6.353383459 +1.612903226 3.548387097 8.316896407 6.897810219 +1.612903226 3.870967742 9.067963620 7.411347518 +1.612903226 4.193548387 9.734585733 7.896551724 +1.612903226 4.516129032 10.322182298 8.355704698 +1.612903226 4.838709677 10.846060307 8.790849673 +1.612903226 5.161290323 11.316227524 9.203821656 +1.612903226 5.483870968 11.733949841 9.596273292 +1.612903226 5.806451613 12.115369655 9.969696970 +1.612903226 6.129032258 12.452152483 10.325443787 +1.612903226 6.451612903 12.762450565 10.664739884 +1.612903226 6.774193548 13.037607639 10.988700565 +1.612903226 7.096774194 13.291172539 11.298342541 +1.612903226 7.419354839 13.516499633 11.594594595 +1.612903226 7.741935484 13.570706205 11.666666667 +1.612903226 8.064516129 13.570706205 11.666666667 +1.612903226 8.387096774 13.570706205 11.666666667 +1.612903226 8.709677419 13.570706205 11.666666667 +1.612903226 9.032258065 13.570706205 11.666666667 +1.612903226 9.354838710 13.570706205 11.666666667 +1.612903226 9.677419355 13.570706205 11.666666667 +1.612903226 10.000000000 13.570706205 11.666666667 +1.935483871 0.000000000 4.998950210 5.000000000 +1.935483871 0.322580645 4.998950210 5.000000000 +1.935483871 0.645161290 4.998950210 5.000000000 +1.935483871 0.967741935 4.998950210 5.000000000 +1.935483871 1.290322581 4.998950210 5.000000000 +1.935483871 1.612903226 4.998950210 5.000000000 +1.935483871 1.935483871 4.998950210 5.000000000 +1.935483871 2.258064516 4.998950210 5.000000000 +1.935483871 2.580645161 5.314026132 5.160000000 +1.935483871 2.903225806 6.467756859 5.775193798 +1.935483871 3.225806452 7.452789474 6.353383459 +1.935483871 3.548387097 8.316896407 6.897810219 +1.935483871 3.870967742 9.067963620 7.411347518 +1.935483871 4.193548387 9.734585733 7.896551724 +1.935483871 4.516129032 10.322182298 8.355704698 +1.935483871 4.838709677 10.846060307 8.790849673 +1.935483871 5.161290323 11.316227524 9.203821656 +1.935483871 5.483870968 11.733949841 9.596273292 +1.935483871 5.806451613 12.115369655 9.969696970 +1.935483871 6.129032258 12.452152483 10.325443787 +1.935483871 6.451612903 12.762450565 10.664739884 +1.935483871 6.774193548 13.037607639 10.988700565 +1.935483871 7.096774194 13.291172539 11.298342541 +1.935483871 7.419354839 13.516499633 11.594594595 +1.935483871 7.741935484 13.570706205 11.666666667 +1.935483871 8.064516129 13.570706205 11.666666667 +1.935483871 8.387096774 13.570706205 11.666666667 +1.935483871 8.709677419 13.570706205 11.666666667 +1.935483871 9.032258065 13.570706205 11.666666667 +1.935483871 9.354838710 13.570706205 11.666666667 +1.935483871 9.677419355 13.570706205 11.666666667 +1.935483871 10.000000000 13.570706205 11.666666667 +2.258064516 0.000000000 4.998950210 5.000000000 +2.258064516 0.322580645 4.998950210 5.000000000 +2.258064516 0.645161290 4.998950210 5.000000000 +2.258064516 0.967741935 4.998950210 5.000000000 +2.258064516 1.290322581 4.998950210 5.000000000 +2.258064516 1.612903226 4.998950210 5.000000000 +2.258064516 1.935483871 4.998950210 5.000000000 +2.258064516 2.258064516 4.998950210 5.000000000 +2.258064516 2.580645161 5.314026132 5.160000000 +2.258064516 2.903225806 6.467756859 5.775193798 +2.258064516 3.225806452 7.452789474 6.353383459 +2.258064516 3.548387097 8.316896407 6.897810219 +2.258064516 3.870967742 9.067963620 7.411347518 +2.258064516 4.193548387 9.734585733 7.896551724 +2.258064516 4.516129032 10.322182298 8.355704698 +2.258064516 4.838709677 10.846060307 8.790849673 +2.258064516 5.161290323 11.316227524 9.203821656 +2.258064516 5.483870968 11.733949841 9.596273292 +2.258064516 5.806451613 12.115369655 9.969696970 +2.258064516 6.129032258 12.452152483 10.325443787 +2.258064516 6.451612903 12.762450565 10.664739884 +2.258064516 6.774193548 13.037607639 10.988700565 +2.258064516 7.096774194 13.291172539 11.298342541 +2.258064516 7.419354839 13.516499633 11.594594595 +2.258064516 7.741935484 13.570706205 11.666666667 +2.258064516 8.064516129 13.570706205 11.666666667 +2.258064516 8.387096774 13.570706205 11.666666667 +2.258064516 8.709677419 13.570706205 11.666666667 +2.258064516 9.032258065 13.570706205 11.666666667 +2.258064516 9.354838710 13.570706205 11.666666667 +2.258064516 9.677419355 13.570706205 11.666666667 +2.258064516 10.000000000 13.570706205 11.666666667 +2.580645161 0.000000000 5.592761972 5.312500000 +2.580645161 0.322580645 5.592761972 5.312500000 +2.580645161 0.645161290 5.592761972 5.312500000 +2.580645161 0.967741935 5.592761972 5.312500000 +2.580645161 1.290322581 5.592761972 5.312500000 +2.580645161 1.612903226 5.592761972 5.312500000 +2.580645161 1.935483871 5.592761972 5.312500000 +2.580645161 2.258064516 5.592761972 5.312500000 +2.580645161 2.580645161 5.880621907 5.465349012 +2.580645161 2.903225806 6.939232958 6.055190858 +2.580645161 3.225806452 7.848835301 6.612674391 +2.580645161 3.548387097 8.651174558 7.140391254 +2.580645161 3.870967742 9.351975577 7.640663528 +2.580645161 4.193548387 9.976796931 8.115577889 +2.580645161 4.516129032 10.530004073 8.567014703 +2.580645161 4.838709677 11.024934815 8.996672905 +2.580645161 5.161290323 11.470583404 9.406091371 +2.580645161 5.483870968 11.867640871 9.796667328 +2.580645161 5.806451613 12.231162308 10.169672290 +2.580645161 6.129032258 12.552900008 10.526265883 +2.580645161 6.451612903 12.849986938 10.867507886 +2.580645161 6.774193548 13.113962484 11.194368756 +2.580645161 7.096774194 13.357668633 11.507738837 +2.580645161 7.419354839 13.574618159 11.808436465 +2.580645161 7.741935484 13.626860714 11.881720430 +2.580645161 8.064516129 13.626860714 11.881720430 +2.580645161 8.387096774 13.626860714 11.881720430 +2.580645161 8.709677419 13.626860714 11.881720430 +2.580645161 9.032258065 13.626860714 11.881720430 +2.580645161 9.354838710 13.626860714 11.881720430 +2.580645161 9.677419355 13.626860714 11.881720430 +2.580645161 10.000000000 13.626860714 11.881720430 +2.903225806 0.000000000 7.283786709 6.388888889 +2.903225806 0.322580645 7.283786709 6.388888889 +2.903225806 0.645161290 7.283786709 6.388888889 +2.903225806 0.967741935 7.283786709 6.388888889 +2.903225806 1.290322581 7.283786709 6.388888889 +2.903225806 1.612903226 7.283786709 6.388888889 +2.903225806 1.935483871 7.283786709 6.388888889 +2.903225806 2.258064516 7.283786709 6.388888889 +2.903225806 2.580645161 7.499955755 6.520624303 +2.903225806 2.903225806 8.305212731 7.035456336 +2.903225806 3.225806452 9.011457616 7.531699979 +2.903225806 3.548387097 9.645097856 8.010344100 +2.903225806 3.870967742 10.207136722 8.472308650 +2.903225806 4.193548387 10.715739625 8.918450561 +2.903225806 4.516129032 11.172892280 9.349569052 +2.903225806 4.838709677 11.587921940 9.766410408 +2.903225806 5.161290323 11.967183067 10.169672290 +2.903225806 5.483870968 12.308758298 10.560007632 +2.903225806 5.806451613 12.624644763 10.938028169 +2.903225806 6.129032258 12.908650399 11.304307635 +2.903225806 6.451612903 13.174140812 11.659384671 +2.903225806 6.774193548 13.414725347 12.003765465 +2.903225806 7.096774194 13.639701953 12.337926161 +2.903225806 7.419354839 13.842390029 12.662315057 +2.903225806 7.741935484 13.891460681 12.741935484 +2.903225806 8.064516129 13.891460681 12.741935484 +2.903225806 8.387096774 13.891460681 12.741935484 +2.903225806 8.709677419 13.891460681 12.741935484 +2.903225806 9.032258065 13.891460681 12.741935484 +2.903225806 9.354838710 13.891460681 12.741935484 +2.903225806 9.677419355 13.891460681 12.741935484 +2.903225806 10.000000000 13.891460681 12.741935484 +3.225806452 0.000000000 8.314651325 7.250000000 +3.225806452 0.322580645 8.314651325 7.250000000 +3.225806452 0.645161290 8.314651325 7.250000000 +3.225806452 0.967741935 8.314651325 7.250000000 +3.225806452 1.290322581 8.314651325 7.250000000 +3.225806452 1.612903226 8.314651325 7.250000000 +3.225806452 1.935483871 8.314651325 7.250000000 +3.225806452 2.258064516 8.314651325 7.250000000 +3.225806452 2.580645161 8.491360774 7.368791474 +3.225806452 2.903225806 9.156409155 7.837810945 +3.225806452 3.225806452 9.746803244 8.297222769 +3.225806452 3.548387097 10.284138020 8.747319166 +3.225806452 3.870967742 10.769427894 9.188380622 +3.225806452 4.193548387 11.214534071 9.620676476 +3.225806452 4.516129032 11.619323393 10.044465468 +3.225806452 4.838709677 11.993033266 10.459996253 +3.225806452 5.161290323 12.340224927 10.867507886 +3.225806452 5.483870968 12.657043434 11.267230289 +3.225806452 5.806451613 12.956823683 11.659384671 +3.225806452 6.129032258 13.232890780 12.044183950 +3.225806452 6.451612903 13.493168128 12.421833125 +3.225806452 6.774193548 13.734211054 12.792529651 +3.225806452 7.096774194 13.966630648 13.156463778 +3.225806452 7.419354839 14.180445683 13.513818877 +3.225806452 7.741935484 14.232664470 13.602150538 +3.225806452 8.064516129 14.232664470 13.602150538 +3.225806452 8.387096774 14.232664470 13.602150538 +3.225806452 8.709677419 14.232664470 13.602150538 +3.225806452 9.032258065 14.232664470 13.602150538 +3.225806452 9.354838710 14.232664470 13.602150538 +3.225806452 9.677419355 14.232664470 13.602150538 +3.225806452 10.000000000 14.232664470 13.602150538 +3.548387097 0.000000000 8.985030201 7.954545455 +3.548387097 0.322580645 8.985030201 7.954545455 +3.548387097 0.645161290 8.985030201 7.954545455 +3.548387097 0.967741935 8.985030201 7.954545455 +3.548387097 1.290322581 8.985030201 7.954545455 +3.548387097 1.612903226 8.985030201 7.954545455 +3.548387097 1.935483871 8.985030201 7.954545455 +3.548387097 2.258064516 8.985030201 7.954545455 +3.548387097 2.580645161 9.137812976 8.065372642 +3.548387097 2.903225806 9.717703976 8.506659369 +3.548387097 3.225806452 10.238351404 8.944737320 +3.548387097 3.548387097 10.720683414 9.379641369 +3.548387097 3.870967742 11.160003933 9.811405883 +3.548387097 4.193548387 11.571126024 10.240064737 +3.548387097 4.516129032 11.950914620 10.665651317 +3.548387097 4.838709677 12.307875007 11.088198536 +3.548387097 5.161290323 12.645356184 11.507738837 +3.548387097 5.483870968 12.960313946 11.924304201 +3.548387097 5.806451613 13.266478726 12.337926161 +3.548387097 6.129032258 13.551156560 12.748635804 +3.548387097 6.451612903 13.831439195 13.156463778 +3.548387097 6.774193548 14.095225315 13.561440308 +3.548387097 7.096774194 14.356367336 13.963595192 +3.548387097 7.419354839 14.605377743 14.362957820 +3.548387097 7.741935484 14.667921566 14.462365591 +3.548387097 8.064516129 14.667921566 14.462365591 +3.548387097 8.387096774 14.667921566 14.462365591 +3.548387097 8.709677419 14.667921566 14.462365591 +3.548387097 9.032258065 14.667921566 14.462365591 +3.548387097 9.354838710 14.667921566 14.462365591 +3.548387097 9.677419355 14.667921566 14.462365591 +3.548387097 10.000000000 14.667921566 14.462365591 +3.870967742 0.000000000 9.432393054 8.541666667 +3.870967742 0.322580645 9.432393054 8.541666667 +3.870967742 0.645161290 9.432393054 8.541666667 +3.870967742 0.967741935 9.432393054 8.541666667 +3.870967742 1.290322581 9.432393054 8.541666667 +3.870967742 1.612903226 9.432393054 8.541666667 +3.870967742 1.935483871 9.432393054 8.541666667 +3.870967742 2.258064516 9.432393054 8.541666667 +3.870967742 2.580645161 9.569971811 8.647671878 +3.870967742 2.903225806 10.095984031 9.072764022 +3.870967742 3.225806452 10.575695895 9.499578059 +3.870967742 3.548387097 11.024096907 9.928124472 +3.870967742 3.870967742 11.442347059 10.358413828 +3.870967742 4.193548387 11.836700132 10.790456784 +3.870967742 4.516129032 12.211639878 11.224264080 +3.870967742 4.838709677 12.568786873 11.659846547 +3.870967742 5.161290323 12.913995839 12.097215103 +3.870967742 5.483870968 13.247084242 12.536380757 +3.870967742 5.806451613 13.573370226 12.977354606 +3.870967742 6.129032258 13.891165979 13.420147843 +3.870967742 6.451612903 14.206686830 13.864771748 +3.870967742 6.774193548 14.518152082 14.311237701 +3.870967742 7.096774194 14.833264590 14.759557170 +3.870967742 7.419354839 15.145455566 15.209741723 +3.870967742 7.741935484 15.224455159 15.322580645 +3.870967742 8.064516129 15.224455159 15.322580645 +3.870967742 8.387096774 15.224455159 15.322580645 +3.870967742 8.709677419 15.224455159 15.322580645 +3.870967742 9.032258065 15.224455159 15.322580645 +3.870967742 9.354838710 15.224455159 15.322580645 +3.870967742 9.677419355 15.224455159 15.322580645 +3.870967742 10.000000000 15.224455159 15.322580645 +4.193548387 0.000000000 9.724829800 9.038461538 +4.193548387 0.322580645 9.724829800 9.038461538 +4.193548387 0.645161290 9.724829800 9.038461538 +4.193548387 0.967741935 9.724829800 9.038461538 +4.193548387 1.290322581 9.724829800 9.038461538 +4.193548387 1.612903226 9.724829800 9.038461538 +4.193548387 1.935483871 9.724829800 9.038461538 +4.193548387 2.258064516 9.724829800 9.038461538 +4.193548387 2.580645161 9.852943138 9.141680907 +4.193548387 2.903225806 10.345918352 9.558110433 +4.193548387 3.225806452 10.802543542 9.980311860 +4.193548387 3.548387097 11.235827387 10.408406027 +4.193548387 3.870967742 11.644759742 10.842517170 +4.193548387 4.193548387 12.040733478 11.282773042 +4.193548387 4.516129032 12.424030547 11.729305038 +4.193548387 4.838709677 12.796980884 12.182248328 +4.193548387 5.161290323 13.166426475 12.641741988 +4.193548387 5.483870968 13.531922324 13.107929151 +4.193548387 5.806451613 13.901663971 13.580957145 +4.193548387 6.129032258 14.268117073 14.060977658 +4.193548387 6.451612903 14.647562125 14.548146895 +4.193548387 6.774193548 15.033372347 15.042625746 +4.193548387 7.096774194 15.433721197 15.544579969 +4.193548387 7.419354839 15.846288602 16.054180370 +4.193548387 7.741935484 15.954652850 16.182795699 +4.193548387 8.064516129 15.954652850 16.182795699 +4.193548387 8.387096774 15.954652850 16.182795699 +4.193548387 8.709677419 15.954652850 16.182795699 +4.193548387 9.032258065 15.954652850 16.182795699 +4.193548387 9.354838710 15.954652850 16.182795699 +4.193548387 9.677419355 15.954652850 16.182795699 +4.193548387 10.000000000 15.954652850 16.182795699 +4.516129032 0.000000000 9.902963105 9.464285714 +4.516129032 0.322580645 9.902963105 9.464285714 +4.516129032 0.645161290 9.902963105 9.464285714 +4.516129032 0.967741935 9.902963105 9.464285714 +4.516129032 1.290322581 9.902963105 9.464285714 +4.516129032 1.612903226 9.902963105 9.464285714 +4.516129032 1.935483871 9.902963105 9.464285714 +4.516129032 2.258064516 9.902963105 9.464285714 +4.516129032 2.580645161 10.025672736 9.566064982 +4.516129032 2.903225806 10.500507438 9.978829026 +4.516129032 3.225806452 10.946239871 10.400856341 +4.516129032 3.548387097 11.376703200 10.832462297 +4.516129032 3.870967742 11.792259146 11.273976741 +4.516129032 4.193548387 12.201356693 11.725744843 +4.516129032 4.516129032 12.604952096 12.188127995 +4.516129032 4.838709677 13.008602620 12.661504771 +4.516129032 5.161290323 13.417792712 13.146271965 +4.516129032 5.483870968 13.834555987 13.642845698 +4.516129032 5.806451613 14.267444692 14.151662612 +4.516129032 6.129032258 14.713512788 14.673181146 +4.516129032 6.451612903 15.186143246 15.207882920 +4.516129032 6.774193548 15.682677037 15.756274213 +4.516129032 7.096774194 16.216113014 16.318887562 +4.516129032 7.419354839 16.788339244 16.896283492 +4.516129032 7.741935484 16.942283864 17.043010753 +4.516129032 8.064516129 16.942283864 17.043010753 +4.516129032 8.387096774 16.942283864 17.043010753 +4.516129032 8.709677419 16.942283864 17.043010753 +4.516129032 9.032258065 16.942283864 17.043010753 +4.516129032 9.354838710 16.942283864 17.043010753 +4.516129032 9.677419355 16.942283864 17.043010753 +4.516129032 10.000000000 16.942283864 17.043010753 +4.838709677 0.000000000 9.987593227 9.833333333 +4.838709677 0.322580645 9.987593227 9.833333333 +4.838709677 0.645161290 9.987593227 9.833333333 +4.838709677 0.967741935 9.987593227 9.833333333 +4.838709677 1.290322581 9.987593227 9.833333333 +4.838709677 1.612903226 9.987593227 9.833333333 +4.838709677 1.935483871 9.987593227 9.833333333 +4.838709677 2.258064516 9.987593227 9.833333333 +4.838709677 2.580645161 10.107937367 9.934574396 +4.838709677 2.903225806 10.576746882 10.347022587 +4.838709677 3.225806452 11.023190342 10.771849382 +4.838709677 3.548387097 11.461860178 11.209620539 +4.838709677 3.870967742 11.892974885 11.660936829 +4.838709677 4.193548387 12.326836015 12.126436782 +4.838709677 4.516129032 12.765557275 12.606799704 +4.838709677 4.838709677 13.215984335 13.102748986 +4.838709677 5.161290323 13.685165434 13.615055734 +4.838709677 5.483870968 14.175297225 14.144542773 +4.838709677 5.806451613 14.699676483 14.692089057 +4.838709677 6.129032258 15.258066385 15.258634538 +4.838709677 6.451612903 15.868732072 15.845185548 +4.838709677 6.774193548 16.535753191 16.452820769 +4.838709677 7.096774194 17.280236196 17.082697848 +4.838709677 7.419354839 18.115344324 17.736060763 +4.838709677 7.741935484 18.343399565 17.903225806 +4.838709677 8.064516129 18.343399565 17.903225806 +4.838709677 8.387096774 18.343399565 17.903225806 +4.838709677 8.709677419 18.343399565 17.903225806 +4.838709677 9.032258065 18.343399565 17.903225806 +4.838709677 9.354838710 18.343399565 17.903225806 +4.838709677 9.677419355 18.343399565 17.903225806 +4.838709677 10.000000000 18.343399565 17.903225806 +5.161290323 0.000000000 10.453438845 10.081967213 +5.161290323 0.322580645 10.453438845 10.081967213 +5.161290323 0.645161290 10.453438845 10.081967213 +5.161290323 0.967741935 10.453438845 10.081967213 +5.161290323 1.290322581 10.453438845 10.081967213 +5.161290323 1.612903226 10.453438845 10.081967213 +5.161290323 1.935483871 10.453438845 10.081967213 +5.161290323 2.258064516 10.453438845 10.081967213 +5.161290323 2.580645161 10.555334150 10.189117452 +5.161290323 2.903225806 10.957766893 10.626095161 +5.161290323 3.225806452 11.358194134 11.076954676 +5.161290323 3.548387097 11.754612081 11.542368165 +5.161290323 3.870967742 12.159885021 12.023051902 +5.161290323 4.193548387 12.572343139 12.519769950 +5.161290323 4.516129032 13.004157242 13.033338207 +5.161290323 4.838709677 13.454843261 13.564628886 +5.161290323 5.161290323 13.937409133 14.114575450 +5.161290323 5.483870968 14.453623313 14.684178093 +5.161290323 5.806451613 15.017597606 15.274509804 +5.161290323 6.129032258 15.634903956 15.886723119 +5.161290323 6.451612903 16.324245881 16.522057627 +5.161290323 6.774193548 17.100135640 17.181848349 +5.161290323 7.096774194 17.987899976 17.867535104 +5.161290323 7.419354839 19.013798273 18.580672994 +5.161290323 7.741935484 19.297725710 18.763440860 +5.161290323 8.064516129 19.297725710 18.763440860 +5.161290323 8.387096774 19.297725710 18.763440860 +5.161290323 8.709677419 19.297725710 18.763440860 +5.161290323 9.032258065 19.297725710 18.763440860 +5.161290323 9.354838710 19.297725710 18.763440860 +5.161290323 9.677419355 19.297725710 18.763440860 +5.161290323 10.000000000 19.297725710 18.763440860 +5.483870968 0.000000000 11.200371425 10.254237288 +5.483870968 0.322580645 11.200371425 10.254237288 +5.483870968 0.645161290 11.200371425 10.254237288 +5.483870968 0.967741935 11.200371425 10.254237288 +5.483870968 1.290322581 11.200371425 10.254237288 +5.483870968 1.612903226 11.200371425 10.254237288 +5.483870968 1.935483871 11.200371425 10.254237288 +5.483870968 2.258064516 11.200371425 10.254237288 +5.483870968 2.580645161 11.275744351 10.373748457 +5.483870968 2.903225806 11.579276776 10.860102906 +5.483870968 3.225806452 11.893660170 11.360174870 +5.483870968 3.548387097 12.214119876 11.874552997 +5.483870968 3.870967742 12.553283322 12.403860107 +5.483870968 4.193548387 12.907426182 12.948755706 +5.483870968 4.516129032 13.285781482 13.509938724 +5.483870968 4.838709677 13.693069775 14.088150508 +5.483870968 5.161290323 14.133110626 14.684178093 +5.483870968 5.483870968 14.617921843 15.298857769 +5.483870968 5.806451613 15.149780175 15.933079002 +5.483870968 6.129032258 15.746811487 16.587788726 +5.483870968 6.451612903 16.415017186 17.263996060 +5.483870968 6.774193548 17.180595436 17.962777500 +5.483870968 7.096774194 18.063069240 18.685282635 +5.483870968 7.419354839 19.094026165 19.432740459 +5.483870968 7.741935484 19.380891828 19.623655914 +5.483870968 8.064516129 19.380891828 19.623655914 +5.483870968 8.387096774 19.380891828 19.623655914 +5.483870968 8.709677419 19.380891828 19.623655914 +5.483870968 9.032258065 19.380891828 19.623655914 +5.483870968 9.354838710 19.380891828 19.623655914 +5.483870968 9.677419355 19.380891828 19.623655914 +5.483870968 10.000000000 19.380891828 19.623655914 +5.806451613 0.000000000 11.792304026 10.438596491 +5.806451613 0.322580645 11.792304026 10.438596491 +5.806451613 0.645161290 11.792304026 10.438596491 +5.806451613 0.967741935 11.792304026 10.438596491 +5.806451613 1.290322581 11.792304026 10.438596491 +5.806451613 1.612903226 11.792304026 10.438596491 +5.806451613 1.935483871 11.792304026 10.438596491 +5.806451613 2.258064516 11.792304026 10.438596491 +5.806451613 2.580645161 11.848083932 10.571165035 +5.806451613 2.903225806 12.077812184 11.109435588 +5.806451613 3.225806452 12.327537589 11.660851868 +5.806451613 3.548387097 12.590635013 12.225901398 +5.806451613 3.870967742 12.875627326 12.805096111 +5.806451613 4.193548387 13.187716001 13.398973895 +5.806451613 4.516129032 13.525122531 14.008100260 +5.806451613 4.838709677 13.897938757 14.633070135 +5.806451613 5.161290323 14.310798618 15.274509804 +5.806451613 5.483870968 14.768759505 15.933079002 +5.806451613 5.806451613 15.285527581 16.609473175 +5.806451613 6.129032258 15.867812510 17.304425935 +5.806451613 6.451612903 16.531661050 18.018711707 +5.806451613 6.774193548 17.302903875 18.753148615 +5.806451613 7.096774194 18.198839735 19.508601601 +5.806451613 7.419354839 19.260035649 20.285985830 +5.806451613 7.741935484 19.557269007 20.483870968 +5.806451613 8.064516129 19.557269007 20.483870968 +5.806451613 8.387096774 19.557269007 20.483870968 +5.806451613 8.709677419 19.557269007 20.483870968 +5.806451613 9.032258065 19.557269007 20.483870968 +5.806451613 9.354838710 19.557269007 20.483870968 +5.806451613 9.677419355 19.557269007 20.483870968 +5.806451613 10.000000000 19.557269007 20.483870968 +6.129032258 0.000000000 12.272218993 10.636363636 +6.129032258 0.322580645 12.272218993 10.636363636 +6.129032258 0.645161290 12.272218993 10.636363636 +6.129032258 0.967741935 12.272218993 10.636363636 +6.129032258 1.290322581 12.272218993 10.636363636 +6.129032258 1.612903226 12.272218993 10.636363636 +6.129032258 1.935483871 12.272218993 10.636363636 +6.129032258 2.258064516 12.272218993 10.636363636 +6.129032258 2.580645161 12.312912957 10.782742908 +6.129032258 2.903225806 12.485719838 11.375649592 +6.129032258 3.225806452 12.683802558 11.980650967 +6.129032258 3.548387097 12.903346192 12.598120927 +6.129032258 3.870967742 13.148207675 13.228448936 +6.129032258 4.193548387 13.424397092 13.872040848 +6.129032258 4.516129032 13.734709260 14.529319781 +6.129032258 4.838709677 14.081175133 15.200727043 +6.129032258 5.161290323 14.472910716 15.886723119 +6.129032258 5.483870968 14.920581746 16.587788726 +6.129032258 5.806451613 15.427041299 17.304425935 +6.129032258 6.129032258 16.008438809 18.037159372 +6.129032258 6.451612903 16.684191565 18.786537498 +6.129032258 6.774193548 17.475450862 19.553133975 +6.129032258 7.096774194 18.410291448 20.337549137 +6.129032258 7.419354839 19.533529202 21.140411551 +6.129032258 7.741935484 19.850782228 21.344086022 +6.129032258 8.064516129 19.850782228 21.344086022 +6.129032258 8.387096774 19.850782228 21.344086022 +6.129032258 8.709677419 19.850782228 21.344086022 +6.129032258 9.032258065 19.850782228 21.344086022 +6.129032258 9.354838710 19.850782228 21.344086022 +6.129032258 9.677419355 19.850782228 21.344086022 +6.129032258 10.000000000 19.850782228 21.344086022 +6.451612903 0.000000000 12.667715960 10.849056604 +6.451612903 0.322580645 12.667715960 10.849056604 +6.451612903 0.645161290 12.667715960 10.849056604 +6.451612903 0.967741935 12.667715960 10.849056604 +6.451612903 1.290322581 12.667715960 10.849056604 +6.451612903 1.612903226 12.667715960 10.849056604 +6.451612903 1.935483871 12.667715960 10.849056604 +6.451612903 2.258064516 12.667715960 10.849056604 +6.451612903 2.580645161 12.695732249 11.010062510 +6.451612903 2.903225806 12.824135659 11.660519441 +6.451612903 3.225806452 12.981327533 12.321456235 +6.451612903 3.548387097 13.167148134 12.993128221 +6.451612903 3.870967742 13.381921080 13.675799087 +6.451612903 4.193548387 13.630079770 14.369741229 +6.451612903 4.516129032 13.917888750 15.075236113 +6.451612903 4.838709677 14.251097627 15.792574657 +6.451612903 5.161290323 14.632147614 16.522057627 +6.451612903 5.483870968 15.072735735 17.263996060 +6.451612903 5.806451613 15.583881738 18.018711707 +6.451612903 6.129032258 16.182136955 18.786537498 +6.451612903 6.451612903 16.899235777 19.567818029 +6.451612903 6.774193548 17.840675551 20.362910080 +6.451612903 7.096774194 18.923022827 21.172183159 +6.451612903 7.419354839 20.191498874 21.996020073 +6.451612903 7.741935484 20.543702253 22.204301075 +6.451612903 8.064516129 20.543702253 22.204301075 +6.451612903 8.387096774 20.543702253 22.204301075 +6.451612903 8.709677419 20.543702253 22.204301075 +6.451612903 9.032258065 20.543702253 22.204301075 +6.451612903 9.354838710 20.543702253 22.204301075 +6.451612903 9.677419355 20.543702253 22.204301075 +6.451612903 10.000000000 20.543702253 22.204301075 +6.774193548 0.000000000 12.998209351 11.078431373 +6.774193548 0.322580645 12.998209351 11.078431373 +6.774193548 0.645161290 12.998209351 11.078431373 +6.774193548 0.967741935 12.998209351 11.078431373 +6.774193548 1.290322581 12.998209351 11.078431373 +6.774193548 1.612903226 12.998209351 11.078431373 +6.774193548 1.935483871 12.998209351 11.078431373 +6.774193548 2.258064516 12.998209351 11.078431373 +6.774193548 2.580645161 13.016700861 11.254948535 +6.774193548 2.903225806 13.109051400 11.966077401 +6.774193548 3.225806452 13.233524203 12.685407657 +6.774193548 3.548387097 13.391742155 13.413082004 +6.774193548 3.870967742 13.584206097 14.149246475 +6.774193548 4.193548387 13.814318448 14.894050530 +6.774193548 4.516129032 14.087835159 15.647647155 +6.774193548 4.838709677 14.410179185 16.410192974 +6.774193548 5.161290323 14.791181858 17.181848349 +6.774193548 5.483870968 15.241218368 17.962777500 +6.774193548 5.806451613 15.875517713 18.753148615 +6.774193548 6.129032258 16.681146859 19.553133975 +6.774193548 6.451612903 17.569488681 20.362910080 +6.774193548 6.774193548 18.574163704 21.182657773 +6.774193548 7.096774194 19.734151545 22.012562382 +6.774193548 7.419354839 21.103510509 22.852813853 +6.774193548 7.741935484 21.487304165 23.064516129 +6.774193548 8.064516129 21.487304165 23.064516129 +6.774193548 8.387096774 21.487304165 23.064516129 +6.774193548 8.709677419 21.487304165 23.064516129 +6.774193548 9.032258065 21.487304165 23.064516129 +6.774193548 9.354838710 21.487304165 23.064516129 +6.774193548 9.677419355 21.487304165 23.064516129 +6.774193548 10.000000000 21.487304165 23.064516129 +7.096774194 0.000000000 13.277885841 11.326530612 +7.096774194 0.322580645 13.277885841 11.326530612 +7.096774194 0.645161290 13.277885841 11.326530612 +7.096774194 0.967741935 13.277885841 11.326530612 +7.096774194 1.290322581 13.277885841 11.326530612 +7.096774194 1.612903226 13.277885841 11.326530612 +7.096774194 1.935483871 13.277885841 11.326530612 +7.096774194 2.258064516 13.277885841 11.326530612 +7.096774194 2.580645161 13.288352640 11.519519025 +7.096774194 2.903225806 13.350771800 12.294662039 +7.096774194 3.225806452 13.448963305 13.074946112 +7.096774194 3.548387097 13.584671491 13.860422559 +7.096774194 3.870967742 13.760664445 14.651143382 +7.096774194 4.193548387 13.980902626 15.447161280 +7.096774194 4.516129032 14.249972519 16.248529659 +7.096774194 4.838709677 14.574475539 17.055302647 +7.096774194 5.161290323 14.966122630 17.867535104 +7.096774194 5.483870968 15.630163357 18.685282635 +7.096774194 5.806451613 16.437215216 19.508601601 +7.096774194 6.129032258 17.309323446 20.337549137 +7.096774194 6.451612903 18.275865243 21.172183159 +7.096774194 6.774193548 19.378378532 22.012562382 +7.096774194 7.096774194 20.668439101 22.858746331 +7.096774194 7.419354839 22.225144822 23.710795356 +7.096774194 7.741935484 22.668948283 23.924731183 +7.096774194 8.064516129 22.668948283 23.924731183 +7.096774194 8.387096774 22.668948283 23.924731183 +7.096774194 8.709677419 22.668948283 23.924731183 +7.096774194 9.032258065 22.668948283 23.924731183 +7.096774194 9.354838710 22.668948283 23.924731183 +7.096774194 9.677419355 22.668948283 23.924731183 +7.096774194 10.000000000 22.668948283 23.924731183 +7.419354839 0.000000000 13.515825784 11.595744681 +7.419354839 0.322580645 13.515825784 11.595744681 +7.419354839 0.645161290 13.515825784 11.595744681 +7.419354839 0.967741935 13.515825784 11.595744681 +7.419354839 1.290322581 13.515825784 11.595744681 +7.419354839 1.612903226 13.515825784 11.595744681 +7.419354839 1.935483871 13.515825784 11.595744681 +7.419354839 2.258064516 13.515825784 11.595744681 +7.419354839 2.580645161 13.519282293 11.806246782 +7.419354839 2.903225806 13.556279203 12.648978190 +7.419354839 3.225806452 13.633565239 13.492868190 +7.419354839 3.548387097 13.753168201 14.337919175 +7.419354839 3.870967742 13.918417774 15.184133540 +7.419354839 4.193548387 14.134193279 16.031513690 +7.419354839 4.516129032 14.407312339 16.880062037 +7.419354839 4.838709677 14.747121823 17.729780997 +7.419354839 5.161290323 15.312289393 18.580672994 +7.419354839 5.483870968 16.162307388 19.432740459 +7.419354839 5.806451613 17.055699946 20.285985830 +7.419354839 6.129032258 18.025108663 21.140411551 +7.419354839 6.451612903 19.112532086 21.996020073 +7.419354839 6.774193548 20.379272817 22.852813853 +7.419354839 7.096774194 21.908521849 23.710795356 +7.419354839 7.419354839 23.837396065 24.569967054 +7.419354839 7.741935484 24.406429743 24.784946237 +7.419354839 8.064516129 24.406429743 24.784946237 +7.419354839 8.387096774 24.406429743 24.784946237 +7.419354839 8.709677419 24.406429743 24.784946237 +7.419354839 9.032258065 24.406429743 24.784946237 +7.419354839 9.354838710 24.406429743 24.784946237 +7.419354839 9.677419355 24.406429743 24.784946237 +7.419354839 10.000000000 24.406429743 24.784946237 +7.741935484 0.000000000 13.570706205 11.666666667 +7.741935484 0.322580645 13.570706205 11.666666667 +7.741935484 0.645161290 13.570706205 11.666666667 +7.741935484 0.967741935 13.570706205 11.666666667 +7.741935484 1.290322581 13.570706205 11.666666667 +7.741935484 1.612903226 13.570706205 11.666666667 +7.741935484 1.935483871 13.570706205 11.666666667 +7.741935484 2.258064516 13.570706205 11.666666667 +7.741935484 2.580645161 13.572517919 11.881720430 +7.741935484 2.903225806 13.603707815 12.741935484 +7.741935484 3.225806452 13.676532623 13.602150538 +7.741935484 3.548387097 13.793124575 14.462365591 +7.741935484 3.870967742 13.957010447 15.322580645 +7.741935484 4.193548387 14.173387937 16.182795699 +7.741935484 4.516129032 14.449561083 17.043010753 +7.741935484 4.838709677 14.795606896 17.903225806 +7.741935484 5.161290323 15.430252399 18.763440860 +7.741935484 5.483870968 16.305345082 19.623655914 +7.741935484 5.806451613 17.225621817 20.483870968 +7.741935484 6.129032258 18.227035950 21.344086022 +7.741935484 6.451612903 19.356366279 22.204301075 +7.741935484 6.774193548 20.682807170 23.064516129 +7.741935484 7.096774194 22.303013754 23.924731183 +7.741935484 7.419354839 24.380408194 24.784946237 +7.741935484 7.741935484 25.001049790 25.000000000 +7.741935484 8.064516129 25.001049790 25.000000000 +7.741935484 8.387096774 25.001049790 25.000000000 +7.741935484 8.709677419 25.001049790 25.000000000 +7.741935484 9.032258065 25.001049790 25.000000000 +7.741935484 9.354838710 25.001049790 25.000000000 +7.741935484 9.677419355 25.001049790 25.000000000 +7.741935484 10.000000000 25.001049790 25.000000000 +8.064516129 0.000000000 13.570706205 11.666666667 +8.064516129 0.322580645 13.570706205 11.666666667 +8.064516129 0.645161290 13.570706205 11.666666667 +8.064516129 0.967741935 13.570706205 11.666666667 +8.064516129 1.290322581 13.570706205 11.666666667 +8.064516129 1.612903226 13.570706205 11.666666667 +8.064516129 1.935483871 13.570706205 11.666666667 +8.064516129 2.258064516 13.570706205 11.666666667 +8.064516129 2.580645161 13.572517919 11.881720430 +8.064516129 2.903225806 13.603707815 12.741935484 +8.064516129 3.225806452 13.676532623 13.602150538 +8.064516129 3.548387097 13.793124575 14.462365591 +8.064516129 3.870967742 13.957010447 15.322580645 +8.064516129 4.193548387 14.173387937 16.182795699 +8.064516129 4.516129032 14.449561083 17.043010753 +8.064516129 4.838709677 14.795606896 17.903225806 +8.064516129 5.161290323 15.430252399 18.763440860 +8.064516129 5.483870968 16.305345082 19.623655914 +8.064516129 5.806451613 17.225621817 20.483870968 +8.064516129 6.129032258 18.227035950 21.344086022 +8.064516129 6.451612903 19.356366279 22.204301075 +8.064516129 6.774193548 20.682807170 23.064516129 +8.064516129 7.096774194 22.303013754 23.924731183 +8.064516129 7.419354839 24.380408194 24.784946237 +8.064516129 7.741935484 25.001049790 25.000000000 +8.064516129 8.064516129 25.001049790 25.000000000 +8.064516129 8.387096774 25.001049790 25.000000000 +8.064516129 8.709677419 25.001049790 25.000000000 +8.064516129 9.032258065 25.001049790 25.000000000 +8.064516129 9.354838710 25.001049790 25.000000000 +8.064516129 9.677419355 25.001049790 25.000000000 +8.064516129 10.000000000 25.001049790 25.000000000 +8.387096774 0.000000000 13.570706205 11.666666667 +8.387096774 0.322580645 13.570706205 11.666666667 +8.387096774 0.645161290 13.570706205 11.666666667 +8.387096774 0.967741935 13.570706205 11.666666667 +8.387096774 1.290322581 13.570706205 11.666666667 +8.387096774 1.612903226 13.570706205 11.666666667 +8.387096774 1.935483871 13.570706205 11.666666667 +8.387096774 2.258064516 13.570706205 11.666666667 +8.387096774 2.580645161 13.572517919 11.881720430 +8.387096774 2.903225806 13.603707815 12.741935484 +8.387096774 3.225806452 13.676532623 13.602150538 +8.387096774 3.548387097 13.793124575 14.462365591 +8.387096774 3.870967742 13.957010447 15.322580645 +8.387096774 4.193548387 14.173387937 16.182795699 +8.387096774 4.516129032 14.449561083 17.043010753 +8.387096774 4.838709677 14.795606896 17.903225806 +8.387096774 5.161290323 15.430252399 18.763440860 +8.387096774 5.483870968 16.305345082 19.623655914 +8.387096774 5.806451613 17.225621817 20.483870968 +8.387096774 6.129032258 18.227035950 21.344086022 +8.387096774 6.451612903 19.356366279 22.204301075 +8.387096774 6.774193548 20.682807170 23.064516129 +8.387096774 7.096774194 22.303013754 23.924731183 +8.387096774 7.419354839 24.380408194 24.784946237 +8.387096774 7.741935484 25.001049790 25.000000000 +8.387096774 8.064516129 25.001049790 25.000000000 +8.387096774 8.387096774 25.001049790 25.000000000 +8.387096774 8.709677419 25.001049790 25.000000000 +8.387096774 9.032258065 25.001049790 25.000000000 +8.387096774 9.354838710 25.001049790 25.000000000 +8.387096774 9.677419355 25.001049790 25.000000000 +8.387096774 10.000000000 25.001049790 25.000000000 +8.709677419 0.000000000 13.570706205 11.666666667 +8.709677419 0.322580645 13.570706205 11.666666667 +8.709677419 0.645161290 13.570706205 11.666666667 +8.709677419 0.967741935 13.570706205 11.666666667 +8.709677419 1.290322581 13.570706205 11.666666667 +8.709677419 1.612903226 13.570706205 11.666666667 +8.709677419 1.935483871 13.570706205 11.666666667 +8.709677419 2.258064516 13.570706205 11.666666667 +8.709677419 2.580645161 13.572517919 11.881720430 +8.709677419 2.903225806 13.603707815 12.741935484 +8.709677419 3.225806452 13.676532623 13.602150538 +8.709677419 3.548387097 13.793124575 14.462365591 +8.709677419 3.870967742 13.957010447 15.322580645 +8.709677419 4.193548387 14.173387937 16.182795699 +8.709677419 4.516129032 14.449561083 17.043010753 +8.709677419 4.838709677 14.795606896 17.903225806 +8.709677419 5.161290323 15.430252399 18.763440860 +8.709677419 5.483870968 16.305345082 19.623655914 +8.709677419 5.806451613 17.225621817 20.483870968 +8.709677419 6.129032258 18.227035950 21.344086022 +8.709677419 6.451612903 19.356366279 22.204301075 +8.709677419 6.774193548 20.682807170 23.064516129 +8.709677419 7.096774194 22.303013754 23.924731183 +8.709677419 7.419354839 24.380408194 24.784946237 +8.709677419 7.741935484 25.001049790 25.000000000 +8.709677419 8.064516129 25.001049790 25.000000000 +8.709677419 8.387096774 25.001049790 25.000000000 +8.709677419 8.709677419 25.001049790 25.000000000 +8.709677419 9.032258065 25.001049790 25.000000000 +8.709677419 9.354838710 25.001049790 25.000000000 +8.709677419 9.677419355 25.001049790 25.000000000 +8.709677419 10.000000000 25.001049790 25.000000000 +9.032258065 0.000000000 13.570706205 11.666666667 +9.032258065 0.322580645 13.570706205 11.666666667 +9.032258065 0.645161290 13.570706205 11.666666667 +9.032258065 0.967741935 13.570706205 11.666666667 +9.032258065 1.290322581 13.570706205 11.666666667 +9.032258065 1.612903226 13.570706205 11.666666667 +9.032258065 1.935483871 13.570706205 11.666666667 +9.032258065 2.258064516 13.570706205 11.666666667 +9.032258065 2.580645161 13.572517919 11.881720430 +9.032258065 2.903225806 13.603707815 12.741935484 +9.032258065 3.225806452 13.676532623 13.602150538 +9.032258065 3.548387097 13.793124575 14.462365591 +9.032258065 3.870967742 13.957010447 15.322580645 +9.032258065 4.193548387 14.173387937 16.182795699 +9.032258065 4.516129032 14.449561083 17.043010753 +9.032258065 4.838709677 14.795606896 17.903225806 +9.032258065 5.161290323 15.430252399 18.763440860 +9.032258065 5.483870968 16.305345082 19.623655914 +9.032258065 5.806451613 17.225621817 20.483870968 +9.032258065 6.129032258 18.227035950 21.344086022 +9.032258065 6.451612903 19.356366279 22.204301075 +9.032258065 6.774193548 20.682807170 23.064516129 +9.032258065 7.096774194 22.303013754 23.924731183 +9.032258065 7.419354839 24.380408194 24.784946237 +9.032258065 7.741935484 25.001049790 25.000000000 +9.032258065 8.064516129 25.001049790 25.000000000 +9.032258065 8.387096774 25.001049790 25.000000000 +9.032258065 8.709677419 25.001049790 25.000000000 +9.032258065 9.032258065 25.001049790 25.000000000 +9.032258065 9.354838710 25.001049790 25.000000000 +9.032258065 9.677419355 25.001049790 25.000000000 +9.032258065 10.000000000 25.001049790 25.000000000 +9.354838710 0.000000000 13.570706205 11.666666667 +9.354838710 0.322580645 13.570706205 11.666666667 +9.354838710 0.645161290 13.570706205 11.666666667 +9.354838710 0.967741935 13.570706205 11.666666667 +9.354838710 1.290322581 13.570706205 11.666666667 +9.354838710 1.612903226 13.570706205 11.666666667 +9.354838710 1.935483871 13.570706205 11.666666667 +9.354838710 2.258064516 13.570706205 11.666666667 +9.354838710 2.580645161 13.572517919 11.881720430 +9.354838710 2.903225806 13.603707815 12.741935484 +9.354838710 3.225806452 13.676532623 13.602150538 +9.354838710 3.548387097 13.793124575 14.462365591 +9.354838710 3.870967742 13.957010447 15.322580645 +9.354838710 4.193548387 14.173387937 16.182795699 +9.354838710 4.516129032 14.449561083 17.043010753 +9.354838710 4.838709677 14.795606896 17.903225806 +9.354838710 5.161290323 15.430252399 18.763440860 +9.354838710 5.483870968 16.305345082 19.623655914 +9.354838710 5.806451613 17.225621817 20.483870968 +9.354838710 6.129032258 18.227035950 21.344086022 +9.354838710 6.451612903 19.356366279 22.204301075 +9.354838710 6.774193548 20.682807170 23.064516129 +9.354838710 7.096774194 22.303013754 23.924731183 +9.354838710 7.419354839 24.380408194 24.784946237 +9.354838710 7.741935484 25.001049790 25.000000000 +9.354838710 8.064516129 25.001049790 25.000000000 +9.354838710 8.387096774 25.001049790 25.000000000 +9.354838710 8.709677419 25.001049790 25.000000000 +9.354838710 9.032258065 25.001049790 25.000000000 +9.354838710 9.354838710 25.001049790 25.000000000 +9.354838710 9.677419355 25.001049790 25.000000000 +9.354838710 10.000000000 25.001049790 25.000000000 +9.677419355 0.000000000 13.570706205 11.666666667 +9.677419355 0.322580645 13.570706205 11.666666667 +9.677419355 0.645161290 13.570706205 11.666666667 +9.677419355 0.967741935 13.570706205 11.666666667 +9.677419355 1.290322581 13.570706205 11.666666667 +9.677419355 1.612903226 13.570706205 11.666666667 +9.677419355 1.935483871 13.570706205 11.666666667 +9.677419355 2.258064516 13.570706205 11.666666667 +9.677419355 2.580645161 13.572517919 11.881720430 +9.677419355 2.903225806 13.603707815 12.741935484 +9.677419355 3.225806452 13.676532623 13.602150538 +9.677419355 3.548387097 13.793124575 14.462365591 +9.677419355 3.870967742 13.957010447 15.322580645 +9.677419355 4.193548387 14.173387937 16.182795699 +9.677419355 4.516129032 14.449561083 17.043010753 +9.677419355 4.838709677 14.795606896 17.903225806 +9.677419355 5.161290323 15.430252399 18.763440860 +9.677419355 5.483870968 16.305345082 19.623655914 +9.677419355 5.806451613 17.225621817 20.483870968 +9.677419355 6.129032258 18.227035950 21.344086022 +9.677419355 6.451612903 19.356366279 22.204301075 +9.677419355 6.774193548 20.682807170 23.064516129 +9.677419355 7.096774194 22.303013754 23.924731183 +9.677419355 7.419354839 24.380408194 24.784946237 +9.677419355 7.741935484 25.001049790 25.000000000 +9.677419355 8.064516129 25.001049790 25.000000000 +9.677419355 8.387096774 25.001049790 25.000000000 +9.677419355 8.709677419 25.001049790 25.000000000 +9.677419355 9.032258065 25.001049790 25.000000000 +9.677419355 9.354838710 25.001049790 25.000000000 +9.677419355 9.677419355 25.001049790 25.000000000 +9.677419355 10.000000000 25.001049790 25.000000000 +10.000000000 0.000000000 13.570706205 11.666666667 +10.000000000 0.322580645 13.570706205 11.666666667 +10.000000000 0.645161290 13.570706205 11.666666667 +10.000000000 0.967741935 13.570706205 11.666666667 +10.000000000 1.290322581 13.570706205 11.666666667 +10.000000000 1.612903226 13.570706205 11.666666667 +10.000000000 1.935483871 13.570706205 11.666666667 +10.000000000 2.258064516 13.570706205 11.666666667 +10.000000000 2.580645161 13.572517919 11.881720430 +10.000000000 2.903225806 13.603707815 12.741935484 +10.000000000 3.225806452 13.676532623 13.602150538 +10.000000000 3.548387097 13.793124575 14.462365591 +10.000000000 3.870967742 13.957010447 15.322580645 +10.000000000 4.193548387 14.173387937 16.182795699 +10.000000000 4.516129032 14.449561083 17.043010753 +10.000000000 4.838709677 14.795606896 17.903225806 +10.000000000 5.161290323 15.430252399 18.763440860 +10.000000000 5.483870968 16.305345082 19.623655914 +10.000000000 5.806451613 17.225621817 20.483870968 +10.000000000 6.129032258 18.227035950 21.344086022 +10.000000000 6.451612903 19.356366279 22.204301075 +10.000000000 6.774193548 20.682807170 23.064516129 +10.000000000 7.096774194 22.303013754 23.924731183 +10.000000000 7.419354839 24.380408194 24.784946237 +10.000000000 7.741935484 25.001049790 25.000000000 +10.000000000 8.064516129 25.001049790 25.000000000 +10.000000000 8.387096774 25.001049790 25.000000000 +10.000000000 8.709677419 25.001049790 25.000000000 +10.000000000 9.032258065 25.001049790 25.000000000 +10.000000000 9.354838710 25.001049790 25.000000000 +10.000000000 9.677419355 25.001049790 25.000000000 +10.000000000 10.000000000 25.001049790 25.000000000 diff --git a/examples/hybrid/tipper.fll b/examples/hybrid/tipper.fll new file mode 100644 index 0000000..cb8803f --- /dev/null +++ b/examples/hybrid/tipper.fll @@ -0,0 +1,63 @@ +Engine: tipper +description: (service and food) -> (tip) +InputVariable: service + description: quality of service + enabled: true + range: 0.000 10.000 + lock-range: true + term: poor Trapezoid 0.000 0.000 2.500 5.000 + term: good Triangle 2.500 5.000 7.500 + term: excellent Trapezoid 5.000 7.500 10.000 10.000 +InputVariable: food + description: quality of food + enabled: true + range: 0.000 10.000 + lock-range: true + term: rancid Trapezoid 0.000 0.000 2.500 7.500 + term: delicious Trapezoid 2.500 7.500 10.000 10.000 +OutputVariable: mTip + description: tip based on Mamdani inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: cheap Triangle 0.000 5.000 10.000 + term: average Triangle 10.000 15.000 20.000 + term: generous Triangle 20.000 25.000 30.000 +OutputVariable: tsTip + description: tip based on Takagi-Sugeno inference + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: cheap Constant 5.000 + term: average Constant 15.000 + term: generous Constant 25.000 +RuleBlock: mamdani + description: Mamdani inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: Minimum + activation: General + rule: if service is poor or food is rancid then mTip is cheap + rule: if service is good then mTip is average + rule: if service is excellent or food is delicious then mTip is generous with 0.5 + rule: if service is excellent and food is delicious then mTip is generous with 1.0 +RuleBlock: takagiSugeno + description: Takagi-Sugeno inference + enabled: true + conjunction: AlgebraicProduct + disjunction: AlgebraicSum + implication: none + activation: General + rule: if service is poor or food is rancid then tsTip is cheap + rule: if service is good then tsTip is average + rule: if service is excellent or food is delicious then tsTip is generous with 0.5 + rule: if service is excellent and food is delicious then tsTip is generous with 1.0
\ No newline at end of file diff --git a/examples/hybrid/tipper.java b/examples/hybrid/tipper.java new file mode 100644 index 0000000..e0578ca --- /dev/null +++ b/examples/hybrid/tipper.java @@ -0,0 +1,103 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class tipper{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("tipper"); +engine.setDescription("(service and food) -> (tip)"); + +InputVariable service = new InputVariable(); +service.setName("service"); +service.setDescription("quality of service"); +service.setEnabled(true); +service.setRange(0.000, 10.000); +service.setLockValueInRange(true); +service.addTerm(new Trapezoid("poor", 0.000, 0.000, 2.500, 5.000)); +service.addTerm(new Triangle("good", 2.500, 5.000, 7.500)); +service.addTerm(new Trapezoid("excellent", 5.000, 7.500, 10.000, 10.000)); +engine.addInputVariable(service); + +InputVariable food = new InputVariable(); +food.setName("food"); +food.setDescription("quality of food"); +food.setEnabled(true); +food.setRange(0.000, 10.000); +food.setLockValueInRange(true); +food.addTerm(new Trapezoid("rancid", 0.000, 0.000, 2.500, 7.500)); +food.addTerm(new Trapezoid("delicious", 2.500, 7.500, 10.000, 10.000)); +engine.addInputVariable(food); + +OutputVariable mTip = new OutputVariable(); +mTip.setName("mTip"); +mTip.setDescription("tip based on Mamdani inference"); +mTip.setEnabled(true); +mTip.setRange(0.000, 30.000); +mTip.setLockValueInRange(false); +mTip.setAggregation(new Maximum()); +mTip.setDefuzzifier(new Centroid(100)); +mTip.setDefaultValue(Double.NaN); +mTip.setLockPreviousValue(false); +mTip.addTerm(new Triangle("cheap", 0.000, 5.000, 10.000)); +mTip.addTerm(new Triangle("average", 10.000, 15.000, 20.000)); +mTip.addTerm(new Triangle("generous", 20.000, 25.000, 30.000)); +engine.addOutputVariable(mTip); + +OutputVariable tsTip = new OutputVariable(); +tsTip.setName("tsTip"); +tsTip.setDescription("tip based on Takagi-Sugeno inference"); +tsTip.setEnabled(true); +tsTip.setRange(0.000, 30.000); +tsTip.setLockValueInRange(false); +tsTip.setAggregation(null); +tsTip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +tsTip.setDefaultValue(Double.NaN); +tsTip.setLockPreviousValue(false); +tsTip.addTerm(new Constant("cheap", 5.000)); +tsTip.addTerm(new Constant("average", 15.000)); +tsTip.addTerm(new Constant("generous", 25.000)); +engine.addOutputVariable(tsTip); + +RuleBlock mamdani = new RuleBlock(); +mamdani.setName("mamdani"); +mamdani.setDescription("Mamdani inference"); +mamdani.setEnabled(true); +mamdani.setConjunction(new AlgebraicProduct()); +mamdani.setDisjunction(new AlgebraicSum()); +mamdani.setImplication(new Minimum()); +mamdani.setActivation(new General()); +mamdani.addRule(Rule.parse("if service is poor or food is rancid then mTip is cheap", engine)); +mamdani.addRule(Rule.parse("if service is good then mTip is average", engine)); +mamdani.addRule(Rule.parse("if service is excellent or food is delicious then mTip is generous with 0.5", engine)); +mamdani.addRule(Rule.parse("if service is excellent and food is delicious then mTip is generous with 1.0", engine)); +engine.addRuleBlock(mamdani); + +RuleBlock takagiSugeno = new RuleBlock(); +takagiSugeno.setName("takagiSugeno"); +takagiSugeno.setDescription("Takagi-Sugeno inference"); +takagiSugeno.setEnabled(true); +takagiSugeno.setConjunction(new AlgebraicProduct()); +takagiSugeno.setDisjunction(new AlgebraicSum()); +takagiSugeno.setImplication(null); +takagiSugeno.setActivation(new General()); +takagiSugeno.addRule(Rule.parse("if service is poor or food is rancid then tsTip is cheap", engine)); +takagiSugeno.addRule(Rule.parse("if service is good then tsTip is average", engine)); +takagiSugeno.addRule(Rule.parse("if service is excellent or food is delicious then tsTip is generous with 0.5", engine)); +takagiSugeno.addRule(Rule.parse("if service is excellent and food is delicious then tsTip is generous with 1.0", engine)); +engine.addRuleBlock(takagiSugeno); + + +} +} diff --git a/examples/hybrid/tipper.pdf b/examples/hybrid/tipper.pdf Binary files differnew file mode 100644 index 0000000..482e9cc --- /dev/null +++ b/examples/hybrid/tipper.pdf diff --git a/examples/mamdani/AllTerms.R b/examples/mamdani/AllTerms.R new file mode 100644 index 0000000..1b17463 --- /dev/null +++ b/examples/mamdani/AllTerms.R @@ -0,0 +1,111 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "AllTerms" +engine.fll = "Engine: AllTerms +InputVariable: AllInputTerms + enabled: true + range: 0.000 6.500 + lock-range: false + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +OutputVariable: AllOutputTerms + enabled: true + range: 0.000 6.500 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if AllInputTerms is A then AllOutputTerms is T + rule: if AllInputTerms is B then AllOutputTerms is S + rule: if AllInputTerms is C then AllOutputTerms is R + rule: if AllInputTerms is D then AllOutputTerms is Q + rule: if AllInputTerms is E then AllOutputTerms is P + rule: if AllInputTerms is F then AllOutputTerms is O + rule: if AllInputTerms is G then AllOutputTerms is N + rule: if AllInputTerms is H then AllOutputTerms is M + rule: if AllInputTerms is I then AllOutputTerms is L + rule: if AllInputTerms is J then AllOutputTerms is K + rule: if AllInputTerms is K then AllOutputTerms is J + rule: if AllInputTerms is L then AllOutputTerms is I + rule: if AllInputTerms is M then AllOutputTerms is H + rule: if AllInputTerms is N then AllOutputTerms is G + rule: if AllInputTerms is O then AllOutputTerms is F + rule: if AllInputTerms is P then AllOutputTerms is E + rule: if AllInputTerms is Q then AllOutputTerms is D + rule: if AllInputTerms is R then AllOutputTerms is C + rule: if AllInputTerms is S then AllOutputTerms is B + rule: if AllInputTerms is T then AllOutputTerms is A" + +engine.fldFile = "AllTerms.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(AllInputTerms, AllOutputTerms)) + + geom_line(aes(color=AllOutputTerms), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("AllInputTerms vs AllOutputTerms") + +engine.plot.o1_i1 = ggplot(engine.df, aes(AllInputTerms, AllOutputTerms)) + + geom_line(aes(color=AllOutputTerms), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("AllOutputTerms vs AllInputTerms") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/AllTerms.cpp b/examples/mamdani/AllTerms.cpp new file mode 100644 index 0000000..3d96ef5 --- /dev/null +++ b/examples/mamdani/AllTerms.cpp @@ -0,0 +1,103 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("AllTerms"); +engine->setDescription(""); + +InputVariable* AllInputTerms = new InputVariable; +AllInputTerms->setName("AllInputTerms"); +AllInputTerms->setDescription(""); +AllInputTerms->setEnabled(true); +AllInputTerms->setRange(0.000, 6.500); +AllInputTerms->setLockValueInRange(false); +AllInputTerms->addTerm(new Sigmoid("A", 0.500, -20.000)); +AllInputTerms->addTerm(new ZShape("B", 0.000, 1.000)); +AllInputTerms->addTerm(new Ramp("C", 1.000, 0.000)); +AllInputTerms->addTerm(new Triangle("D", 0.500, 1.000, 1.500)); +AllInputTerms->addTerm(new Trapezoid("E", 1.000, 1.250, 1.750, 2.000)); +AllInputTerms->addTerm(new Concave("F", 0.850, 0.250)); +AllInputTerms->addTerm(new Rectangle("G", 1.750, 2.250)); +AllInputTerms->addTerm(Discrete::create("H", 10, 2.000, 0.000, 2.250, 1.000, 2.500, 0.500, 2.750, 1.000, 3.000, 0.000)); +AllInputTerms->addTerm(new Gaussian("I", 3.000, 0.200)); +AllInputTerms->addTerm(new Cosine("J", 3.250, 0.650)); +AllInputTerms->addTerm(new GaussianProduct("K", 3.500, 0.100, 3.300, 0.300)); +AllInputTerms->addTerm(new Spike("L", 3.640, 1.040)); +AllInputTerms->addTerm(new Bell("M", 4.000, 0.250, 3.000)); +AllInputTerms->addTerm(new PiShape("N", 4.000, 4.500, 4.500, 5.000)); +AllInputTerms->addTerm(new Concave("O", 5.650, 6.250)); +AllInputTerms->addTerm(new SigmoidDifference("P", 4.750, 10.000, 30.000, 5.250)); +AllInputTerms->addTerm(new SigmoidProduct("Q", 5.250, 20.000, -10.000, 5.750)); +AllInputTerms->addTerm(new Ramp("R", 5.500, 6.500)); +AllInputTerms->addTerm(new SShape("S", 5.500, 6.500)); +AllInputTerms->addTerm(new Sigmoid("T", 6.000, 20.000)); +engine->addInputVariable(AllInputTerms); + +OutputVariable* AllOutputTerms = new OutputVariable; +AllOutputTerms->setName("AllOutputTerms"); +AllOutputTerms->setDescription(""); +AllOutputTerms->setEnabled(true); +AllOutputTerms->setRange(0.000, 6.500); +AllOutputTerms->setLockValueInRange(false); +AllOutputTerms->setAggregation(new Maximum); +AllOutputTerms->setDefuzzifier(new Centroid(200)); +AllOutputTerms->setDefaultValue(fl::nan); +AllOutputTerms->setLockPreviousValue(false); +AllOutputTerms->addTerm(new Sigmoid("A", 0.500, -20.000)); +AllOutputTerms->addTerm(new ZShape("B", 0.000, 1.000)); +AllOutputTerms->addTerm(new Ramp("C", 1.000, 0.000)); +AllOutputTerms->addTerm(new Triangle("D", 0.500, 1.000, 1.500)); +AllOutputTerms->addTerm(new Trapezoid("E", 1.000, 1.250, 1.750, 2.000)); +AllOutputTerms->addTerm(new Concave("F", 0.850, 0.250)); +AllOutputTerms->addTerm(new Rectangle("G", 1.750, 2.250)); +AllOutputTerms->addTerm(Discrete::create("H", 10, 2.000, 0.000, 2.250, 1.000, 2.500, 0.500, 2.750, 1.000, 3.000, 0.000)); +AllOutputTerms->addTerm(new Gaussian("I", 3.000, 0.200)); +AllOutputTerms->addTerm(new Cosine("J", 3.250, 0.650)); +AllOutputTerms->addTerm(new GaussianProduct("K", 3.500, 0.100, 3.300, 0.300)); +AllOutputTerms->addTerm(new Spike("L", 3.640, 1.040)); +AllOutputTerms->addTerm(new Bell("M", 4.000, 0.250, 3.000)); +AllOutputTerms->addTerm(new PiShape("N", 4.000, 4.500, 4.500, 5.000)); +AllOutputTerms->addTerm(new Concave("O", 5.650, 6.250)); +AllOutputTerms->addTerm(new SigmoidDifference("P", 4.750, 10.000, 30.000, 5.250)); +AllOutputTerms->addTerm(new SigmoidProduct("Q", 5.250, 20.000, -10.000, 5.750)); +AllOutputTerms->addTerm(new Ramp("R", 5.500, 6.500)); +AllOutputTerms->addTerm(new SShape("S", 5.500, 6.500)); +AllOutputTerms->addTerm(new Sigmoid("T", 6.000, 20.000)); +engine->addOutputVariable(AllOutputTerms); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new Minimum); +ruleBlock->setDisjunction(new Maximum); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if AllInputTerms is A then AllOutputTerms is T", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is B then AllOutputTerms is S", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is C then AllOutputTerms is R", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is D then AllOutputTerms is Q", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is E then AllOutputTerms is P", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is F then AllOutputTerms is O", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is G then AllOutputTerms is N", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is H then AllOutputTerms is M", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is I then AllOutputTerms is L", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is J then AllOutputTerms is K", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is K then AllOutputTerms is J", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is L then AllOutputTerms is I", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is M then AllOutputTerms is H", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is N then AllOutputTerms is G", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is O then AllOutputTerms is F", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is P then AllOutputTerms is E", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is Q then AllOutputTerms is D", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is R then AllOutputTerms is C", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is S then AllOutputTerms is B", engine)); +ruleBlock->addRule(Rule::parse("if AllInputTerms is T then AllOutputTerms is A", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/AllTerms.fcl b/examples/mamdani/AllTerms.fcl new file mode 100644 index 0000000..0c56fd6 --- /dev/null +++ b/examples/mamdani/AllTerms.fcl @@ -0,0 +1,90 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK AllTerms + +VAR_INPUT + AllInputTerms: REAL; +END_VAR + +VAR_OUTPUT + AllOutputTerms: REAL; +END_VAR + +FUZZIFY AllInputTerms + RANGE := (0.000 .. 6.500); + TERM A := Sigmoid 0.500 -20.000; + TERM B := ZShape 0.000 1.000; + TERM C := Ramp 1.000 0.000; + TERM D := Triangle 0.500 1.000 1.500; + TERM E := Trapezoid 1.000 1.250 1.750 2.000; + TERM F := Concave 0.850 0.250; + TERM G := Rectangle 1.750 2.250; + TERM H := (2.000, 0.000) (2.250, 1.000) (2.500, 0.500) (2.750, 1.000) (3.000, 0.000); + TERM I := Gaussian 3.000 0.200; + TERM J := Cosine 3.250 0.650; + TERM K := GaussianProduct 3.500 0.100 3.300 0.300; + TERM L := Spike 3.640 1.040; + TERM M := Bell 4.000 0.250 3.000; + TERM N := PiShape 4.000 4.500 4.500 5.000; + TERM O := Concave 5.650 6.250; + TERM P := SigmoidDifference 4.750 10.000 30.000 5.250; + TERM Q := SigmoidProduct 5.250 20.000 -10.000 5.750; + TERM R := Ramp 5.500 6.500; + TERM S := SShape 5.500 6.500; + TERM T := Sigmoid 6.000 20.000; +END_FUZZIFY + +DEFUZZIFY AllOutputTerms + RANGE := (0.000 .. 6.500); + TERM A := Sigmoid 0.500 -20.000; + TERM B := ZShape 0.000 1.000; + TERM C := Ramp 1.000 0.000; + TERM D := Triangle 0.500 1.000 1.500; + TERM E := Trapezoid 1.000 1.250 1.750 2.000; + TERM F := Concave 0.850 0.250; + TERM G := Rectangle 1.750 2.250; + TERM H := (2.000, 0.000) (2.250, 1.000) (2.500, 0.500) (2.750, 1.000) (3.000, 0.000); + TERM I := Gaussian 3.000 0.200; + TERM J := Cosine 3.250 0.650; + TERM K := GaussianProduct 3.500 0.100 3.300 0.300; + TERM L := Spike 3.640 1.040; + TERM M := Bell 4.000 0.250 3.000; + TERM N := PiShape 4.000 4.500 4.500 5.000; + TERM O := Concave 5.650 6.250; + TERM P := SigmoidDifference 4.750 10.000 30.000 5.250; + TERM Q := SigmoidProduct 5.250 20.000 -10.000 5.750; + TERM R := Ramp 5.500 6.500; + TERM S := SShape 5.500 6.500; + TERM T := Sigmoid 6.000 20.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : MIN; + OR : MAX; + ACT : MIN; + RULE 1 : if AllInputTerms is A then AllOutputTerms is T + RULE 2 : if AllInputTerms is B then AllOutputTerms is S + RULE 3 : if AllInputTerms is C then AllOutputTerms is R + RULE 4 : if AllInputTerms is D then AllOutputTerms is Q + RULE 5 : if AllInputTerms is E then AllOutputTerms is P + RULE 6 : if AllInputTerms is F then AllOutputTerms is O + RULE 7 : if AllInputTerms is G then AllOutputTerms is N + RULE 8 : if AllInputTerms is H then AllOutputTerms is M + RULE 9 : if AllInputTerms is I then AllOutputTerms is L + RULE 10 : if AllInputTerms is J then AllOutputTerms is K + RULE 11 : if AllInputTerms is K then AllOutputTerms is J + RULE 12 : if AllInputTerms is L then AllOutputTerms is I + RULE 13 : if AllInputTerms is M then AllOutputTerms is H + RULE 14 : if AllInputTerms is N then AllOutputTerms is G + RULE 15 : if AllInputTerms is O then AllOutputTerms is F + RULE 16 : if AllInputTerms is P then AllOutputTerms is E + RULE 17 : if AllInputTerms is Q then AllOutputTerms is D + RULE 18 : if AllInputTerms is R then AllOutputTerms is C + RULE 19 : if AllInputTerms is S then AllOutputTerms is B + RULE 20 : if AllInputTerms is T then AllOutputTerms is A +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/AllTerms.fis b/examples/mamdani/AllTerms.fis new file mode 100644 index 0000000..d34e487 --- /dev/null +++ b/examples/mamdani/AllTerms.fis @@ -0,0 +1,86 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='AllTerms' +Type='mamdani' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=20 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='AllInputTerms' +Range=[0.000 6.500] +NumMFs=20 +MF1='A':'sigmf',[-20.000 0.500] +MF2='B':'zmf',[0.000 1.000] +MF3='C':'rampmf',[1.000 0.000] +MF4='D':'trimf',[0.500 1.000 1.500] +MF5='E':'trapmf',[1.000 1.250 1.750 2.000] +MF6='F':'concavemf',[0.850 0.250] +MF7='G':'rectmf',[1.750 2.250] +MF8='H':'discretemf',[2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000] +MF9='I':'gaussmf',[0.200 3.000] +MF10='J':'cosinemf',[3.250 0.650] +MF11='K':'gauss2mf',[0.100 3.500 0.300 3.300] +MF12='L':'spikemf',[3.640 1.040] +MF13='M':'gbellmf',[0.250 3.000 4.000] +MF14='N':'pimf',[4.000 4.500 4.500 5.000] +MF15='O':'concavemf',[5.650 6.250] +MF16='P':'dsigmf',[10.000 4.750 30.000 5.250] +MF17='Q':'psigmf',[20.000 5.250 -10.000 5.750] +MF18='R':'rampmf',[5.500 6.500] +MF19='S':'smf',[5.500 6.500] +MF20='T':'sigmf',[20.000 6.000] + +[Output1] +Name='AllOutputTerms' +Range=[0.000 6.500] +NumMFs=20 +MF1='A':'sigmf',[-20.000 0.500] +MF2='B':'zmf',[0.000 1.000] +MF3='C':'rampmf',[1.000 0.000] +MF4='D':'trimf',[0.500 1.000 1.500] +MF5='E':'trapmf',[1.000 1.250 1.750 2.000] +MF6='F':'concavemf',[0.850 0.250] +MF7='G':'rectmf',[1.750 2.250] +MF8='H':'discretemf',[2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000] +MF9='I':'gaussmf',[0.200 3.000] +MF10='J':'cosinemf',[3.250 0.650] +MF11='K':'gauss2mf',[0.100 3.500 0.300 3.300] +MF12='L':'spikemf',[3.640 1.040] +MF13='M':'gbellmf',[0.250 3.000 4.000] +MF14='N':'pimf',[4.000 4.500 4.500 5.000] +MF15='O':'concavemf',[5.650 6.250] +MF16='P':'dsigmf',[10.000 4.750 30.000 5.250] +MF17='Q':'psigmf',[20.000 5.250 -10.000 5.750] +MF18='R':'rampmf',[5.500 6.500] +MF19='S':'smf',[5.500 6.500] +MF20='T':'sigmf',[20.000 6.000] + +[Rules] +1.000 , 20.000 (1.000) : 1 +2.000 , 19.000 (1.000) : 1 +3.000 , 18.000 (1.000) : 1 +4.000 , 17.000 (1.000) : 1 +5.000 , 16.000 (1.000) : 1 +6.000 , 15.000 (1.000) : 1 +7.000 , 14.000 (1.000) : 1 +8.000 , 13.000 (1.000) : 1 +9.000 , 12.000 (1.000) : 1 +10.000 , 11.000 (1.000) : 1 +11.000 , 10.000 (1.000) : 1 +12.000 , 9.000 (1.000) : 1 +13.000 , 8.000 (1.000) : 1 +14.000 , 7.000 (1.000) : 1 +15.000 , 6.000 (1.000) : 1 +16.000 , 5.000 (1.000) : 1 +17.000 , 4.000 (1.000) : 1 +18.000 , 3.000 (1.000) : 1 +19.000 , 2.000 (1.000) : 1 +20.000 , 1.000 (1.000) : 1 diff --git a/examples/mamdani/AllTerms.fld b/examples/mamdani/AllTerms.fld new file mode 100644 index 0000000..b765a5b --- /dev/null +++ b/examples/mamdani/AllTerms.fld @@ -0,0 +1,1025 @@ +AllInputTerms AllOutputTerms +0.000000000 4.599895277 +0.006353861 4.599895277 +0.012707722 4.599895277 +0.019061584 4.599892153 +0.025415445 4.599885084 +0.031769306 4.599878001 +0.038123167 4.599870905 +0.044477028 4.599863796 +0.050830890 4.599854356 +0.057184751 4.599840135 +0.063538612 4.599825888 +0.069892473 4.599811614 +0.076246334 4.599797313 +0.082600196 4.599781479 +0.088954057 4.599760024 +0.095307918 4.599738529 +0.101661779 4.599716994 +0.108015640 4.599695418 +0.114369501 4.599673109 +0.120723363 4.599644337 +0.127077224 4.599615510 +0.133431085 4.599586630 +0.139784946 4.599557695 +0.146138807 4.599528705 +0.152492669 4.599492655 +0.158846530 4.599456412 +0.165200391 4.599420101 +0.171554252 4.599383721 +0.177908113 4.599347272 +0.184261975 4.599304555 +0.190615836 4.599260809 +0.196969697 4.599216981 +0.203323558 4.599173070 +0.209677419 4.599129075 +0.216031281 4.599079607 +0.222385142 4.599028272 +0.228739003 4.598976839 +0.235092864 4.598925308 +0.241446725 4.598873679 +0.247800587 4.598817377 +0.254154448 4.596919174 +0.260508309 4.596493440 +0.266862170 4.596137632 +0.273216031 4.595742200 +0.279569892 4.595274723 +0.285923754 4.594727219 +0.292277615 4.594116008 +0.298631476 4.593432922 +0.304985337 4.592668807 +0.311339198 4.591776911 +0.317693060 4.590721701 +0.324046921 4.589539310 +0.330400782 4.588214154 +0.336754643 4.586728981 +0.343108504 4.585019129 +0.349462366 4.582986784 +0.355816227 4.580711102 +0.362170088 4.578164818 +0.368523949 4.575318436 +0.374877810 4.572092534 +0.381231672 4.568261237 +0.387585533 4.563994780 +0.393939394 4.559252552 +0.400293255 4.553992732 +0.406647116 4.548144994 +0.413000978 4.541249632 +0.419354839 4.533659657 +0.425708700 4.525333057 +0.432062561 4.516232199 +0.438416422 4.506325696 +0.444770283 4.496794792 +0.451124145 4.493710135 +0.457478006 4.490662106 +0.463831867 4.487650020 +0.470185728 4.484673209 +0.476539589 4.481579293 +0.482893451 4.478490131 +0.489247312 4.475435736 +0.495601173 4.472415487 +0.501955034 4.469428781 +0.508308895 4.466353820 +0.514662757 4.463264545 +0.521016618 4.460208273 +0.527370479 4.457184444 +0.533724340 4.454192506 +0.540078201 4.451137323 +0.546432063 4.448051381 +0.552785924 4.444996778 +0.559139785 4.441973003 +0.565493646 4.438979556 +0.571847507 4.435944616 +0.578201369 4.432864702 +0.584555230 4.429814557 +0.590909091 4.426793715 +0.597262952 4.423801721 +0.603616813 4.420787213 +0.609970674 4.417715418 +0.616324536 4.414671913 +0.622678397 4.411656273 +0.629032258 4.408668084 +0.635386119 4.405673984 +0.641739980 4.402611914 +0.648093842 4.399576742 +0.654447703 4.396568080 +0.660801564 4.393585550 +0.667155425 4.390611667 +0.673509286 4.387560536 +0.679863148 4.384534993 +0.686217009 4.381534685 +0.692570870 4.378803034 +0.698924731 4.376475128 +0.705278592 4.374472509 +0.711632454 4.372876293 +0.717986315 4.371667843 +0.724340176 4.370882078 +0.730694037 4.370495109 +0.737047898 4.370388857 +0.743401760 4.370642624 +0.749755621 4.371087594 +0.756109482 4.371809708 +0.762463343 4.372860066 +0.768817204 4.374172697 +0.775171065 4.375519338 +0.781524927 4.376944539 +0.787878788 4.378390691 +0.794232649 4.379857111 +0.800586510 4.381337853 +0.806940371 4.382825703 +0.813294233 4.383995232 +0.819648094 4.385184747 +0.826001955 4.386272381 +0.832355816 4.387263153 +0.838709677 4.388270397 +0.845063539 4.389218723 +0.851417400 4.389931993 +0.857771261 4.390665144 +0.864125122 4.391414233 +0.870478983 4.392178065 +0.876832845 4.392925336 +0.883186706 4.393405489 +0.889540567 4.393768439 +0.895894428 4.394047827 +0.902248289 4.394341121 +0.908602151 4.394414128 +0.914956012 4.394434726 +0.921309873 4.394473933 +0.927663734 4.394455866 +0.934017595 4.394023022 +0.940371457 4.393565645 +0.946725318 4.392979180 +0.953079179 4.392264873 +0.959433040 4.391194008 +0.965786901 4.389891155 +0.972140762 4.387967116 +0.978494624 4.386008929 +0.984848485 4.384078347 +0.991202346 4.382159658 +0.997556207 4.380245187 +1.003910068 4.378342248 +1.010263930 4.376450758 +1.016617791 4.374570582 +1.022971652 4.372701585 +1.029325513 4.370836957 +1.035679374 4.368777798 +1.042033236 4.366100940 +1.048387097 4.363131178 +1.054740958 4.359902890 +1.061094819 4.356444999 +1.067448680 4.352898808 +1.073802542 4.349689538 +1.080156403 4.347161282 +1.086510264 4.346117831 +1.092864125 4.346638603 +1.099217986 4.347588660 +1.105571848 4.348367496 +1.111925709 4.349145305 +1.118279570 4.349580392 +1.124633431 4.350038990 +1.130987292 4.350146966 +1.137341153 4.350021415 +1.143695015 4.349874085 +1.150048876 4.349738316 +1.156402737 4.349455770 +1.162756598 4.348792090 +1.169110459 4.348140830 +1.175464321 4.347318692 +1.181818182 4.346244887 +1.188172043 4.344696513 +1.194525904 4.342885325 +1.200879765 4.340822753 +1.207233627 4.338510265 +1.213587488 4.336156649 +1.219941349 4.333355362 +1.226295210 4.330137299 +1.232649071 4.326641602 +1.239002933 4.321989008 +1.245356794 4.316169893 +1.251710655 4.310255005 +1.258064516 4.304334601 +1.264418377 4.298371995 +1.270772239 4.292366629 +1.277126100 4.286098146 +1.283479961 4.279628008 +1.289833822 4.273099795 +1.296187683 4.266519469 +1.302541544 4.259886618 +1.308895406 4.253200509 +1.315249267 4.246299266 +1.321603128 4.240059447 +1.327956989 4.237953162 +1.334310850 4.235855128 +1.340664712 4.233765267 +1.347018573 4.231683504 +1.353372434 4.229604349 +1.359726295 4.227531097 +1.366080156 4.225465702 +1.372434018 4.223408091 +1.378787879 4.221358193 +1.385141740 4.219311371 +1.391495601 4.217269217 +1.397849462 4.215234545 +1.404203324 4.213207286 +1.410557185 4.211187374 +1.416911046 4.209171028 +1.423264907 4.207158130 +1.429618768 4.205152358 +1.435972630 4.203153647 +1.442326491 4.201161932 +1.448680352 4.199174293 +1.455034213 4.197188899 +1.461388074 4.195210291 +1.467741935 4.193238408 +1.474095797 4.191273188 +1.480449658 4.189312571 +1.486803519 4.187353011 +1.493157380 4.185399915 +1.499511241 4.183453221 +1.505865103 4.181512872 +1.512218964 4.179577670 +1.518572825 4.177642355 +1.524926686 4.175713192 +1.531280547 4.173790126 +1.537634409 4.171873100 +1.543988270 4.169961779 +1.550342131 4.168049188 +1.556695992 4.166142455 +1.563049853 4.164241525 +1.569403715 4.162346345 +1.575757576 4.160456860 +1.582111437 4.158566124 +1.588465298 4.156680384 +1.594819159 4.154800166 +1.601173021 4.152925419 +1.607526882 4.151056092 +1.613880743 4.149186104 +1.620234604 4.147319983 +1.626588465 4.145459116 +1.632942326 4.143603453 +1.639296188 4.141752946 +1.645650049 4.139902380 +1.652003910 4.138054566 +1.658357771 4.136211747 +1.664711632 4.134373878 +1.671065494 4.132540910 +1.677419355 4.130708496 +1.683773216 4.128877732 +1.690127077 4.127051717 +1.696480938 4.125230405 +1.702834800 4.123413751 +1.709188661 4.121598273 +1.715542522 4.119783356 +1.721896383 4.117972950 +1.728250244 4.116167012 +1.734604106 4.114365499 +1.740957967 4.112565790 +1.747311828 4.110765567 +1.753665689 4.168153884 +1.760019550 4.166675537 +1.766373412 4.164106453 +1.772727273 4.160437753 +1.779081134 4.156385975 +1.785434995 4.151833303 +1.791788856 4.146677771 +1.798142717 4.141366376 +1.804496579 4.135700681 +1.810850440 4.129929818 +1.817204301 4.123874560 +1.823558162 4.117266592 +1.829912023 4.110423379 +1.836265885 4.103170947 +1.842619746 4.095818864 +1.848973607 4.088323358 +1.855327468 4.080426295 +1.861681329 4.072417514 +1.868035191 4.064291322 +1.874389052 4.055685721 +1.880742913 4.046336936 +1.887096774 4.036896117 +1.893450635 4.027612078 +1.899804497 4.018179925 +1.906158358 4.008590765 +1.912512219 3.998844491 +1.918866080 3.989206249 +1.925219941 3.979582314 +1.931573803 3.969730626 +1.937927664 3.963998992 +1.944281525 3.962015501 +1.950635386 3.960035623 +1.956989247 3.958059326 +1.963343109 3.956086577 +1.969696970 3.954113625 +1.976050831 3.952141011 +1.982404692 3.950171837 +1.988758553 3.948206070 +1.995112414 3.946243679 +2.001466276 3.944281718 +2.007820137 3.942319159 +2.014173998 3.940359871 +2.020527859 3.938403822 +2.026881720 3.936450982 +2.033235582 3.934499204 +2.039589443 3.932545907 +2.045943304 3.930595717 +2.052297165 3.928321055 +2.058651026 3.926276349 +2.065004888 3.924475266 +2.071358749 3.922774809 +2.077712610 3.921104727 +2.084066471 3.919464304 +2.090420332 3.918010740 +2.096774194 3.916680680 +2.103128055 3.915368777 +2.109481916 3.914080307 +2.115835777 3.912814724 +2.122189638 3.911723968 +2.128543500 3.910668734 +2.134897361 3.909680634 +2.141251222 3.908669775 +2.147605083 3.907587992 +2.153958944 3.906523952 +2.160312805 3.905477277 +2.166666667 3.904442682 +2.173020528 3.903423931 +2.179374389 3.902421528 +2.185728250 3.901486449 +2.192082111 3.900445921 +2.198435973 3.899393150 +2.204789834 3.898353233 +2.211143695 3.897327377 +2.217497556 3.896315330 +2.223851417 3.895323424 +2.230205279 3.894239779 +2.236559140 3.893166259 +2.242913001 3.892085629 +2.249266862 3.890921186 +2.255620723 3.763373136 +2.261974585 3.760810581 +2.268328446 3.758220845 +2.274682307 3.755515096 +2.281036168 3.752787836 +2.287390029 3.750049993 +2.293743891 3.747296167 +2.300097752 3.744524926 +2.306451613 3.741705721 +2.312805474 3.738783159 +2.319159335 3.735822614 +2.325513196 3.732839473 +2.331867058 3.729832989 +2.338220919 3.726807130 +2.344574780 3.723761656 +2.350928641 3.720696322 +2.357282502 3.717609935 +2.363636364 3.714498281 +2.369990225 3.711365982 +2.376344086 3.708212779 +2.382697947 3.704895960 +2.389051808 3.701549104 +2.395405670 3.698151488 +2.401759531 3.694720822 +2.408113392 3.691262237 +2.414467253 3.687775337 +2.420821114 3.684259719 +2.427174976 3.680709529 +2.433528837 3.677129365 +2.439882698 3.673519197 +2.446236559 3.669878595 +2.452590420 3.666207121 +2.458944282 3.662499570 +2.465298143 3.658759155 +2.471652004 3.654986475 +2.478005865 3.651045967 +2.484359726 3.647017997 +2.490713587 3.642936519 +2.497067449 3.638788673 +2.503421310 3.636596731 +2.509775171 3.636113994 +2.516129032 3.635610934 +2.522482893 3.635103238 +2.528836755 3.634534439 +2.535190616 3.633850040 +2.541544477 3.633174274 +2.547898338 3.632506997 +2.554252199 3.631845503 +2.560606061 3.631189380 +2.566959922 3.630541357 +2.573313783 3.629901299 +2.579667644 3.629269072 +2.586021505 3.628642677 +2.592375367 3.628020518 +2.598729228 3.627405830 +2.605083089 3.626798488 +2.611436950 3.626184131 +2.617790811 3.625542149 +2.624144673 3.624883923 +2.630498534 3.624060753 +2.636852395 3.623189558 +2.643206256 3.622327417 +2.649560117 3.621478017 +2.655913978 3.620645245 +2.662267840 3.619821076 +2.668621701 3.619029171 +2.674975562 3.618259835 +2.681329423 3.617499446 +2.687683284 3.616733785 +2.694037146 3.615929936 +2.700391007 3.615010095 +2.706744868 3.614080723 +2.713098729 3.613215121 +2.719452590 3.612358954 +2.725806452 3.611513289 +2.732160313 3.610643258 +2.738514174 3.609617457 +2.744868035 3.608593932 +2.751221896 3.607027619 +2.757575758 3.603513978 +2.763929619 3.599607885 +2.770283480 3.595554668 +2.776637341 3.591470975 +2.782991202 3.587039699 +2.789345064 3.582427638 +2.795698925 3.577769876 +2.802052786 3.573065578 +2.808406647 3.568294094 +2.814760508 3.563340228 +2.821114370 3.558021643 +2.827468231 3.552516327 +2.833822092 3.546930677 +2.840175953 3.541262601 +2.846529814 3.535508239 +2.852883675 3.529664792 +2.859237537 3.523731944 +2.865591398 3.517440754 +2.871945259 3.510815250 +2.878299120 3.503981681 +2.884652981 3.497018115 +2.891006843 3.489873772 +2.897360704 3.482525406 +2.903714565 3.475027943 +2.910068426 3.467225386 +2.916422287 3.458886336 +2.922776149 3.450555637 +2.929130010 3.442048766 +2.935483871 3.433360109 +2.941837732 3.424602968 +2.948191593 3.415281614 +2.954545455 3.405651752 +2.960899316 3.403007137 +2.967253177 3.400434512 +2.973607038 3.397862391 +2.979960899 3.395287917 +2.986314761 3.392713887 +2.992668622 3.390140357 +2.999022483 3.387568883 +3.005376344 3.385000338 +3.011730205 3.382430013 +3.018084066 3.380077653 +3.024437928 3.377875015 +3.030791789 3.375524943 +3.037145650 3.373402036 +3.043499511 3.371116711 +3.049853372 3.368824184 +3.056207234 3.366623179 +3.062561095 3.364503845 +3.068914956 3.362409804 +3.075268817 3.360336018 +3.081622678 3.358353454 +3.087976540 3.356478896 +3.094330401 3.354622474 +3.100684262 3.352771569 +3.107038123 3.350907341 +3.113391984 3.348993885 +3.119745846 3.346909885 +3.126099707 3.344819531 +3.132453568 3.342598890 +3.138807429 3.340275375 +3.145161290 3.337883015 +3.151515152 3.335412086 +3.157869013 3.332875386 +3.164222874 3.330208393 +3.170576735 3.327532743 +3.176930596 3.324848544 +3.183284457 3.322157198 +3.189638319 3.319459305 +3.195992180 3.316677427 +3.202346041 3.313783765 +3.208699902 3.310881781 +3.215053763 3.307973034 +3.221407625 3.305194923 +3.227761486 3.302433058 +3.234115347 3.299669163 +3.240469208 3.296983598 +3.246823069 3.294388917 +3.253176931 3.291694941 +3.259530792 3.288912681 +3.265884653 3.286303511 +3.272238514 3.283696099 +3.278592375 3.281090518 +3.284946237 3.278608571 +3.291300098 3.276193408 +3.297653959 3.273722220 +3.304007820 3.271161759 +3.310361681 3.268747744 +3.316715543 3.265966787 +3.323069404 3.263085323 +3.329423265 3.260199447 +3.335777126 3.257347210 +3.342130987 3.254581221 +3.348484848 3.251727316 +3.354838710 3.248792146 +3.361192571 3.245765662 +3.367546432 3.242718518 +3.373900293 3.239619271 +3.380254154 3.236414055 +3.386608016 3.233211207 +3.392961877 3.229760188 +3.399315738 3.226378097 +3.405669599 3.222796617 +3.412023460 3.219154408 +3.418377322 3.215272481 +3.424731183 3.211297617 +3.431085044 3.207131367 +3.437438905 3.202926988 +3.443792766 3.198418272 +3.450146628 3.193810749 +3.456500489 3.188860538 +3.462854350 3.183359238 +3.469208211 3.177024226 +3.475562072 3.170496818 +3.481915934 3.163778038 +3.488269795 3.156835795 +3.494623656 3.151777246 +3.500977517 3.148035721 +3.507331378 3.144197746 +3.513685239 3.140446705 +3.520039101 3.136655740 +3.526392962 3.132806200 +3.532746823 3.128899648 +3.539100684 3.125129471 +3.545454545 3.121261384 +3.551808407 3.117323246 +3.558162268 3.113378774 +3.564516129 3.109556905 +3.570869990 3.105689954 +3.577223851 3.101812687 +3.583577713 3.098113304 +3.589931574 3.094386990 +3.596285435 3.090861319 +3.602639296 3.087515615 +3.608993157 3.084155158 +3.615347019 3.080990618 +3.621700880 3.077760997 +3.628054741 3.074689575 +3.634408602 3.071762524 +3.640762463 3.069078509 +3.647116325 3.066888906 +3.653470186 3.064848343 +3.659824047 3.062841076 +3.666177908 3.060943162 +3.672531769 3.058946649 +3.678885630 3.057033237 +3.685239492 3.051646773 +3.691593353 3.043638574 +3.697947214 3.034716407 +3.704301075 3.025432082 +3.710654936 3.015899291 +3.717008798 3.005532233 +3.723362659 2.994631745 +3.729716520 2.983257966 +3.736070381 2.971645362 +3.742424242 2.959138446 +3.748778104 2.946656184 +3.755131965 2.934768336 +3.761485826 2.924011690 +3.767839687 2.913972946 +3.774193548 2.905005829 +3.780547410 2.897395635 +3.786901271 2.890239940 +3.793255132 2.883864707 +3.799608993 2.878146427 +3.805962854 2.873338916 +3.812316716 2.868774397 +3.818670577 2.864691316 +3.825024438 2.860941683 +3.831378299 2.857473629 +3.837732160 2.854395833 +3.844086022 2.851449698 +3.850439883 2.848549478 +3.856793744 2.845695513 +3.863147605 2.842933383 +3.869501466 2.840390382 +3.875855327 2.838187245 +3.882209189 2.836282288 +3.888563050 2.834395205 +3.894916911 2.832513363 +3.901270772 2.830630910 +3.907624633 2.828747302 +3.913978495 2.826862520 +3.920332356 2.824979616 +3.926686217 2.823097208 +3.933040078 2.821213567 +3.939393939 2.819328674 +3.945747801 2.817442508 +3.952101662 2.815557626 +3.958455523 2.813673739 +3.964809384 2.811788518 +3.971163245 2.809901944 +3.977517107 2.808013996 +3.983870968 2.806126709 +3.990224829 2.804240935 +3.996578690 2.802353725 +4.002932551 2.800465058 +4.009286413 2.798574913 +4.015640274 2.796684781 +4.021994135 2.794796696 +4.028347996 2.792907069 +4.034701857 2.791015880 +4.041055718 2.789123106 +4.047409580 2.787229672 +4.053763441 2.785338834 +4.060117302 2.783446347 +4.066471163 2.781552188 +4.072825024 2.779656337 +4.079178886 2.777759126 +4.085532747 2.775865077 +4.091886608 2.773969268 +4.098240469 2.772071676 +4.104594330 2.770172279 +4.110948192 2.768271094 +4.117302053 2.766374342 +4.123655914 2.764476074 +4.130009775 2.762595767 +4.136363636 2.760758819 +4.142717498 2.758935172 +4.149071359 2.757131514 +4.155425220 2.755346309 +4.161779081 2.753580657 +4.168132942 2.751482072 +4.174486804 2.747379566 +4.180840665 2.743285748 +4.187194526 2.739040821 +4.193548387 2.735000453 +4.199902248 2.730956631 +4.206256109 2.727306104 +4.212609971 2.723853682 +4.218963832 2.720650398 +4.225317693 2.717215725 +4.231671554 2.714264925 +4.238025415 2.711377668 +4.244379277 2.708456312 +4.250733138 2.705502047 +4.257086999 2.699963796 +4.263440860 2.694404754 +4.269794721 2.688818075 +4.276148583 2.683152932 +4.282502444 2.677352841 +4.288856305 2.671534472 +4.295210166 2.665710188 +4.301564027 2.659894532 +4.307917889 2.653904808 +4.314271750 2.647082281 +4.320625611 2.640376703 +4.326979472 2.634383466 +4.333333333 2.628611333 +4.339687195 2.623045257 +4.346041056 2.617682590 +4.352394917 2.612510659 +4.358748778 2.607522940 +4.365102639 2.602713283 +4.371456500 2.598076108 +4.377810362 2.593612156 +4.384164223 2.589309799 +4.390518084 2.585164176 +4.396871945 2.581170702 +4.403225806 2.577325054 +4.409579668 2.573629224 +4.415933529 2.570073814 +4.422287390 2.566654660 +4.428641251 2.563368355 +4.434995112 2.560211698 +4.441348974 2.557186973 +4.447702835 2.554287333 +4.454056696 2.551508820 +4.460410557 2.548848951 +4.466764418 2.546305402 +4.473118280 2.543880553 +4.479472141 2.541569889 +4.485826002 2.539369471 +4.492179863 2.537277567 +4.498533724 2.535292581 +4.504887586 2.533416848 +4.511241447 2.531648061 +4.517595308 2.529982170 +4.523949169 2.528418089 +4.530303030 2.526954850 +4.536656891 2.525594665 +4.543010753 2.524337371 +4.549364614 2.523178724 +4.555718475 2.522118228 +4.562072336 2.521155495 +4.568426197 2.520292572 +4.574780059 2.519531438 +4.581133920 2.518867611 +4.587487781 2.518301166 +4.593841642 2.517832298 +4.600195503 2.517462875 +4.606549365 2.517197081 +4.612903226 2.517030180 +4.619257087 2.516962853 +4.625610948 2.516995911 +4.631964809 2.517131080 +4.638318671 2.517374868 +4.644672532 2.517722312 +4.651026393 2.518174779 +4.657380254 2.513659123 +4.663734115 2.508125388 +4.670087977 2.502541173 +4.676441838 2.496905848 +4.682795699 2.491226658 +4.689149560 2.485511648 +4.695503421 2.480131931 +4.701857283 2.474823139 +4.708211144 2.469510489 +4.714565005 2.464202984 +4.720918866 2.458910899 +4.727272727 2.453644854 +4.733626588 2.448421318 +4.739980450 2.443247453 +4.746334311 2.438299314 +4.752688172 2.432763745 +4.759042033 2.425949005 +4.765395894 2.419291750 +4.771749756 2.412669897 +4.778103617 2.406055580 +4.784457478 2.399250324 +4.790811339 2.392507300 +4.797165200 2.385862943 +4.803519062 2.379674845 +4.809872923 2.373569532 +4.816226784 2.367608901 +4.822580645 2.361641330 +4.828934506 2.355218813 +4.835288368 2.348730271 +4.841642229 2.342430330 +4.847996090 2.336320662 +4.854349951 2.330399039 +4.860703812 2.324816922 +4.867057674 2.319535672 +4.873411535 2.314418752 +4.879765396 2.309466791 +4.886119257 2.304772174 +4.892473118 2.300224661 +4.898826979 2.295824445 +4.905180841 2.291561381 +4.911534702 2.287430967 +4.917888563 2.283428598 +4.924242424 2.279550153 +4.930596285 2.275796879 +4.936950147 2.272157536 +4.943304008 2.268627457 +4.949657869 2.265309212 +4.956011730 2.262113657 +4.962365591 2.259012750 +4.968719453 2.255996077 +4.975073314 2.253059604 +4.981427175 2.250199716 +4.987781036 2.247412981 +4.994134897 2.244742103 +5.000488759 2.242138547 +5.006842620 2.239596260 +5.013196481 2.237112902 +5.019550342 2.234686436 +5.025904203 2.232320228 +5.032258065 2.230009725 +5.038611926 2.227752196 +5.044965787 2.225547264 +5.051319648 2.223395128 +5.057673509 2.221300911 +5.064027370 2.219264613 +5.070381232 2.217286135 +5.076735093 2.215369071 +5.083088954 2.213518254 +5.089442815 2.211743418 +5.095796676 2.210052495 +5.102150538 2.208452035 +5.108504399 2.206954343 +5.114858260 2.205574451 +5.121212121 2.204333209 +5.127565982 2.203253997 +5.133919844 2.202358615 +5.140273705 2.201677808 +5.146627566 2.201247601 +5.152981427 2.201111684 +5.159335288 2.201321192 +5.165689150 2.201934041 +5.172043011 2.203072413 +5.178396872 2.204753575 +5.184750733 2.207267944 +5.191104594 2.210672693 +5.197458456 2.214918459 +5.203812317 2.220084262 +5.210166178 2.226462979 +5.216520039 2.234421744 +5.222873900 2.243852944 +5.229227761 2.245519207 +5.235581623 2.248153515 +5.241935484 2.252005561 +5.248289345 2.257143573 +5.254643206 2.257242365 +5.260997067 2.256166494 +5.267350929 2.255207844 +5.273704790 2.252488099 +5.280058651 2.245489169 +5.286412512 2.236180770 +5.292766373 2.227509962 +5.299120235 2.219830899 +5.305474096 2.213176464 +5.311827957 2.207156013 +5.318181818 2.201791510 +5.324535679 2.197217425 +5.330889541 2.192942201 +5.337243402 2.189263625 +5.343597263 2.185763709 +5.349951124 2.182747581 +5.356304985 2.179878809 +5.362658847 2.177132825 +5.369012708 2.174685668 +5.375366569 2.172338745 +5.381720430 2.170065527 +5.388074291 2.167860085 +5.394428152 2.165799070 +5.400782014 2.163806303 +5.407135875 2.161840938 +5.413489736 2.159902531 +5.419843597 2.157990461 +5.426197458 2.156097125 +5.432551320 2.154220179 +5.438905181 2.152357531 +5.445259042 2.150509149 +5.451612903 2.148677415 +5.457966764 2.146855019 +5.464320626 2.145040704 +5.470674487 2.143233382 +5.477028348 2.141433054 +5.483382209 2.139644701 +5.489736070 2.137860906 +5.496089932 2.136081099 +5.502443793 2.134328107 +5.508797654 2.132649534 +5.515151515 2.130989142 +5.521505376 2.129339036 +5.527859238 2.127699011 +5.534213099 2.126068931 +5.540566960 2.124448719 +5.546920821 2.122971692 +5.553274682 2.121511010 +5.559628543 2.120008961 +5.565982405 2.118523744 +5.572336266 2.117055449 +5.578690127 2.115765674 +5.585043988 2.114537858 +5.591397849 2.113335881 +5.597751711 2.112209154 +5.604105572 2.111254423 +5.610459433 2.110338185 +5.616813294 2.109457677 +5.623167155 2.108794683 +5.629521017 2.108250774 +5.635874878 2.107747754 +5.642228739 2.107523978 +5.648582600 2.107351345 +5.654936461 2.107260660 +5.661290323 2.107503323 +5.667644184 2.107795601 +5.673998045 2.108357990 +5.680351906 2.109020431 +5.686705767 2.109846004 +5.693059629 2.110979040 +5.699413490 2.112228755 +5.705767351 2.113736512 +5.712121212 2.115288377 +5.718475073 2.117188508 +5.724828935 2.119140287 +5.731182796 2.121406844 +5.737536657 2.123709219 +5.743890518 2.125864421 +5.750244379 2.127533697 +5.756598240 2.128951976 +5.762952102 2.129814768 +5.769305963 2.130111253 +5.775659824 2.129941914 +5.782013685 2.129332824 +5.788367546 2.128201102 +5.794721408 2.126466974 +5.801075269 2.124123331 +5.807429130 2.121438142 +5.813782991 2.118465315 +5.820136852 2.115465007 +5.826490714 2.112439464 +5.832844575 2.109388333 +5.839198436 2.106414450 +5.845552297 2.103431920 +5.851906158 2.100423258 +5.858260020 2.097388086 +5.864613881 2.094326016 +5.870967742 2.091331916 +5.877321603 2.088343727 +5.883675464 2.085328087 +5.890029326 2.082284582 +5.896383187 2.079212787 +5.902737048 2.076198279 +5.909090909 2.073206285 +5.915444770 2.070185443 +5.921798631 2.067135298 +5.928152493 2.064055384 +5.934506354 2.061020444 +5.940860215 2.058026997 +5.947214076 2.055003222 +5.953567937 2.051948619 +5.959921799 2.048862677 +5.966275660 2.045807494 +5.972629521 2.042815556 +5.978983382 2.039791727 +5.985337243 2.036735455 +5.991691105 2.033646180 +5.998044966 2.030571219 +6.004398827 2.027584513 +6.010752688 2.024564264 +6.017106549 2.021509869 +6.023460411 2.018420707 +6.029814272 2.015326791 +6.036168133 2.012349980 +6.042521994 2.009337894 +6.048875855 2.006289865 +6.055229717 2.003205208 +6.061583578 1.993674304 +6.067937439 1.983767801 +6.074291300 1.974666943 +6.080645161 1.966340343 +6.086999022 1.958750368 +6.093352884 1.951855006 +6.099706745 1.946007268 +6.106060606 1.940747448 +6.112414467 1.936005220 +6.118768328 1.931738763 +6.125122190 1.927907466 +6.131476051 1.924681564 +6.137829912 1.921835182 +6.144183773 1.919288898 +6.150537634 1.917013216 +6.156891496 1.914980871 +6.163245357 1.913271019 +6.169599218 1.911785846 +6.175953079 1.910460690 +6.182306940 1.909278299 +6.188660802 1.908223089 +6.195014663 1.907331193 +6.201368524 1.906567078 +6.207722385 1.905883992 +6.214076246 1.905272781 +6.220430108 1.904725277 +6.226783969 1.904257800 +6.233137830 1.903862368 +6.239491691 1.903506560 +6.245845552 1.903080826 +6.252199413 1.901182623 +6.258553275 1.901126321 +6.264907136 1.901074692 +6.271260997 1.901023161 +6.277614858 1.900971728 +6.283968719 1.900920393 +6.290322581 1.900870925 +6.296676442 1.900826930 +6.303030303 1.900783019 +6.309384164 1.900739191 +6.315738025 1.900695445 +6.322091887 1.900652728 +6.328445748 1.900616279 +6.334799609 1.900579899 +6.341153470 1.900543588 +6.347507331 1.900507345 +6.353861193 1.900471295 +6.360215054 1.900442305 +6.366568915 1.900413370 +6.372922776 1.900384490 +6.379276637 1.900355663 +6.385630499 1.900326891 +6.391984360 1.900304582 +6.398338221 1.900283006 +6.404692082 1.900261471 +6.411045943 1.900239976 +6.417399804 1.900218521 +6.423753666 1.900202687 +6.430107527 1.900188386 +6.436461388 1.900174112 +6.442815249 1.900159865 +6.449169110 1.900145644 +6.455522972 1.900136204 +6.461876833 1.900129095 +6.468230694 1.900121999 +6.474584555 1.900114916 +6.480938416 1.900107847 +6.487292278 1.900104723 +6.493646139 1.900104723 +6.500000000 1.900104723 diff --git a/examples/mamdani/AllTerms.fll b/examples/mamdani/AllTerms.fll new file mode 100644 index 0000000..4db1b32 --- /dev/null +++ b/examples/mamdani/AllTerms.fll @@ -0,0 +1,79 @@ +Engine: AllTerms +InputVariable: AllInputTerms + enabled: true + range: 0.000 6.500 + lock-range: false + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +OutputVariable: AllOutputTerms + enabled: true + range: 0.000 6.500 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if AllInputTerms is A then AllOutputTerms is T + rule: if AllInputTerms is B then AllOutputTerms is S + rule: if AllInputTerms is C then AllOutputTerms is R + rule: if AllInputTerms is D then AllOutputTerms is Q + rule: if AllInputTerms is E then AllOutputTerms is P + rule: if AllInputTerms is F then AllOutputTerms is O + rule: if AllInputTerms is G then AllOutputTerms is N + rule: if AllInputTerms is H then AllOutputTerms is M + rule: if AllInputTerms is I then AllOutputTerms is L + rule: if AllInputTerms is J then AllOutputTerms is K + rule: if AllInputTerms is K then AllOutputTerms is J + rule: if AllInputTerms is L then AllOutputTerms is I + rule: if AllInputTerms is M then AllOutputTerms is H + rule: if AllInputTerms is N then AllOutputTerms is G + rule: if AllInputTerms is O then AllOutputTerms is F + rule: if AllInputTerms is P then AllOutputTerms is E + rule: if AllInputTerms is Q then AllOutputTerms is D + rule: if AllInputTerms is R then AllOutputTerms is C + rule: if AllInputTerms is S then AllOutputTerms is B + rule: if AllInputTerms is T then AllOutputTerms is A
\ No newline at end of file diff --git a/examples/mamdani/AllTerms.java b/examples/mamdani/AllTerms.java new file mode 100644 index 0000000..6d4651d --- /dev/null +++ b/examples/mamdani/AllTerms.java @@ -0,0 +1,114 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class AllTerms{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("AllTerms"); +engine.setDescription(""); + +InputVariable AllInputTerms = new InputVariable(); +AllInputTerms.setName("AllInputTerms"); +AllInputTerms.setDescription(""); +AllInputTerms.setEnabled(true); +AllInputTerms.setRange(0.000, 6.500); +AllInputTerms.setLockValueInRange(false); +AllInputTerms.addTerm(new Sigmoid("A", 0.500, -20.000)); +AllInputTerms.addTerm(new ZShape("B", 0.000, 1.000)); +AllInputTerms.addTerm(new Ramp("C", 1.000, 0.000)); +AllInputTerms.addTerm(new Triangle("D", 0.500, 1.000, 1.500)); +AllInputTerms.addTerm(new Trapezoid("E", 1.000, 1.250, 1.750, 2.000)); +AllInputTerms.addTerm(new Concave("F", 0.850, 0.250)); +AllInputTerms.addTerm(new Rectangle("G", 1.750, 2.250)); +AllInputTerms.addTerm(Discrete.create("H", 2.000, 0.000, 2.250, 1.000, 2.500, 0.500, 2.750, 1.000, 3.000, 0.000)); +AllInputTerms.addTerm(new Gaussian("I", 3.000, 0.200)); +AllInputTerms.addTerm(new Cosine("J", 3.250, 0.650)); +AllInputTerms.addTerm(new GaussianProduct("K", 3.500, 0.100, 3.300, 0.300)); +AllInputTerms.addTerm(new Spike("L", 3.640, 1.040)); +AllInputTerms.addTerm(new Bell("M", 4.000, 0.250, 3.000)); +AllInputTerms.addTerm(new PiShape("N", 4.000, 4.500, 4.500, 5.000)); +AllInputTerms.addTerm(new Concave("O", 5.650, 6.250)); +AllInputTerms.addTerm(new SigmoidDifference("P", 4.750, 10.000, 30.000, 5.250)); +AllInputTerms.addTerm(new SigmoidProduct("Q", 5.250, 20.000, -10.000, 5.750)); +AllInputTerms.addTerm(new Ramp("R", 5.500, 6.500)); +AllInputTerms.addTerm(new SShape("S", 5.500, 6.500)); +AllInputTerms.addTerm(new Sigmoid("T", 6.000, 20.000)); +engine.addInputVariable(AllInputTerms); + +OutputVariable AllOutputTerms = new OutputVariable(); +AllOutputTerms.setName("AllOutputTerms"); +AllOutputTerms.setDescription(""); +AllOutputTerms.setEnabled(true); +AllOutputTerms.setRange(0.000, 6.500); +AllOutputTerms.setLockValueInRange(false); +AllOutputTerms.setAggregation(new Maximum()); +AllOutputTerms.setDefuzzifier(new Centroid(200)); +AllOutputTerms.setDefaultValue(Double.NaN); +AllOutputTerms.setLockPreviousValue(false); +AllOutputTerms.addTerm(new Sigmoid("A", 0.500, -20.000)); +AllOutputTerms.addTerm(new ZShape("B", 0.000, 1.000)); +AllOutputTerms.addTerm(new Ramp("C", 1.000, 0.000)); +AllOutputTerms.addTerm(new Triangle("D", 0.500, 1.000, 1.500)); +AllOutputTerms.addTerm(new Trapezoid("E", 1.000, 1.250, 1.750, 2.000)); +AllOutputTerms.addTerm(new Concave("F", 0.850, 0.250)); +AllOutputTerms.addTerm(new Rectangle("G", 1.750, 2.250)); +AllOutputTerms.addTerm(Discrete.create("H", 2.000, 0.000, 2.250, 1.000, 2.500, 0.500, 2.750, 1.000, 3.000, 0.000)); +AllOutputTerms.addTerm(new Gaussian("I", 3.000, 0.200)); +AllOutputTerms.addTerm(new Cosine("J", 3.250, 0.650)); +AllOutputTerms.addTerm(new GaussianProduct("K", 3.500, 0.100, 3.300, 0.300)); +AllOutputTerms.addTerm(new Spike("L", 3.640, 1.040)); +AllOutputTerms.addTerm(new Bell("M", 4.000, 0.250, 3.000)); +AllOutputTerms.addTerm(new PiShape("N", 4.000, 4.500, 4.500, 5.000)); +AllOutputTerms.addTerm(new Concave("O", 5.650, 6.250)); +AllOutputTerms.addTerm(new SigmoidDifference("P", 4.750, 10.000, 30.000, 5.250)); +AllOutputTerms.addTerm(new SigmoidProduct("Q", 5.250, 20.000, -10.000, 5.750)); +AllOutputTerms.addTerm(new Ramp("R", 5.500, 6.500)); +AllOutputTerms.addTerm(new SShape("S", 5.500, 6.500)); +AllOutputTerms.addTerm(new Sigmoid("T", 6.000, 20.000)); +engine.addOutputVariable(AllOutputTerms); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new Minimum()); +ruleBlock.setDisjunction(new Maximum()); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if AllInputTerms is A then AllOutputTerms is T", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is B then AllOutputTerms is S", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is C then AllOutputTerms is R", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is D then AllOutputTerms is Q", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is E then AllOutputTerms is P", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is F then AllOutputTerms is O", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is G then AllOutputTerms is N", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is H then AllOutputTerms is M", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is I then AllOutputTerms is L", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is J then AllOutputTerms is K", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is K then AllOutputTerms is J", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is L then AllOutputTerms is I", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is M then AllOutputTerms is H", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is N then AllOutputTerms is G", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is O then AllOutputTerms is F", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is P then AllOutputTerms is E", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is Q then AllOutputTerms is D", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is R then AllOutputTerms is C", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is S then AllOutputTerms is B", engine)); +ruleBlock.addRule(Rule.parse("if AllInputTerms is T then AllOutputTerms is A", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/AllTerms.pdf b/examples/mamdani/AllTerms.pdf Binary files differnew file mode 100644 index 0000000..ed71111 --- /dev/null +++ b/examples/mamdani/AllTerms.pdf diff --git a/examples/mamdani/Laundry.R b/examples/mamdani/Laundry.R new file mode 100644 index 0000000..ca7d73d --- /dev/null +++ b/examples/mamdani/Laundry.R @@ -0,0 +1,91 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "Laundry" +engine.fll = "Engine: Laundry +InputVariable: Load + enabled: true + range: 0.000 6.000 + lock-range: false + term: small Discrete 0.000 1.000 1.000 1.000 2.000 0.800 5.000 0.000 + term: normal Discrete 3.000 0.000 4.000 1.000 6.000 0.000 +InputVariable: Dirt + enabled: true + range: 0.000 6.000 + lock-range: false + term: low Discrete 0.000 1.000 2.000 0.800 5.000 0.000 + term: high Discrete 1.000 0.000 2.000 0.200 4.000 0.800 6.000 1.000 +OutputVariable: Detergent + enabled: true + range: 0.000 80.000 + lock-range: false + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + term: less_than_usual Discrete 10.000 0.000 40.000 1.000 50.000 0.000 + term: usual Discrete 40.000 0.000 50.000 1.000 60.000 1.000 80.000 0.000 + term: more_than_usual Discrete 50.000 0.000 80.000 1.000 +OutputVariable: Cycle + enabled: true + range: 0.000 20.000 + lock-range: false + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + term: short Discrete 0.000 1.000 10.000 1.000 20.000 0.000 + term: long Discrete 10.000 0.000 20.000 1.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if Load is small and Dirt is not high then Detergent is less_than_usual + rule: if Load is small and Dirt is high then Detergent is usual + rule: if Load is normal and Dirt is low then Detergent is less_than_usual + rule: if Load is normal and Dirt is high then Detergent is more_than_usual + rule: if Detergent is usual or Detergent is less_than_usual then Cycle is short + rule: if Detergent is more_than_usual then Cycle is long" + +engine.fldFile = "Laundry.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(Load, Dirt)) + + geom_tile(aes(fill=Detergent)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Load, y=Dirt, z=Detergent), color="black") + + ggtitle("(Load, Dirt) = Detergent") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(Dirt, Load)) + + geom_tile(aes(fill=Detergent)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Dirt, y=Load, z=Detergent), color="black") + + ggtitle("(Dirt, Load) = Detergent") + +engine.plot.i1i2_o2 = ggplot(engine.df, aes(Load, Dirt)) + + geom_tile(aes(fill=Cycle)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Load, y=Dirt, z=Cycle), color="black") + + ggtitle("(Load, Dirt) = Cycle") + +engine.plot.i2i1_o2 = ggplot(engine.df, aes(Dirt, Load)) + + geom_tile(aes(fill=Cycle)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Dirt, y=Load, z=Cycle), color="black") + + ggtitle("(Dirt, Load) = Cycle") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, engine.plot.i1i2_o2, engine.plot.i2i1_o2, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/Laundry.cpp b/examples/mamdani/Laundry.cpp new file mode 100644 index 0000000..cc7492c --- /dev/null +++ b/examples/mamdani/Laundry.cpp @@ -0,0 +1,78 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("Laundry"); +engine->setDescription(""); + +InputVariable* Load = new InputVariable; +Load->setName("Load"); +Load->setDescription(""); +Load->setEnabled(true); +Load->setRange(0.000, 6.000); +Load->setLockValueInRange(false); +Load->addTerm(Discrete::create("small", 8, 0.000, 1.000, 1.000, 1.000, 2.000, 0.800, 5.000, 0.000)); +Load->addTerm(Discrete::create("normal", 6, 3.000, 0.000, 4.000, 1.000, 6.000, 0.000)); +engine->addInputVariable(Load); + +InputVariable* Dirt = new InputVariable; +Dirt->setName("Dirt"); +Dirt->setDescription(""); +Dirt->setEnabled(true); +Dirt->setRange(0.000, 6.000); +Dirt->setLockValueInRange(false); +Dirt->addTerm(Discrete::create("low", 6, 0.000, 1.000, 2.000, 0.800, 5.000, 0.000)); +Dirt->addTerm(Discrete::create("high", 8, 1.000, 0.000, 2.000, 0.200, 4.000, 0.800, 6.000, 1.000)); +engine->addInputVariable(Dirt); + +OutputVariable* Detergent = new OutputVariable; +Detergent->setName("Detergent"); +Detergent->setDescription(""); +Detergent->setEnabled(true); +Detergent->setRange(0.000, 80.000); +Detergent->setLockValueInRange(false); +Detergent->setAggregation(new Maximum); +Detergent->setDefuzzifier(new MeanOfMaximum(500)); +Detergent->setDefaultValue(fl::nan); +Detergent->setLockPreviousValue(false); +Detergent->addTerm(Discrete::create("less_than_usual", 6, 10.000, 0.000, 40.000, 1.000, 50.000, 0.000)); +Detergent->addTerm(Discrete::create("usual", 8, 40.000, 0.000, 50.000, 1.000, 60.000, 1.000, 80.000, 0.000)); +Detergent->addTerm(Discrete::create("more_than_usual", 4, 50.000, 0.000, 80.000, 1.000)); +engine->addOutputVariable(Detergent); + +OutputVariable* Cycle = new OutputVariable; +Cycle->setName("Cycle"); +Cycle->setDescription(""); +Cycle->setEnabled(true); +Cycle->setRange(0.000, 20.000); +Cycle->setLockValueInRange(false); +Cycle->setAggregation(new Maximum); +Cycle->setDefuzzifier(new MeanOfMaximum(500)); +Cycle->setDefaultValue(fl::nan); +Cycle->setLockPreviousValue(false); +Cycle->addTerm(Discrete::create("short", 6, 0.000, 1.000, 10.000, 1.000, 20.000, 0.000)); +Cycle->addTerm(Discrete::create("long", 4, 10.000, 0.000, 20.000, 1.000)); +engine->addOutputVariable(Cycle); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new Minimum); +ruleBlock->setDisjunction(new Maximum); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if Load is small and Dirt is not high then Detergent is less_than_usual", engine)); +ruleBlock->addRule(Rule::parse("if Load is small and Dirt is high then Detergent is usual", engine)); +ruleBlock->addRule(Rule::parse("if Load is normal and Dirt is low then Detergent is less_than_usual", engine)); +ruleBlock->addRule(Rule::parse("if Load is normal and Dirt is high then Detergent is more_than_usual", engine)); +ruleBlock->addRule(Rule::parse("if Detergent is usual or Detergent is less_than_usual then Cycle is short", engine)); +ruleBlock->addRule(Rule::parse("if Detergent is more_than_usual then Cycle is long", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/Laundry.fcl b/examples/mamdani/Laundry.fcl new file mode 100644 index 0000000..9a34532 --- /dev/null +++ b/examples/mamdani/Laundry.fcl @@ -0,0 +1,58 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK Laundry + +VAR_INPUT + Load: REAL; + Dirt: REAL; +END_VAR + +VAR_OUTPUT + Detergent: REAL; + Cycle: REAL; +END_VAR + +FUZZIFY Load + RANGE := (0.000 .. 6.000); + TERM small := (0.000, 1.000) (1.000, 1.000) (2.000, 0.800) (5.000, 0.000); + TERM normal := (3.000, 0.000) (4.000, 1.000) (6.000, 0.000); +END_FUZZIFY + +FUZZIFY Dirt + RANGE := (0.000 .. 6.000); + TERM low := (0.000, 1.000) (2.000, 0.800) (5.000, 0.000); + TERM high := (1.000, 0.000) (2.000, 0.200) (4.000, 0.800) (6.000, 1.000); +END_FUZZIFY + +DEFUZZIFY Detergent + RANGE := (0.000 .. 80.000); + TERM less_than_usual := (10.000, 0.000) (40.000, 1.000) (50.000, 0.000); + TERM usual := (40.000, 0.000) (50.000, 1.000) (60.000, 1.000) (80.000, 0.000); + TERM more_than_usual := (50.000, 0.000) (80.000, 1.000); + METHOD : MM; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY Cycle + RANGE := (0.000 .. 20.000); + TERM short := (0.000, 1.000) (10.000, 1.000) (20.000, 0.000); + TERM long := (10.000, 0.000) (20.000, 1.000); + METHOD : MM; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : MIN; + OR : MAX; + ACT : MIN; + RULE 1 : if Load is small and Dirt is not high then Detergent is less_than_usual + RULE 2 : if Load is small and Dirt is high then Detergent is usual + RULE 3 : if Load is normal and Dirt is low then Detergent is less_than_usual + RULE 4 : if Load is normal and Dirt is high then Detergent is more_than_usual + RULE 5 : if Detergent is usual or Detergent is less_than_usual then Cycle is short + RULE 6 : if Detergent is more_than_usual then Cycle is long +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/Laundry.fis b/examples/mamdani/Laundry.fis new file mode 100644 index 0000000..7f1c31d --- /dev/null +++ b/examples/mamdani/Laundry.fis @@ -0,0 +1,51 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='Laundry' +Type='mamdani' +Version=6.0 +NumInputs=2 +NumOutputs=2 +NumRules=6 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='mom' + +[Input1] +Name='Load' +Range=[0.000 6.000] +NumMFs=2 +MF1='small':'discretemf',[0.000 1.000 1.000 1.000 2.000 0.800 5.000 0.000] +MF2='normal':'discretemf',[3.000 0.000 4.000 1.000 6.000 0.000] + +[Input2] +Name='Dirt' +Range=[0.000 6.000] +NumMFs=2 +MF1='low':'discretemf',[0.000 1.000 2.000 0.800 5.000 0.000] +MF2='high':'discretemf',[1.000 0.000 2.000 0.200 4.000 0.800 6.000 1.000] + +[Output1] +Name='Detergent' +Range=[0.000 80.000] +NumMFs=3 +MF1='less_than_usual':'discretemf',[10.000 0.000 40.000 1.000 50.000 0.000] +MF2='usual':'discretemf',[40.000 0.000 50.000 1.000 60.000 1.000 80.000 0.000] +MF3='more_than_usual':'discretemf',[50.000 0.000 80.000 1.000] + +[Output2] +Name='Cycle' +Range=[0.000 20.000] +NumMFs=2 +MF1='short':'discretemf',[0.000 1.000 10.000 1.000 20.000 0.000] +MF2='long':'discretemf',[10.000 0.000 20.000 1.000] + +[Rules] +1.000 -2.000 , 1.000 0.000 (1.000) : 1 +1.000 2.000 , 2.000 0.000 (1.000) : 1 +2.000 1.000 , 1.000 0.000 (1.000) : 1 +2.000 2.000 , 3.000 0.000 (1.000) : 1 +0.000 0.000 , 0.000 1.000 (1.000) : 2 +0.000 0.000 , 0.000 2.000 (1.000) : 1 diff --git a/examples/mamdani/Laundry.fld b/examples/mamdani/Laundry.fld new file mode 100644 index 0000000..a8f27dd --- /dev/null +++ b/examples/mamdani/Laundry.fld @@ -0,0 +1,1025 @@ +Load Dirt Detergent Cycle +0.000000000 0.000000000 39.920000000 5.000000000 +0.000000000 0.193548387 39.920000000 5.000000000 +0.000000000 0.387096774 39.920000000 5.000000000 +0.000000000 0.580645161 39.920000000 5.000000000 +0.000000000 0.774193548 39.920000000 5.000000000 +0.000000000 0.967741935 39.920000000 5.000000000 +0.000000000 1.161290323 39.680000000 5.160000000 +0.000000000 1.354838710 39.280000000 5.360000000 +0.000000000 1.548387097 38.880000000 5.540000000 +0.000000000 1.741935484 38.480000000 5.740000000 +0.000000000 1.935483871 38.160000000 5.940000000 +0.000000000 2.129032258 37.600000000 6.200000000 +0.000000000 2.322580645 37.040000000 6.480000000 +0.000000000 2.516129032 36.400000000 6.780000000 +0.000000000 2.709677419 35.920000000 7.060000000 +0.000000000 2.903225806 35.280000000 7.360000000 +0.000000000 3.096774194 57.360000000 7.360000000 +0.000000000 3.290322581 57.120000000 7.060000000 +0.000000000 3.483870968 56.720000000 6.780000000 +0.000000000 3.677419355 56.480000000 6.480000000 +0.000000000 3.870967742 56.240000000 6.200000000 +0.000000000 4.064516129 55.920000000 5.960000000 +0.000000000 4.258064516 55.920000000 5.880000000 +0.000000000 4.451612903 55.760000000 5.780000000 +0.000000000 4.645161290 55.680000000 5.680000000 +0.000000000 4.838709677 55.600000000 5.580000000 +0.000000000 5.032258065 55.440000000 5.480000000 +0.000000000 5.225806452 55.440000000 5.380000000 +0.000000000 5.419354839 55.280000000 5.300000000 +0.000000000 5.612903226 55.200000000 5.200000000 +0.000000000 5.806451613 55.040000000 5.100000000 +0.000000000 6.000000000 54.960000000 5.000000000 +0.193548387 0.000000000 39.920000000 5.000000000 +0.193548387 0.193548387 39.920000000 5.000000000 +0.193548387 0.387096774 39.920000000 5.000000000 +0.193548387 0.580645161 39.920000000 5.000000000 +0.193548387 0.774193548 39.920000000 5.000000000 +0.193548387 0.967741935 39.920000000 5.000000000 +0.193548387 1.161290323 39.680000000 5.160000000 +0.193548387 1.354838710 39.280000000 5.360000000 +0.193548387 1.548387097 38.880000000 5.540000000 +0.193548387 1.741935484 38.480000000 5.740000000 +0.193548387 1.935483871 38.160000000 5.940000000 +0.193548387 2.129032258 37.600000000 6.200000000 +0.193548387 2.322580645 37.040000000 6.480000000 +0.193548387 2.516129032 36.400000000 6.780000000 +0.193548387 2.709677419 35.920000000 7.060000000 +0.193548387 2.903225806 35.280000000 7.360000000 +0.193548387 3.096774194 57.360000000 7.360000000 +0.193548387 3.290322581 57.120000000 7.060000000 +0.193548387 3.483870968 56.720000000 6.780000000 +0.193548387 3.677419355 56.480000000 6.480000000 +0.193548387 3.870967742 56.240000000 6.200000000 +0.193548387 4.064516129 55.920000000 5.960000000 +0.193548387 4.258064516 55.920000000 5.880000000 +0.193548387 4.451612903 55.760000000 5.780000000 +0.193548387 4.645161290 55.680000000 5.680000000 +0.193548387 4.838709677 55.600000000 5.580000000 +0.193548387 5.032258065 55.440000000 5.480000000 +0.193548387 5.225806452 55.440000000 5.380000000 +0.193548387 5.419354839 55.280000000 5.300000000 +0.193548387 5.612903226 55.200000000 5.200000000 +0.193548387 5.806451613 55.040000000 5.100000000 +0.193548387 6.000000000 54.960000000 5.000000000 +0.387096774 0.000000000 39.920000000 5.000000000 +0.387096774 0.193548387 39.920000000 5.000000000 +0.387096774 0.387096774 39.920000000 5.000000000 +0.387096774 0.580645161 39.920000000 5.000000000 +0.387096774 0.774193548 39.920000000 5.000000000 +0.387096774 0.967741935 39.920000000 5.000000000 +0.387096774 1.161290323 39.680000000 5.160000000 +0.387096774 1.354838710 39.280000000 5.360000000 +0.387096774 1.548387097 38.880000000 5.540000000 +0.387096774 1.741935484 38.480000000 5.740000000 +0.387096774 1.935483871 38.160000000 5.940000000 +0.387096774 2.129032258 37.600000000 6.200000000 +0.387096774 2.322580645 37.040000000 6.480000000 +0.387096774 2.516129032 36.400000000 6.780000000 +0.387096774 2.709677419 35.920000000 7.060000000 +0.387096774 2.903225806 35.280000000 7.360000000 +0.387096774 3.096774194 57.360000000 7.360000000 +0.387096774 3.290322581 57.120000000 7.060000000 +0.387096774 3.483870968 56.720000000 6.780000000 +0.387096774 3.677419355 56.480000000 6.480000000 +0.387096774 3.870967742 56.240000000 6.200000000 +0.387096774 4.064516129 55.920000000 5.960000000 +0.387096774 4.258064516 55.920000000 5.880000000 +0.387096774 4.451612903 55.760000000 5.780000000 +0.387096774 4.645161290 55.680000000 5.680000000 +0.387096774 4.838709677 55.600000000 5.580000000 +0.387096774 5.032258065 55.440000000 5.480000000 +0.387096774 5.225806452 55.440000000 5.380000000 +0.387096774 5.419354839 55.280000000 5.300000000 +0.387096774 5.612903226 55.200000000 5.200000000 +0.387096774 5.806451613 55.040000000 5.100000000 +0.387096774 6.000000000 54.960000000 5.000000000 +0.580645161 0.000000000 39.920000000 5.000000000 +0.580645161 0.193548387 39.920000000 5.000000000 +0.580645161 0.387096774 39.920000000 5.000000000 +0.580645161 0.580645161 39.920000000 5.000000000 +0.580645161 0.774193548 39.920000000 5.000000000 +0.580645161 0.967741935 39.920000000 5.000000000 +0.580645161 1.161290323 39.680000000 5.160000000 +0.580645161 1.354838710 39.280000000 5.360000000 +0.580645161 1.548387097 38.880000000 5.540000000 +0.580645161 1.741935484 38.480000000 5.740000000 +0.580645161 1.935483871 38.160000000 5.940000000 +0.580645161 2.129032258 37.600000000 6.200000000 +0.580645161 2.322580645 37.040000000 6.480000000 +0.580645161 2.516129032 36.400000000 6.780000000 +0.580645161 2.709677419 35.920000000 7.060000000 +0.580645161 2.903225806 35.280000000 7.360000000 +0.580645161 3.096774194 57.360000000 7.360000000 +0.580645161 3.290322581 57.120000000 7.060000000 +0.580645161 3.483870968 56.720000000 6.780000000 +0.580645161 3.677419355 56.480000000 6.480000000 +0.580645161 3.870967742 56.240000000 6.200000000 +0.580645161 4.064516129 55.920000000 5.960000000 +0.580645161 4.258064516 55.920000000 5.880000000 +0.580645161 4.451612903 55.760000000 5.780000000 +0.580645161 4.645161290 55.680000000 5.680000000 +0.580645161 4.838709677 55.600000000 5.580000000 +0.580645161 5.032258065 55.440000000 5.480000000 +0.580645161 5.225806452 55.440000000 5.380000000 +0.580645161 5.419354839 55.280000000 5.300000000 +0.580645161 5.612903226 55.200000000 5.200000000 +0.580645161 5.806451613 55.040000000 5.100000000 +0.580645161 6.000000000 54.960000000 5.000000000 +0.774193548 0.000000000 39.920000000 5.000000000 +0.774193548 0.193548387 39.920000000 5.000000000 +0.774193548 0.387096774 39.920000000 5.000000000 +0.774193548 0.580645161 39.920000000 5.000000000 +0.774193548 0.774193548 39.920000000 5.000000000 +0.774193548 0.967741935 39.920000000 5.000000000 +0.774193548 1.161290323 39.680000000 5.160000000 +0.774193548 1.354838710 39.280000000 5.360000000 +0.774193548 1.548387097 38.880000000 5.540000000 +0.774193548 1.741935484 38.480000000 5.740000000 +0.774193548 1.935483871 38.160000000 5.940000000 +0.774193548 2.129032258 37.600000000 6.200000000 +0.774193548 2.322580645 37.040000000 6.480000000 +0.774193548 2.516129032 36.400000000 6.780000000 +0.774193548 2.709677419 35.920000000 7.060000000 +0.774193548 2.903225806 35.280000000 7.360000000 +0.774193548 3.096774194 57.360000000 7.360000000 +0.774193548 3.290322581 57.120000000 7.060000000 +0.774193548 3.483870968 56.720000000 6.780000000 +0.774193548 3.677419355 56.480000000 6.480000000 +0.774193548 3.870967742 56.240000000 6.200000000 +0.774193548 4.064516129 55.920000000 5.960000000 +0.774193548 4.258064516 55.920000000 5.880000000 +0.774193548 4.451612903 55.760000000 5.780000000 +0.774193548 4.645161290 55.680000000 5.680000000 +0.774193548 4.838709677 55.600000000 5.580000000 +0.774193548 5.032258065 55.440000000 5.480000000 +0.774193548 5.225806452 55.440000000 5.380000000 +0.774193548 5.419354839 55.280000000 5.300000000 +0.774193548 5.612903226 55.200000000 5.200000000 +0.774193548 5.806451613 55.040000000 5.100000000 +0.774193548 6.000000000 54.960000000 5.000000000 +0.967741935 0.000000000 39.920000000 5.000000000 +0.967741935 0.193548387 39.920000000 5.000000000 +0.967741935 0.387096774 39.920000000 5.000000000 +0.967741935 0.580645161 39.920000000 5.000000000 +0.967741935 0.774193548 39.920000000 5.000000000 +0.967741935 0.967741935 39.920000000 5.000000000 +0.967741935 1.161290323 39.680000000 5.160000000 +0.967741935 1.354838710 39.280000000 5.360000000 +0.967741935 1.548387097 38.880000000 5.540000000 +0.967741935 1.741935484 38.480000000 5.740000000 +0.967741935 1.935483871 38.160000000 5.940000000 +0.967741935 2.129032258 37.600000000 6.200000000 +0.967741935 2.322580645 37.040000000 6.480000000 +0.967741935 2.516129032 36.400000000 6.780000000 +0.967741935 2.709677419 35.920000000 7.060000000 +0.967741935 2.903225806 35.280000000 7.360000000 +0.967741935 3.096774194 57.360000000 7.360000000 +0.967741935 3.290322581 57.120000000 7.060000000 +0.967741935 3.483870968 56.720000000 6.780000000 +0.967741935 3.677419355 56.480000000 6.480000000 +0.967741935 3.870967742 56.240000000 6.200000000 +0.967741935 4.064516129 55.920000000 5.960000000 +0.967741935 4.258064516 55.920000000 5.880000000 +0.967741935 4.451612903 55.760000000 5.780000000 +0.967741935 4.645161290 55.680000000 5.680000000 +0.967741935 4.838709677 55.600000000 5.580000000 +0.967741935 5.032258065 55.440000000 5.480000000 +0.967741935 5.225806452 55.440000000 5.380000000 +0.967741935 5.419354839 55.280000000 5.300000000 +0.967741935 5.612903226 55.200000000 5.200000000 +0.967741935 5.806451613 55.040000000 5.100000000 +0.967741935 6.000000000 54.960000000 5.000000000 +1.161290323 0.000000000 39.680000000 5.160000000 +1.161290323 0.193548387 39.680000000 5.160000000 +1.161290323 0.387096774 39.680000000 5.160000000 +1.161290323 0.580645161 39.680000000 5.160000000 +1.161290323 0.774193548 39.680000000 5.160000000 +1.161290323 0.967741935 39.680000000 5.160000000 +1.161290323 1.161290323 39.680000000 5.160000000 +1.161290323 1.354838710 39.280000000 5.360000000 +1.161290323 1.548387097 38.880000000 5.540000000 +1.161290323 1.741935484 38.480000000 5.740000000 +1.161290323 1.935483871 38.160000000 5.940000000 +1.161290323 2.129032258 37.600000000 6.200000000 +1.161290323 2.322580645 37.040000000 6.480000000 +1.161290323 2.516129032 36.400000000 6.780000000 +1.161290323 2.709677419 35.920000000 7.060000000 +1.161290323 2.903225806 35.280000000 7.360000000 +1.161290323 3.096774194 57.360000000 7.360000000 +1.161290323 3.290322581 57.120000000 7.060000000 +1.161290323 3.483870968 56.720000000 6.780000000 +1.161290323 3.677419355 56.480000000 6.480000000 +1.161290323 3.870967742 56.240000000 6.200000000 +1.161290323 4.064516129 55.920000000 5.960000000 +1.161290323 4.258064516 55.920000000 5.880000000 +1.161290323 4.451612903 55.760000000 5.780000000 +1.161290323 4.645161290 55.680000000 5.680000000 +1.161290323 4.838709677 55.600000000 5.580000000 +1.161290323 5.032258065 55.440000000 5.480000000 +1.161290323 5.225806452 55.440000000 5.380000000 +1.161290323 5.419354839 55.280000000 5.300000000 +1.161290323 5.612903226 55.200000000 5.200000000 +1.161290323 5.806451613 55.120000000 5.160000000 +1.161290323 6.000000000 55.120000000 5.160000000 +1.354838710 0.000000000 39.280000000 5.360000000 +1.354838710 0.193548387 39.280000000 5.360000000 +1.354838710 0.387096774 39.280000000 5.360000000 +1.354838710 0.580645161 39.280000000 5.360000000 +1.354838710 0.774193548 39.280000000 5.360000000 +1.354838710 0.967741935 39.280000000 5.360000000 +1.354838710 1.161290323 39.280000000 5.360000000 +1.354838710 1.354838710 39.280000000 5.360000000 +1.354838710 1.548387097 38.880000000 5.540000000 +1.354838710 1.741935484 38.480000000 5.740000000 +1.354838710 1.935483871 38.160000000 5.940000000 +1.354838710 2.129032258 37.600000000 6.200000000 +1.354838710 2.322580645 37.040000000 6.480000000 +1.354838710 2.516129032 36.400000000 6.780000000 +1.354838710 2.709677419 35.920000000 7.060000000 +1.354838710 2.903225806 35.280000000 7.360000000 +1.354838710 3.096774194 57.360000000 7.360000000 +1.354838710 3.290322581 57.120000000 7.060000000 +1.354838710 3.483870968 56.720000000 6.780000000 +1.354838710 3.677419355 56.480000000 6.480000000 +1.354838710 3.870967742 56.240000000 6.200000000 +1.354838710 4.064516129 55.920000000 5.960000000 +1.354838710 4.258064516 55.920000000 5.880000000 +1.354838710 4.451612903 55.760000000 5.780000000 +1.354838710 4.645161290 55.680000000 5.680000000 +1.354838710 4.838709677 55.600000000 5.580000000 +1.354838710 5.032258065 55.440000000 5.480000000 +1.354838710 5.225806452 55.440000000 5.380000000 +1.354838710 5.419354839 55.360000000 5.360000000 +1.354838710 5.612903226 55.360000000 5.360000000 +1.354838710 5.806451613 55.360000000 5.360000000 +1.354838710 6.000000000 55.360000000 5.360000000 +1.548387097 0.000000000 38.880000000 5.540000000 +1.548387097 0.193548387 38.880000000 5.540000000 +1.548387097 0.387096774 38.880000000 5.540000000 +1.548387097 0.580645161 38.880000000 5.540000000 +1.548387097 0.774193548 38.880000000 5.540000000 +1.548387097 0.967741935 38.880000000 5.540000000 +1.548387097 1.161290323 38.880000000 5.540000000 +1.548387097 1.354838710 38.880000000 5.540000000 +1.548387097 1.548387097 38.880000000 5.540000000 +1.548387097 1.741935484 38.480000000 5.740000000 +1.548387097 1.935483871 38.160000000 5.940000000 +1.548387097 2.129032258 37.600000000 6.200000000 +1.548387097 2.322580645 37.040000000 6.480000000 +1.548387097 2.516129032 36.400000000 6.780000000 +1.548387097 2.709677419 35.920000000 7.060000000 +1.548387097 2.903225806 35.280000000 7.360000000 +1.548387097 3.096774194 57.360000000 7.360000000 +1.548387097 3.290322581 57.120000000 7.060000000 +1.548387097 3.483870968 56.720000000 6.780000000 +1.548387097 3.677419355 56.480000000 6.480000000 +1.548387097 3.870967742 56.240000000 6.200000000 +1.548387097 4.064516129 55.920000000 5.960000000 +1.548387097 4.258064516 55.920000000 5.880000000 +1.548387097 4.451612903 55.760000000 5.780000000 +1.548387097 4.645161290 55.680000000 5.680000000 +1.548387097 4.838709677 55.600000000 5.580000000 +1.548387097 5.032258065 55.600000000 5.540000000 +1.548387097 5.225806452 55.600000000 5.540000000 +1.548387097 5.419354839 55.600000000 5.540000000 +1.548387097 5.612903226 55.600000000 5.540000000 +1.548387097 5.806451613 55.600000000 5.540000000 +1.548387097 6.000000000 55.600000000 5.540000000 +1.741935484 0.000000000 38.480000000 5.740000000 +1.741935484 0.193548387 38.480000000 5.740000000 +1.741935484 0.387096774 38.480000000 5.740000000 +1.741935484 0.580645161 38.480000000 5.740000000 +1.741935484 0.774193548 38.480000000 5.740000000 +1.741935484 0.967741935 38.480000000 5.740000000 +1.741935484 1.161290323 38.480000000 5.740000000 +1.741935484 1.354838710 38.480000000 5.740000000 +1.741935484 1.548387097 38.480000000 5.740000000 +1.741935484 1.741935484 38.480000000 5.740000000 +1.741935484 1.935483871 38.160000000 5.940000000 +1.741935484 2.129032258 37.600000000 6.200000000 +1.741935484 2.322580645 37.040000000 6.480000000 +1.741935484 2.516129032 36.400000000 6.780000000 +1.741935484 2.709677419 35.920000000 7.060000000 +1.741935484 2.903225806 35.280000000 7.360000000 +1.741935484 3.096774194 57.360000000 7.360000000 +1.741935484 3.290322581 57.120000000 7.060000000 +1.741935484 3.483870968 56.720000000 6.780000000 +1.741935484 3.677419355 56.480000000 6.480000000 +1.741935484 3.870967742 56.240000000 6.200000000 +1.741935484 4.064516129 55.920000000 5.960000000 +1.741935484 4.258064516 55.920000000 5.880000000 +1.741935484 4.451612903 55.760000000 5.780000000 +1.741935484 4.645161290 55.760000000 5.740000000 +1.741935484 4.838709677 55.760000000 5.740000000 +1.741935484 5.032258065 55.760000000 5.740000000 +1.741935484 5.225806452 55.760000000 5.740000000 +1.741935484 5.419354839 55.760000000 5.740000000 +1.741935484 5.612903226 55.760000000 5.740000000 +1.741935484 5.806451613 55.760000000 5.740000000 +1.741935484 6.000000000 55.760000000 5.740000000 +1.935483871 0.000000000 38.160000000 5.940000000 +1.935483871 0.193548387 38.160000000 5.940000000 +1.935483871 0.387096774 38.160000000 5.940000000 +1.935483871 0.580645161 38.160000000 5.940000000 +1.935483871 0.774193548 38.160000000 5.940000000 +1.935483871 0.967741935 38.160000000 5.940000000 +1.935483871 1.161290323 38.160000000 5.940000000 +1.935483871 1.354838710 38.160000000 5.940000000 +1.935483871 1.548387097 38.160000000 5.940000000 +1.935483871 1.741935484 38.160000000 5.940000000 +1.935483871 1.935483871 38.160000000 5.940000000 +1.935483871 2.129032258 37.600000000 6.200000000 +1.935483871 2.322580645 37.040000000 6.480000000 +1.935483871 2.516129032 36.400000000 6.780000000 +1.935483871 2.709677419 35.920000000 7.060000000 +1.935483871 2.903225806 35.280000000 7.360000000 +1.935483871 3.096774194 57.360000000 7.360000000 +1.935483871 3.290322581 57.120000000 7.060000000 +1.935483871 3.483870968 56.720000000 6.780000000 +1.935483871 3.677419355 56.480000000 6.480000000 +1.935483871 3.870967742 56.240000000 6.200000000 +1.935483871 4.064516129 55.920000000 5.960000000 +1.935483871 4.258064516 55.920000000 5.940000000 +1.935483871 4.451612903 55.920000000 5.940000000 +1.935483871 4.645161290 55.920000000 5.940000000 +1.935483871 4.838709677 55.920000000 5.940000000 +1.935483871 5.032258065 55.920000000 5.940000000 +1.935483871 5.225806452 55.920000000 5.940000000 +1.935483871 5.419354839 55.920000000 5.940000000 +1.935483871 5.612903226 55.920000000 5.940000000 +1.935483871 5.806451613 55.920000000 5.940000000 +1.935483871 6.000000000 55.920000000 5.940000000 +2.129032258 0.000000000 37.680000000 6.180000000 +2.129032258 0.193548387 37.680000000 6.180000000 +2.129032258 0.387096774 37.680000000 6.180000000 +2.129032258 0.580645161 37.680000000 6.180000000 +2.129032258 0.774193548 37.680000000 6.180000000 +2.129032258 0.967741935 37.680000000 6.180000000 +2.129032258 1.161290323 37.680000000 6.180000000 +2.129032258 1.354838710 37.680000000 6.180000000 +2.129032258 1.548387097 37.680000000 6.180000000 +2.129032258 1.741935484 37.680000000 6.180000000 +2.129032258 1.935483871 37.680000000 6.180000000 +2.129032258 2.129032258 37.600000000 6.200000000 +2.129032258 2.322580645 37.040000000 6.480000000 +2.129032258 2.516129032 36.400000000 6.780000000 +2.129032258 2.709677419 35.920000000 7.060000000 +2.129032258 2.903225806 35.280000000 7.360000000 +2.129032258 3.096774194 57.360000000 7.360000000 +2.129032258 3.290322581 57.120000000 7.060000000 +2.129032258 3.483870968 56.720000000 6.780000000 +2.129032258 3.677419355 56.480000000 6.480000000 +2.129032258 3.870967742 56.240000000 6.200000000 +2.129032258 4.064516129 56.160000000 6.180000000 +2.129032258 4.258064516 56.160000000 6.180000000 +2.129032258 4.451612903 56.160000000 6.180000000 +2.129032258 4.645161290 56.160000000 6.180000000 +2.129032258 4.838709677 56.160000000 6.180000000 +2.129032258 5.032258065 56.160000000 6.180000000 +2.129032258 5.225806452 56.160000000 6.180000000 +2.129032258 5.419354839 56.160000000 6.180000000 +2.129032258 5.612903226 56.160000000 6.180000000 +2.129032258 5.806451613 56.160000000 6.180000000 +2.129032258 6.000000000 56.160000000 6.180000000 +2.322580645 0.000000000 37.120000000 6.440000000 +2.322580645 0.193548387 37.120000000 6.440000000 +2.322580645 0.387096774 37.120000000 6.440000000 +2.322580645 0.580645161 37.120000000 6.440000000 +2.322580645 0.774193548 37.120000000 6.440000000 +2.322580645 0.967741935 37.120000000 6.440000000 +2.322580645 1.161290323 37.120000000 6.440000000 +2.322580645 1.354838710 37.120000000 6.440000000 +2.322580645 1.548387097 37.120000000 6.440000000 +2.322580645 1.741935484 37.120000000 6.440000000 +2.322580645 1.935483871 37.120000000 6.440000000 +2.322580645 2.129032258 37.120000000 6.440000000 +2.322580645 2.322580645 37.040000000 6.480000000 +2.322580645 2.516129032 36.400000000 6.780000000 +2.322580645 2.709677419 35.920000000 7.060000000 +2.322580645 2.903225806 35.280000000 7.360000000 +2.322580645 3.096774194 57.360000000 7.360000000 +2.322580645 3.290322581 57.120000000 7.060000000 +2.322580645 3.483870968 56.720000000 6.780000000 +2.322580645 3.677419355 56.480000000 6.480000000 +2.322580645 3.870967742 56.480000000 6.440000000 +2.322580645 4.064516129 56.480000000 6.440000000 +2.322580645 4.258064516 56.480000000 6.440000000 +2.322580645 4.451612903 56.480000000 6.440000000 +2.322580645 4.645161290 56.480000000 6.440000000 +2.322580645 4.838709677 56.480000000 6.440000000 +2.322580645 5.032258065 56.480000000 6.440000000 +2.322580645 5.225806452 56.480000000 6.440000000 +2.322580645 5.419354839 56.480000000 6.440000000 +2.322580645 5.612903226 56.480000000 6.440000000 +2.322580645 5.806451613 56.480000000 6.440000000 +2.322580645 6.000000000 56.480000000 6.440000000 +2.516129032 0.000000000 36.640000000 6.680000000 +2.516129032 0.193548387 36.640000000 6.680000000 +2.516129032 0.387096774 36.640000000 6.680000000 +2.516129032 0.580645161 36.640000000 6.680000000 +2.516129032 0.774193548 36.640000000 6.680000000 +2.516129032 0.967741935 36.640000000 6.680000000 +2.516129032 1.161290323 36.640000000 6.680000000 +2.516129032 1.354838710 36.640000000 6.680000000 +2.516129032 1.548387097 36.640000000 6.680000000 +2.516129032 1.741935484 36.640000000 6.680000000 +2.516129032 1.935483871 36.640000000 6.680000000 +2.516129032 2.129032258 36.640000000 6.680000000 +2.516129032 2.322580645 36.640000000 6.680000000 +2.516129032 2.516129032 36.400000000 6.780000000 +2.516129032 2.709677419 35.920000000 7.060000000 +2.516129032 2.903225806 35.280000000 7.360000000 +2.516129032 3.096774194 57.360000000 7.360000000 +2.516129032 3.290322581 57.120000000 7.060000000 +2.516129032 3.483870968 56.720000000 6.780000000 +2.516129032 3.677419355 56.640000000 6.680000000 +2.516129032 3.870967742 56.640000000 6.680000000 +2.516129032 4.064516129 56.640000000 6.680000000 +2.516129032 4.258064516 56.640000000 6.680000000 +2.516129032 4.451612903 56.640000000 6.680000000 +2.516129032 4.645161290 56.640000000 6.680000000 +2.516129032 4.838709677 56.640000000 6.680000000 +2.516129032 5.032258065 56.640000000 6.680000000 +2.516129032 5.225806452 56.640000000 6.680000000 +2.516129032 5.419354839 56.640000000 6.680000000 +2.516129032 5.612903226 56.640000000 6.680000000 +2.516129032 5.806451613 56.640000000 6.680000000 +2.516129032 6.000000000 56.640000000 6.680000000 +2.709677419 0.000000000 36.080000000 6.940000000 +2.709677419 0.193548387 36.080000000 6.940000000 +2.709677419 0.387096774 36.080000000 6.940000000 +2.709677419 0.580645161 36.080000000 6.940000000 +2.709677419 0.774193548 36.080000000 6.940000000 +2.709677419 0.967741935 36.080000000 6.940000000 +2.709677419 1.161290323 36.080000000 6.940000000 +2.709677419 1.354838710 36.080000000 6.940000000 +2.709677419 1.548387097 36.080000000 6.940000000 +2.709677419 1.741935484 36.080000000 6.940000000 +2.709677419 1.935483871 36.080000000 6.940000000 +2.709677419 2.129032258 36.080000000 6.940000000 +2.709677419 2.322580645 36.080000000 6.940000000 +2.709677419 2.516129032 36.080000000 6.940000000 +2.709677419 2.709677419 35.920000000 7.060000000 +2.709677419 2.903225806 35.280000000 7.360000000 +2.709677419 3.096774194 57.360000000 7.360000000 +2.709677419 3.290322581 57.120000000 7.060000000 +2.709677419 3.483870968 56.960000000 6.940000000 +2.709677419 3.677419355 56.960000000 6.940000000 +2.709677419 3.870967742 56.960000000 6.940000000 +2.709677419 4.064516129 56.960000000 6.940000000 +2.709677419 4.258064516 56.960000000 6.940000000 +2.709677419 4.451612903 56.960000000 6.940000000 +2.709677419 4.645161290 56.960000000 6.940000000 +2.709677419 4.838709677 56.960000000 6.940000000 +2.709677419 5.032258065 56.960000000 6.940000000 +2.709677419 5.225806452 56.960000000 6.940000000 +2.709677419 5.419354839 56.960000000 6.940000000 +2.709677419 5.612903226 56.960000000 6.940000000 +2.709677419 5.806451613 56.960000000 6.940000000 +2.709677419 6.000000000 56.960000000 6.940000000 +2.903225806 0.000000000 35.600000000 7.200000000 +2.903225806 0.193548387 35.600000000 7.200000000 +2.903225806 0.387096774 35.600000000 7.200000000 +2.903225806 0.580645161 35.600000000 7.200000000 +2.903225806 0.774193548 35.600000000 7.200000000 +2.903225806 0.967741935 35.600000000 7.200000000 +2.903225806 1.161290323 35.600000000 7.200000000 +2.903225806 1.354838710 35.600000000 7.200000000 +2.903225806 1.548387097 35.600000000 7.200000000 +2.903225806 1.741935484 35.600000000 7.200000000 +2.903225806 1.935483871 35.600000000 7.200000000 +2.903225806 2.129032258 35.600000000 7.200000000 +2.903225806 2.322580645 35.600000000 7.200000000 +2.903225806 2.516129032 35.600000000 7.200000000 +2.903225806 2.709677419 35.600000000 7.200000000 +2.903225806 2.903225806 35.280000000 7.360000000 +2.903225806 3.096774194 57.360000000 7.360000000 +2.903225806 3.290322581 57.200000000 7.200000000 +2.903225806 3.483870968 57.200000000 7.200000000 +2.903225806 3.677419355 57.200000000 7.200000000 +2.903225806 3.870967742 57.200000000 7.200000000 +2.903225806 4.064516129 57.200000000 7.200000000 +2.903225806 4.258064516 57.200000000 7.200000000 +2.903225806 4.451612903 57.200000000 7.200000000 +2.903225806 4.645161290 57.200000000 7.200000000 +2.903225806 4.838709677 57.200000000 7.200000000 +2.903225806 5.032258065 57.200000000 7.200000000 +2.903225806 5.225806452 57.200000000 7.200000000 +2.903225806 5.419354839 57.200000000 7.200000000 +2.903225806 5.612903226 57.200000000 7.200000000 +2.903225806 5.806451613 57.200000000 7.200000000 +2.903225806 6.000000000 57.200000000 7.200000000 +3.096774194 0.000000000 35.120000000 7.460000000 +3.096774194 0.193548387 35.120000000 7.460000000 +3.096774194 0.387096774 35.120000000 7.460000000 +3.096774194 0.580645161 35.120000000 7.460000000 +3.096774194 0.774193548 35.120000000 7.460000000 +3.096774194 0.967741935 35.120000000 7.460000000 +3.096774194 1.161290323 35.120000000 7.460000000 +3.096774194 1.354838710 35.120000000 7.460000000 +3.096774194 1.548387097 35.120000000 7.460000000 +3.096774194 1.741935484 35.120000000 7.460000000 +3.096774194 1.935483871 35.120000000 7.460000000 +3.096774194 2.129032258 35.120000000 7.460000000 +3.096774194 2.322580645 35.120000000 7.460000000 +3.096774194 2.516129032 35.120000000 7.460000000 +3.096774194 2.709677419 35.120000000 7.460000000 +3.096774194 2.903225806 35.120000000 7.460000000 +3.096774194 3.096774194 57.520000000 7.460000000 +3.096774194 3.290322581 57.520000000 7.460000000 +3.096774194 3.483870968 57.520000000 7.460000000 +3.096774194 3.677419355 57.520000000 7.460000000 +3.096774194 3.870967742 57.520000000 7.460000000 +3.096774194 4.064516129 57.520000000 7.460000000 +3.096774194 4.258064516 57.520000000 7.460000000 +3.096774194 4.451612903 57.520000000 7.460000000 +3.096774194 4.645161290 57.520000000 7.460000000 +3.096774194 4.838709677 57.520000000 7.460000000 +3.096774194 5.032258065 57.520000000 7.460000000 +3.096774194 5.225806452 57.520000000 7.460000000 +3.096774194 5.419354839 57.520000000 7.460000000 +3.096774194 5.612903226 57.520000000 7.460000000 +3.096774194 5.806451613 57.520000000 7.460000000 +3.096774194 6.000000000 57.520000000 7.460000000 +3.290322581 0.000000000 34.560000000 7.720000000 +3.290322581 0.193548387 34.560000000 7.720000000 +3.290322581 0.387096774 34.560000000 7.720000000 +3.290322581 0.580645161 34.560000000 7.720000000 +3.290322581 0.774193548 34.560000000 7.720000000 +3.290322581 0.967741935 34.560000000 7.720000000 +3.290322581 1.161290323 34.560000000 7.720000000 +3.290322581 1.354838710 34.560000000 7.720000000 +3.290322581 1.548387097 34.560000000 7.720000000 +3.290322581 1.741935484 34.560000000 7.720000000 +3.290322581 1.935483871 34.560000000 7.720000000 +3.290322581 2.129032258 34.560000000 7.720000000 +3.290322581 2.322580645 34.560000000 7.720000000 +3.290322581 2.516129032 34.560000000 7.720000000 +3.290322581 2.709677419 34.560000000 7.720000000 +3.290322581 2.903225806 47.280000000 7.720000000 +3.290322581 3.096774194 47.280000000 7.720000000 +3.290322581 3.290322581 57.680000000 7.720000000 +3.290322581 3.483870968 57.680000000 7.720000000 +3.290322581 3.677419355 57.680000000 7.720000000 +3.290322581 3.870967742 57.680000000 7.720000000 +3.290322581 4.064516129 57.680000000 7.720000000 +3.290322581 4.258064516 57.680000000 7.720000000 +3.290322581 4.451612903 57.680000000 7.720000000 +3.290322581 4.645161290 57.680000000 7.720000000 +3.290322581 4.838709677 57.680000000 7.720000000 +3.290322581 5.032258065 57.680000000 7.720000000 +3.290322581 5.225806452 57.680000000 7.720000000 +3.290322581 5.419354839 57.680000000 7.720000000 +3.290322581 5.612903226 57.680000000 7.720000000 +3.290322581 5.806451613 57.680000000 7.720000000 +3.290322581 6.000000000 57.680000000 7.720000000 +3.483870968 0.000000000 34.800000000 7.580000000 +3.483870968 0.193548387 34.800000000 7.580000000 +3.483870968 0.387096774 34.800000000 7.580000000 +3.483870968 0.580645161 34.800000000 7.580000000 +3.483870968 0.774193548 34.800000000 7.580000000 +3.483870968 0.967741935 34.800000000 7.580000000 +3.483870968 1.161290323 34.800000000 7.580000000 +3.483870968 1.354838710 34.800000000 7.580000000 +3.483870968 1.548387097 34.800000000 7.580000000 +3.483870968 1.741935484 34.800000000 7.580000000 +3.483870968 1.935483871 34.800000000 7.580000000 +3.483870968 2.129032258 34.800000000 7.580000000 +3.483870968 2.322580645 34.800000000 7.580000000 +3.483870968 2.516129032 34.800000000 7.580000000 +3.483870968 2.709677419 34.800000000 7.580000000 +3.483870968 2.903225806 34.800000000 7.580000000 +3.483870968 3.096774194 34.800000000 10.000000000 +3.483870968 3.290322581 72.240000000 17.420000000 +3.483870968 3.483870968 72.240000000 17.420000000 +3.483870968 3.677419355 72.240000000 17.420000000 +3.483870968 3.870967742 72.240000000 17.420000000 +3.483870968 4.064516129 72.240000000 17.420000000 +3.483870968 4.258064516 72.240000000 17.420000000 +3.483870968 4.451612903 72.240000000 17.420000000 +3.483870968 4.645161290 72.240000000 17.420000000 +3.483870968 4.838709677 72.240000000 17.420000000 +3.483870968 5.032258065 72.240000000 17.420000000 +3.483870968 5.225806452 72.240000000 17.420000000 +3.483870968 5.419354839 72.240000000 17.420000000 +3.483870968 5.612903226 72.240000000 17.420000000 +3.483870968 5.806451613 72.240000000 17.420000000 +3.483870968 6.000000000 72.240000000 17.420000000 +3.677419355 0.000000000 36.800000000 6.620000000 +3.677419355 0.193548387 36.800000000 6.620000000 +3.677419355 0.387096774 36.800000000 6.620000000 +3.677419355 0.580645161 36.800000000 6.620000000 +3.677419355 0.774193548 36.800000000 6.620000000 +3.677419355 0.967741935 36.800000000 6.620000000 +3.677419355 1.161290323 36.800000000 6.620000000 +3.677419355 1.354838710 36.800000000 6.620000000 +3.677419355 1.548387097 36.800000000 6.620000000 +3.677419355 1.741935484 36.800000000 6.620000000 +3.677419355 1.935483871 36.800000000 6.620000000 +3.677419355 2.129032258 36.800000000 6.620000000 +3.677419355 2.322580645 36.800000000 6.620000000 +3.677419355 2.516129032 36.640000000 6.680000000 +3.677419355 2.709677419 36.080000000 6.940000000 +3.677419355 2.903225806 35.600000000 7.200000000 +3.677419355 3.096774194 72.960000000 17.640000000 +3.677419355 3.290322581 73.840000000 17.940000000 +3.677419355 3.483870968 74.640000000 18.220000000 +3.677419355 3.677419355 75.200000000 18.380000000 +3.677419355 3.870967742 75.200000000 18.380000000 +3.677419355 4.064516129 75.200000000 18.380000000 +3.677419355 4.258064516 75.200000000 18.380000000 +3.677419355 4.451612903 75.200000000 18.380000000 +3.677419355 4.645161290 75.200000000 18.380000000 +3.677419355 4.838709677 75.200000000 18.380000000 +3.677419355 5.032258065 75.200000000 18.380000000 +3.677419355 5.225806452 75.200000000 18.380000000 +3.677419355 5.419354839 75.200000000 18.380000000 +3.677419355 5.612903226 75.200000000 18.380000000 +3.677419355 5.806451613 75.200000000 18.380000000 +3.677419355 6.000000000 75.200000000 18.380000000 +3.870967742 0.000000000 38.720000000 5.640000000 +3.870967742 0.193548387 38.720000000 5.640000000 +3.870967742 0.387096774 38.720000000 5.640000000 +3.870967742 0.580645161 38.720000000 5.640000000 +3.870967742 0.774193548 38.720000000 5.640000000 +3.870967742 0.967741935 38.720000000 5.640000000 +3.870967742 1.161290323 38.720000000 5.640000000 +3.870967742 1.354838710 38.640000000 5.680000000 +3.870967742 1.548387097 38.480000000 5.780000000 +3.870967742 1.741935484 38.240000000 5.880000000 +3.870967742 1.935483871 38.080000000 5.960000000 +3.870967742 2.129032258 37.680000000 6.180000000 +3.870967742 2.322580645 37.120000000 6.440000000 +3.870967742 2.516129032 36.640000000 6.680000000 +3.870967742 2.709677419 36.080000000 6.940000000 +3.870967742 2.903225806 35.600000000 7.200000000 +3.870967742 3.096774194 72.960000000 17.640000000 +3.870967742 3.290322581 73.840000000 17.940000000 +3.870967742 3.483870968 74.640000000 18.220000000 +3.870967742 3.677419355 75.520000000 18.520000000 +3.870967742 3.870967742 76.400000000 18.800000000 +3.870967742 4.064516129 77.120000000 19.040000000 +3.870967742 4.258064516 77.360000000 19.120000000 +3.870967742 4.451612903 77.680000000 19.220000000 +3.870967742 4.645161290 78.000000000 19.320000000 +3.870967742 4.838709677 78.080000000 19.360000000 +3.870967742 5.032258065 78.080000000 19.360000000 +3.870967742 5.225806452 78.080000000 19.360000000 +3.870967742 5.419354839 78.080000000 19.360000000 +3.870967742 5.612903226 78.080000000 19.360000000 +3.870967742 5.806451613 78.080000000 19.360000000 +3.870967742 6.000000000 78.080000000 19.360000000 +4.064516129 0.000000000 39.680000000 5.160000000 +4.064516129 0.193548387 39.680000000 5.160000000 +4.064516129 0.387096774 39.600000000 5.200000000 +4.064516129 0.580645161 39.440000000 5.300000000 +4.064516129 0.774193548 39.200000000 5.380000000 +4.064516129 0.967741935 39.040000000 5.480000000 +4.064516129 1.161290323 38.800000000 5.580000000 +4.064516129 1.354838710 38.640000000 5.680000000 +4.064516129 1.548387097 38.480000000 5.780000000 +4.064516129 1.741935484 38.240000000 5.880000000 +4.064516129 1.935483871 38.080000000 5.960000000 +4.064516129 2.129032258 37.680000000 6.180000000 +4.064516129 2.322580645 37.120000000 6.440000000 +4.064516129 2.516129032 36.640000000 6.680000000 +4.064516129 2.709677419 36.080000000 6.940000000 +4.064516129 2.903225806 35.600000000 7.200000000 +4.064516129 3.096774194 72.960000000 17.640000000 +4.064516129 3.290322581 73.840000000 17.940000000 +4.064516129 3.483870968 74.640000000 18.220000000 +4.064516129 3.677419355 75.520000000 18.520000000 +4.064516129 3.870967742 76.400000000 18.800000000 +4.064516129 4.064516129 77.120000000 19.040000000 +4.064516129 4.258064516 77.360000000 19.120000000 +4.064516129 4.451612903 77.680000000 19.220000000 +4.064516129 4.645161290 78.000000000 19.320000000 +4.064516129 4.838709677 78.240000000 19.420000000 +4.064516129 5.032258065 78.560000000 19.520000000 +4.064516129 5.225806452 78.800000000 19.620000000 +4.064516129 5.419354839 79.120000000 19.700000000 +4.064516129 5.612903226 79.440000000 19.800000000 +4.064516129 5.806451613 79.520000000 19.840000000 +4.064516129 6.000000000 79.520000000 19.840000000 +4.258064516 0.000000000 38.720000000 5.640000000 +4.258064516 0.193548387 38.720000000 5.640000000 +4.258064516 0.387096774 38.720000000 5.640000000 +4.258064516 0.580645161 38.720000000 5.640000000 +4.258064516 0.774193548 38.720000000 5.640000000 +4.258064516 0.967741935 38.720000000 5.640000000 +4.258064516 1.161290323 38.720000000 5.640000000 +4.258064516 1.354838710 38.640000000 5.680000000 +4.258064516 1.548387097 38.480000000 5.780000000 +4.258064516 1.741935484 38.240000000 5.880000000 +4.258064516 1.935483871 38.080000000 5.960000000 +4.258064516 2.129032258 37.680000000 6.180000000 +4.258064516 2.322580645 37.120000000 6.440000000 +4.258064516 2.516129032 36.640000000 6.680000000 +4.258064516 2.709677419 36.080000000 6.940000000 +4.258064516 2.903225806 35.600000000 7.200000000 +4.258064516 3.096774194 72.960000000 17.640000000 +4.258064516 3.290322581 73.840000000 17.940000000 +4.258064516 3.483870968 74.640000000 18.220000000 +4.258064516 3.677419355 75.520000000 18.520000000 +4.258064516 3.870967742 76.400000000 18.800000000 +4.258064516 4.064516129 77.120000000 19.040000000 +4.258064516 4.258064516 77.360000000 19.120000000 +4.258064516 4.451612903 77.680000000 19.220000000 +4.258064516 4.645161290 78.000000000 19.320000000 +4.258064516 4.838709677 78.080000000 19.360000000 +4.258064516 5.032258065 78.080000000 19.360000000 +4.258064516 5.225806452 78.080000000 19.360000000 +4.258064516 5.419354839 78.080000000 19.360000000 +4.258064516 5.612903226 78.080000000 19.360000000 +4.258064516 5.806451613 78.080000000 19.360000000 +4.258064516 6.000000000 78.080000000 19.360000000 +4.451612903 0.000000000 37.760000000 6.120000000 +4.451612903 0.193548387 37.760000000 6.120000000 +4.451612903 0.387096774 37.760000000 6.120000000 +4.451612903 0.580645161 37.760000000 6.120000000 +4.451612903 0.774193548 37.760000000 6.120000000 +4.451612903 0.967741935 37.760000000 6.120000000 +4.451612903 1.161290323 37.760000000 6.120000000 +4.451612903 1.354838710 37.760000000 6.120000000 +4.451612903 1.548387097 37.760000000 6.120000000 +4.451612903 1.741935484 37.760000000 6.120000000 +4.451612903 1.935483871 37.760000000 6.120000000 +4.451612903 2.129032258 37.680000000 6.180000000 +4.451612903 2.322580645 37.120000000 6.440000000 +4.451612903 2.516129032 36.640000000 6.680000000 +4.451612903 2.709677419 36.080000000 6.940000000 +4.451612903 2.903225806 35.600000000 7.200000000 +4.451612903 3.096774194 72.960000000 17.640000000 +4.451612903 3.290322581 73.840000000 17.940000000 +4.451612903 3.483870968 74.640000000 18.220000000 +4.451612903 3.677419355 75.520000000 18.520000000 +4.451612903 3.870967742 76.400000000 18.800000000 +4.451612903 4.064516129 76.640000000 18.880000000 +4.451612903 4.258064516 76.640000000 18.880000000 +4.451612903 4.451612903 76.640000000 18.880000000 +4.451612903 4.645161290 76.640000000 18.880000000 +4.451612903 4.838709677 76.640000000 18.880000000 +4.451612903 5.032258065 76.640000000 18.880000000 +4.451612903 5.225806452 76.640000000 18.880000000 +4.451612903 5.419354839 76.640000000 18.880000000 +4.451612903 5.612903226 76.640000000 18.880000000 +4.451612903 5.806451613 76.640000000 18.880000000 +4.451612903 6.000000000 76.640000000 18.880000000 +4.645161290 0.000000000 36.800000000 6.620000000 +4.645161290 0.193548387 36.800000000 6.620000000 +4.645161290 0.387096774 36.800000000 6.620000000 +4.645161290 0.580645161 36.800000000 6.620000000 +4.645161290 0.774193548 36.800000000 6.620000000 +4.645161290 0.967741935 36.800000000 6.620000000 +4.645161290 1.161290323 36.800000000 6.620000000 +4.645161290 1.354838710 36.800000000 6.620000000 +4.645161290 1.548387097 36.800000000 6.620000000 +4.645161290 1.741935484 36.800000000 6.620000000 +4.645161290 1.935483871 36.800000000 6.620000000 +4.645161290 2.129032258 36.800000000 6.620000000 +4.645161290 2.322580645 36.800000000 6.620000000 +4.645161290 2.516129032 36.640000000 6.680000000 +4.645161290 2.709677419 36.080000000 6.940000000 +4.645161290 2.903225806 35.600000000 7.200000000 +4.645161290 3.096774194 72.960000000 17.640000000 +4.645161290 3.290322581 73.840000000 17.940000000 +4.645161290 3.483870968 74.640000000 18.220000000 +4.645161290 3.677419355 75.200000000 18.380000000 +4.645161290 3.870967742 75.200000000 18.380000000 +4.645161290 4.064516129 75.200000000 18.380000000 +4.645161290 4.258064516 75.200000000 18.380000000 +4.645161290 4.451612903 75.200000000 18.380000000 +4.645161290 4.645161290 75.200000000 18.380000000 +4.645161290 4.838709677 75.200000000 18.380000000 +4.645161290 5.032258065 75.200000000 18.380000000 +4.645161290 5.225806452 75.200000000 18.380000000 +4.645161290 5.419354839 75.200000000 18.380000000 +4.645161290 5.612903226 75.200000000 18.380000000 +4.645161290 5.806451613 75.200000000 18.380000000 +4.645161290 6.000000000 75.200000000 18.380000000 +4.838709677 0.000000000 35.760000000 7.100000000 +4.838709677 0.193548387 35.760000000 7.100000000 +4.838709677 0.387096774 35.760000000 7.100000000 +4.838709677 0.580645161 35.760000000 7.100000000 +4.838709677 0.774193548 35.760000000 7.100000000 +4.838709677 0.967741935 35.760000000 7.100000000 +4.838709677 1.161290323 35.760000000 7.100000000 +4.838709677 1.354838710 35.760000000 7.100000000 +4.838709677 1.548387097 35.760000000 7.100000000 +4.838709677 1.741935484 35.760000000 7.100000000 +4.838709677 1.935483871 35.760000000 7.100000000 +4.838709677 2.129032258 35.760000000 7.100000000 +4.838709677 2.322580645 35.760000000 7.100000000 +4.838709677 2.516129032 35.760000000 7.100000000 +4.838709677 2.709677419 35.760000000 7.100000000 +4.838709677 2.903225806 35.600000000 7.200000000 +4.838709677 3.096774194 72.960000000 17.640000000 +4.838709677 3.290322581 73.680000000 17.900000000 +4.838709677 3.483870968 73.680000000 17.900000000 +4.838709677 3.677419355 73.680000000 17.900000000 +4.838709677 3.870967742 73.680000000 17.900000000 +4.838709677 4.064516129 73.680000000 17.900000000 +4.838709677 4.258064516 73.680000000 17.900000000 +4.838709677 4.451612903 73.680000000 17.900000000 +4.838709677 4.645161290 73.680000000 17.900000000 +4.838709677 4.838709677 73.680000000 17.900000000 +4.838709677 5.032258065 73.680000000 17.900000000 +4.838709677 5.225806452 73.680000000 17.900000000 +4.838709677 5.419354839 73.680000000 17.900000000 +4.838709677 5.612903226 73.680000000 17.900000000 +4.838709677 5.806451613 73.680000000 17.900000000 +4.838709677 6.000000000 73.680000000 17.900000000 +5.032258065 0.000000000 34.800000000 7.580000000 +5.032258065 0.193548387 34.800000000 7.580000000 +5.032258065 0.387096774 34.800000000 7.580000000 +5.032258065 0.580645161 34.800000000 7.580000000 +5.032258065 0.774193548 34.800000000 7.580000000 +5.032258065 0.967741935 34.800000000 7.580000000 +5.032258065 1.161290323 34.800000000 7.580000000 +5.032258065 1.354838710 34.800000000 7.580000000 +5.032258065 1.548387097 34.800000000 7.580000000 +5.032258065 1.741935484 34.800000000 7.580000000 +5.032258065 1.935483871 34.800000000 7.580000000 +5.032258065 2.129032258 34.800000000 7.580000000 +5.032258065 2.322580645 34.800000000 7.580000000 +5.032258065 2.516129032 34.800000000 7.580000000 +5.032258065 2.709677419 34.800000000 7.580000000 +5.032258065 2.903225806 34.800000000 7.580000000 +5.032258065 3.096774194 34.800000000 10.000000000 +5.032258065 3.290322581 72.240000000 17.420000000 +5.032258065 3.483870968 72.240000000 17.420000000 +5.032258065 3.677419355 72.240000000 17.420000000 +5.032258065 3.870967742 72.240000000 17.420000000 +5.032258065 4.064516129 72.240000000 17.420000000 +5.032258065 4.258064516 72.240000000 17.420000000 +5.032258065 4.451612903 72.240000000 17.420000000 +5.032258065 4.645161290 72.240000000 17.420000000 +5.032258065 4.838709677 72.240000000 17.420000000 +5.032258065 5.032258065 72.240000000 17.420000000 +5.032258065 5.225806452 72.240000000 17.420000000 +5.032258065 5.419354839 72.240000000 17.420000000 +5.032258065 5.612903226 72.240000000 17.420000000 +5.032258065 5.806451613 72.240000000 17.420000000 +5.032258065 6.000000000 72.240000000 17.420000000 +5.225806452 0.000000000 33.840000000 8.060000000 +5.225806452 0.193548387 33.840000000 8.060000000 +5.225806452 0.387096774 33.840000000 8.060000000 +5.225806452 0.580645161 33.840000000 8.060000000 +5.225806452 0.774193548 33.840000000 8.060000000 +5.225806452 0.967741935 33.840000000 8.060000000 +5.225806452 1.161290323 33.840000000 8.060000000 +5.225806452 1.354838710 33.840000000 8.060000000 +5.225806452 1.548387097 33.840000000 8.060000000 +5.225806452 1.741935484 33.840000000 8.060000000 +5.225806452 1.935483871 33.840000000 8.060000000 +5.225806452 2.129032258 33.840000000 8.060000000 +5.225806452 2.322580645 33.840000000 8.060000000 +5.225806452 2.516129032 33.840000000 8.060000000 +5.225806452 2.709677419 33.840000000 10.000000000 +5.225806452 2.903225806 33.840000000 10.000000000 +5.225806452 3.096774194 33.840000000 10.000000000 +5.225806452 3.290322581 33.840000000 10.000000000 +5.225806452 3.483870968 33.840000000 10.000000000 +5.225806452 3.677419355 70.800000000 16.940000000 +5.225806452 3.870967742 70.800000000 16.940000000 +5.225806452 4.064516129 70.800000000 16.940000000 +5.225806452 4.258064516 70.800000000 16.940000000 +5.225806452 4.451612903 70.800000000 16.940000000 +5.225806452 4.645161290 70.800000000 16.940000000 +5.225806452 4.838709677 70.800000000 16.940000000 +5.225806452 5.032258065 70.800000000 16.940000000 +5.225806452 5.225806452 70.800000000 16.940000000 +5.225806452 5.419354839 70.800000000 16.940000000 +5.225806452 5.612903226 70.800000000 16.940000000 +5.225806452 5.806451613 70.800000000 16.940000000 +5.225806452 6.000000000 70.800000000 16.940000000 +5.419354839 0.000000000 32.880000000 8.540000000 +5.419354839 0.193548387 32.880000000 8.540000000 +5.419354839 0.387096774 32.880000000 8.540000000 +5.419354839 0.580645161 32.880000000 8.540000000 +5.419354839 0.774193548 32.880000000 8.540000000 +5.419354839 0.967741935 32.880000000 8.540000000 +5.419354839 1.161290323 32.880000000 8.540000000 +5.419354839 1.354838710 32.880000000 8.540000000 +5.419354839 1.548387097 32.880000000 8.540000000 +5.419354839 1.741935484 32.880000000 8.540000000 +5.419354839 1.935483871 32.880000000 8.540000000 +5.419354839 2.129032258 32.880000000 8.540000000 +5.419354839 2.322580645 32.880000000 10.000000000 +5.419354839 2.516129032 32.880000000 10.000000000 +5.419354839 2.709677419 32.880000000 10.000000000 +5.419354839 2.903225806 32.880000000 10.000000000 +5.419354839 3.096774194 32.880000000 10.000000000 +5.419354839 3.290322581 32.880000000 10.000000000 +5.419354839 3.483870968 32.880000000 10.000000000 +5.419354839 3.677419355 32.880000000 10.000000000 +5.419354839 3.870967742 32.880000000 10.000000000 +5.419354839 4.064516129 69.360000000 16.460000000 +5.419354839 4.258064516 69.360000000 16.460000000 +5.419354839 4.451612903 69.360000000 16.460000000 +5.419354839 4.645161290 69.360000000 16.460000000 +5.419354839 4.838709677 69.360000000 16.460000000 +5.419354839 5.032258065 69.360000000 16.460000000 +5.419354839 5.225806452 69.360000000 16.460000000 +5.419354839 5.419354839 69.360000000 16.460000000 +5.419354839 5.612903226 69.360000000 16.460000000 +5.419354839 5.806451613 69.360000000 16.460000000 +5.419354839 6.000000000 69.360000000 16.460000000 +5.612903226 0.000000000 31.920000000 9.040000000 +5.612903226 0.193548387 31.920000000 9.040000000 +5.612903226 0.387096774 31.920000000 9.040000000 +5.612903226 0.580645161 31.920000000 9.040000000 +5.612903226 0.774193548 31.920000000 9.040000000 +5.612903226 0.967741935 31.920000000 9.040000000 +5.612903226 1.161290323 31.920000000 9.040000000 +5.612903226 1.354838710 31.920000000 9.040000000 +5.612903226 1.548387097 31.920000000 9.040000000 +5.612903226 1.741935484 31.920000000 9.040000000 +5.612903226 1.935483871 31.920000000 9.040000000 +5.612903226 2.129032258 31.920000000 10.000000000 +5.612903226 2.322580645 31.920000000 10.000000000 +5.612903226 2.516129032 31.920000000 10.000000000 +5.612903226 2.709677419 31.920000000 10.000000000 +5.612903226 2.903225806 31.920000000 10.000000000 +5.612903226 3.096774194 31.920000000 10.000000000 +5.612903226 3.290322581 31.920000000 10.000000000 +5.612903226 3.483870968 31.920000000 10.000000000 +5.612903226 3.677419355 31.920000000 10.000000000 +5.612903226 3.870967742 31.920000000 10.000000000 +5.612903226 4.064516129 31.920000000 10.000000000 +5.612903226 4.258064516 31.920000000 10.000000000 +5.612903226 4.451612903 67.920000000 15.960000000 +5.612903226 4.645161290 67.920000000 15.960000000 +5.612903226 4.838709677 67.920000000 15.960000000 +5.612903226 5.032258065 67.920000000 15.960000000 +5.612903226 5.225806452 67.920000000 15.960000000 +5.612903226 5.419354839 67.920000000 15.960000000 +5.612903226 5.612903226 67.920000000 15.960000000 +5.612903226 5.806451613 67.920000000 15.960000000 +5.612903226 6.000000000 67.920000000 15.960000000 +5.806451613 0.000000000 30.960000000 9.520000000 +5.806451613 0.193548387 30.960000000 9.520000000 +5.806451613 0.387096774 30.960000000 9.520000000 +5.806451613 0.580645161 30.960000000 9.520000000 +5.806451613 0.774193548 30.960000000 9.520000000 +5.806451613 0.967741935 30.960000000 9.520000000 +5.806451613 1.161290323 30.960000000 9.520000000 +5.806451613 1.354838710 30.960000000 9.520000000 +5.806451613 1.548387097 30.960000000 10.000000000 +5.806451613 1.741935484 30.960000000 10.000000000 +5.806451613 1.935483871 30.960000000 10.000000000 +5.806451613 2.129032258 30.960000000 10.000000000 +5.806451613 2.322580645 30.960000000 10.000000000 +5.806451613 2.516129032 30.960000000 10.000000000 +5.806451613 2.709677419 30.960000000 10.000000000 +5.806451613 2.903225806 30.960000000 10.000000000 +5.806451613 3.096774194 30.960000000 10.000000000 +5.806451613 3.290322581 30.960000000 10.000000000 +5.806451613 3.483870968 30.960000000 10.000000000 +5.806451613 3.677419355 30.960000000 10.000000000 +5.806451613 3.870967742 30.960000000 10.000000000 +5.806451613 4.064516129 30.960000000 10.000000000 +5.806451613 4.258064516 30.960000000 10.000000000 +5.806451613 4.451612903 30.960000000 10.000000000 +5.806451613 4.645161290 66.480000000 15.480000000 +5.806451613 4.838709677 66.480000000 15.480000000 +5.806451613 5.032258065 66.480000000 15.480000000 +5.806451613 5.225806452 66.480000000 15.480000000 +5.806451613 5.419354839 66.480000000 15.480000000 +5.806451613 5.612903226 66.480000000 15.480000000 +5.806451613 5.806451613 66.480000000 15.480000000 +5.806451613 6.000000000 66.480000000 15.480000000 +6.000000000 0.000000000 nan nan +6.000000000 0.193548387 nan nan +6.000000000 0.387096774 nan nan +6.000000000 0.580645161 nan nan +6.000000000 0.774193548 nan nan +6.000000000 0.967741935 nan nan +6.000000000 1.161290323 nan nan +6.000000000 1.354838710 nan nan +6.000000000 1.548387097 nan nan +6.000000000 1.741935484 nan nan +6.000000000 1.935483871 nan nan +6.000000000 2.129032258 nan nan +6.000000000 2.322580645 nan nan +6.000000000 2.516129032 nan nan +6.000000000 2.709677419 nan nan +6.000000000 2.903225806 nan nan +6.000000000 3.096774194 nan nan +6.000000000 3.290322581 nan nan +6.000000000 3.483870968 nan nan +6.000000000 3.677419355 nan nan +6.000000000 3.870967742 nan nan +6.000000000 4.064516129 nan nan +6.000000000 4.258064516 nan nan +6.000000000 4.451612903 nan nan +6.000000000 4.645161290 nan nan +6.000000000 4.838709677 nan nan +6.000000000 5.032258065 nan nan +6.000000000 5.225806452 nan nan +6.000000000 5.419354839 nan nan +6.000000000 5.612903226 nan nan +6.000000000 5.806451613 nan nan +6.000000000 6.000000000 nan nan diff --git a/examples/mamdani/Laundry.fll b/examples/mamdani/Laundry.fll new file mode 100644 index 0000000..6abf2df --- /dev/null +++ b/examples/mamdani/Laundry.fll @@ -0,0 +1,46 @@ +Engine: Laundry +InputVariable: Load + enabled: true + range: 0.000 6.000 + lock-range: false + term: small Discrete 0.000 1.000 1.000 1.000 2.000 0.800 5.000 0.000 + term: normal Discrete 3.000 0.000 4.000 1.000 6.000 0.000 +InputVariable: Dirt + enabled: true + range: 0.000 6.000 + lock-range: false + term: low Discrete 0.000 1.000 2.000 0.800 5.000 0.000 + term: high Discrete 1.000 0.000 2.000 0.200 4.000 0.800 6.000 1.000 +OutputVariable: Detergent + enabled: true + range: 0.000 80.000 + lock-range: false + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + term: less_than_usual Discrete 10.000 0.000 40.000 1.000 50.000 0.000 + term: usual Discrete 40.000 0.000 50.000 1.000 60.000 1.000 80.000 0.000 + term: more_than_usual Discrete 50.000 0.000 80.000 1.000 +OutputVariable: Cycle + enabled: true + range: 0.000 20.000 + lock-range: false + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + term: short Discrete 0.000 1.000 10.000 1.000 20.000 0.000 + term: long Discrete 10.000 0.000 20.000 1.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if Load is small and Dirt is not high then Detergent is less_than_usual + rule: if Load is small and Dirt is high then Detergent is usual + rule: if Load is normal and Dirt is low then Detergent is less_than_usual + rule: if Load is normal and Dirt is high then Detergent is more_than_usual + rule: if Detergent is usual or Detergent is less_than_usual then Cycle is short + rule: if Detergent is more_than_usual then Cycle is long
\ No newline at end of file diff --git a/examples/mamdani/Laundry.java b/examples/mamdani/Laundry.java new file mode 100644 index 0000000..95cbe7c --- /dev/null +++ b/examples/mamdani/Laundry.java @@ -0,0 +1,89 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class Laundry{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("Laundry"); +engine.setDescription(""); + +InputVariable Load = new InputVariable(); +Load.setName("Load"); +Load.setDescription(""); +Load.setEnabled(true); +Load.setRange(0.000, 6.000); +Load.setLockValueInRange(false); +Load.addTerm(Discrete.create("small", 0.000, 1.000, 1.000, 1.000, 2.000, 0.800, 5.000, 0.000)); +Load.addTerm(Discrete.create("normal", 3.000, 0.000, 4.000, 1.000, 6.000, 0.000)); +engine.addInputVariable(Load); + +InputVariable Dirt = new InputVariable(); +Dirt.setName("Dirt"); +Dirt.setDescription(""); +Dirt.setEnabled(true); +Dirt.setRange(0.000, 6.000); +Dirt.setLockValueInRange(false); +Dirt.addTerm(Discrete.create("low", 0.000, 1.000, 2.000, 0.800, 5.000, 0.000)); +Dirt.addTerm(Discrete.create("high", 1.000, 0.000, 2.000, 0.200, 4.000, 0.800, 6.000, 1.000)); +engine.addInputVariable(Dirt); + +OutputVariable Detergent = new OutputVariable(); +Detergent.setName("Detergent"); +Detergent.setDescription(""); +Detergent.setEnabled(true); +Detergent.setRange(0.000, 80.000); +Detergent.setLockValueInRange(false); +Detergent.setAggregation(new Maximum()); +Detergent.setDefuzzifier(new MeanOfMaximum(500)); +Detergent.setDefaultValue(Double.NaN); +Detergent.setLockPreviousValue(false); +Detergent.addTerm(Discrete.create("less_than_usual", 10.000, 0.000, 40.000, 1.000, 50.000, 0.000)); +Detergent.addTerm(Discrete.create("usual", 40.000, 0.000, 50.000, 1.000, 60.000, 1.000, 80.000, 0.000)); +Detergent.addTerm(Discrete.create("more_than_usual", 50.000, 0.000, 80.000, 1.000)); +engine.addOutputVariable(Detergent); + +OutputVariable Cycle = new OutputVariable(); +Cycle.setName("Cycle"); +Cycle.setDescription(""); +Cycle.setEnabled(true); +Cycle.setRange(0.000, 20.000); +Cycle.setLockValueInRange(false); +Cycle.setAggregation(new Maximum()); +Cycle.setDefuzzifier(new MeanOfMaximum(500)); +Cycle.setDefaultValue(Double.NaN); +Cycle.setLockPreviousValue(false); +Cycle.addTerm(Discrete.create("short", 0.000, 1.000, 10.000, 1.000, 20.000, 0.000)); +Cycle.addTerm(Discrete.create("long", 10.000, 0.000, 20.000, 1.000)); +engine.addOutputVariable(Cycle); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new Minimum()); +ruleBlock.setDisjunction(new Maximum()); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if Load is small and Dirt is not high then Detergent is less_than_usual", engine)); +ruleBlock.addRule(Rule.parse("if Load is small and Dirt is high then Detergent is usual", engine)); +ruleBlock.addRule(Rule.parse("if Load is normal and Dirt is low then Detergent is less_than_usual", engine)); +ruleBlock.addRule(Rule.parse("if Load is normal and Dirt is high then Detergent is more_than_usual", engine)); +ruleBlock.addRule(Rule.parse("if Detergent is usual or Detergent is less_than_usual then Cycle is short", engine)); +ruleBlock.addRule(Rule.parse("if Detergent is more_than_usual then Cycle is long", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/Laundry.pdf b/examples/mamdani/Laundry.pdf Binary files differnew file mode 100644 index 0000000..42df3cf --- /dev/null +++ b/examples/mamdani/Laundry.pdf diff --git a/examples/mamdani/ObstacleAvoidance.R b/examples/mamdani/ObstacleAvoidance.R new file mode 100644 index 0000000..5533d26 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.R @@ -0,0 +1,57 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "ObstacleAvoidance" +engine.fll = "Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left" + +engine.fldFile = "ObstacleAvoidance.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs mSteer") + +engine.plot.o1_i1 = ggplot(engine.df, aes(obstacle, mSteer)) + + geom_line(aes(color=mSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("mSteer vs obstacle") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/ObstacleAvoidance.cpp b/examples/mamdani/ObstacleAvoidance.cpp new file mode 100644 index 0000000..341ffe5 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.cpp @@ -0,0 +1,49 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("ObstacleAvoidance"); +engine->setDescription(""); + +InputVariable* obstacle = new InputVariable; +obstacle->setName("obstacle"); +obstacle->setDescription(""); +obstacle->setEnabled(true); +obstacle->setRange(0.000, 1.000); +obstacle->setLockValueInRange(false); +obstacle->addTerm(new Ramp("left", 1.000, 0.000)); +obstacle->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addInputVariable(obstacle); + +OutputVariable* mSteer = new OutputVariable; +mSteer->setName("mSteer"); +mSteer->setDescription(""); +mSteer->setEnabled(true); +mSteer->setRange(0.000, 1.000); +mSteer->setLockValueInRange(false); +mSteer->setAggregation(new Maximum); +mSteer->setDefuzzifier(new Centroid(100)); +mSteer->setDefaultValue(fl::nan); +mSteer->setLockPreviousValue(false); +mSteer->addTerm(new Ramp("left", 1.000, 0.000)); +mSteer->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addOutputVariable(mSteer); + +RuleBlock* mamdani = new RuleBlock; +mamdani->setName("mamdani"); +mamdani->setDescription(""); +mamdani->setEnabled(true); +mamdani->setConjunction(fl::null); +mamdani->setDisjunction(fl::null); +mamdani->setImplication(new AlgebraicProduct); +mamdani->setActivation(new General); +mamdani->addRule(Rule::parse("if obstacle is left then mSteer is right", engine)); +mamdani->addRule(Rule::parse("if obstacle is right then mSteer is left", engine)); +engine->addRuleBlock(mamdani); + + +} diff --git a/examples/mamdani/ObstacleAvoidance.fcl b/examples/mamdani/ObstacleAvoidance.fcl new file mode 100644 index 0000000..1f2bac0 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.fcl @@ -0,0 +1,34 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK ObstacleAvoidance + +VAR_INPUT + obstacle: REAL; +END_VAR + +VAR_OUTPUT + mSteer: REAL; +END_VAR + +FUZZIFY obstacle + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; +END_FUZZIFY + +DEFUZZIFY mSteer + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK mamdani + ACT : PROD; + RULE 1 : if obstacle is left then mSteer is right + RULE 2 : if obstacle is right then mSteer is left +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/ObstacleAvoidance.fis b/examples/mamdani/ObstacleAvoidance.fis new file mode 100644 index 0000000..f938ec0 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.fis @@ -0,0 +1,32 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='ObstacleAvoidance' +Type='mamdani' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=2 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='obstacle' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output1] +Name='mSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Rules] +1.000 , 2.000 (1.000) : 1 +2.000 , 1.000 (1.000) : 1 diff --git a/examples/mamdani/ObstacleAvoidance.fld b/examples/mamdani/ObstacleAvoidance.fld new file mode 100644 index 0000000..ec259dd --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.fld @@ -0,0 +1,1025 @@ +obstacle mSteer +0.000000000 0.666650000 +0.000977517 0.666650000 +0.001955034 0.666650000 +0.002932551 0.666650000 +0.003910068 0.666650000 +0.004887586 0.666650000 +0.005865103 0.666638485 +0.006842620 0.666625450 +0.007820137 0.666612389 +0.008797654 0.666599303 +0.009775171 0.666586193 +0.010752688 0.666573056 +0.011730205 0.666559894 +0.012707722 0.666546707 +0.013685239 0.666533494 +0.014662757 0.666520255 +0.015640274 0.666498518 +0.016617791 0.666472271 +0.017595308 0.666445974 +0.018572825 0.666419626 +0.019550342 0.666393229 +0.020527859 0.666366781 +0.021505376 0.666340282 +0.022482893 0.666313732 +0.023460411 0.666287131 +0.024437928 0.666260479 +0.025415445 0.666228313 +0.026392962 0.666188686 +0.027370479 0.666148986 +0.028347996 0.666109209 +0.029325513 0.666069358 +0.030303030 0.666029432 +0.031280547 0.665989429 +0.032258065 0.665949351 +0.033235582 0.665909196 +0.034213099 0.665868966 +0.035190616 0.665826169 +0.036168133 0.665773005 +0.037145650 0.665719742 +0.038123167 0.665666380 +0.039100684 0.665612917 +0.040078201 0.665559355 +0.041055718 0.665505693 +0.042033236 0.665451930 +0.043010753 0.665398066 +0.043988270 0.665344101 +0.044965787 0.665290034 +0.045943304 0.665223628 +0.046920821 0.665156655 +0.047898338 0.665089559 +0.048875855 0.665022339 +0.049853372 0.664954994 +0.050830890 0.664887525 +0.051808407 0.664819932 +0.052785924 0.664752213 +0.053763441 0.664684369 +0.054740958 0.664616398 +0.055718475 0.664539056 +0.056695992 0.664458237 +0.057673509 0.664377270 +0.058651026 0.664296156 +0.059628543 0.664214895 +0.060606061 0.664133485 +0.061583578 0.664051926 +0.062561095 0.663970218 +0.063538612 0.663888361 +0.064516129 0.663806354 +0.065493646 0.663717900 +0.066471163 0.663623109 +0.067448680 0.663528148 +0.068426197 0.663433016 +0.069403715 0.663337714 +0.070381232 0.663242240 +0.071358749 0.663146594 +0.072336266 0.663050776 +0.073313783 0.662954785 +0.074291300 0.662858620 +0.075268817 0.662758885 +0.076246334 0.662650011 +0.077223851 0.662540943 +0.078201369 0.662431683 +0.079178886 0.662322229 +0.080156403 0.662212581 +0.081133920 0.662102739 +0.082111437 0.661992701 +0.083088954 0.661882468 +0.084066471 0.661772039 +0.085043988 0.661660863 +0.086021505 0.661537806 +0.086999022 0.661414534 +0.087976540 0.661291048 +0.088954057 0.661167346 +0.089931574 0.661043428 +0.090909091 0.660919294 +0.091886608 0.660794942 +0.092864125 0.660670373 +0.093841642 0.660545585 +0.094819159 0.660420579 +0.095796676 0.660285492 +0.096774194 0.660147932 +0.097751711 0.660010136 +0.098729228 0.659872104 +0.099706745 0.659733835 +0.100684262 0.659595328 +0.101661779 0.659456582 +0.102639296 0.659317597 +0.103616813 0.659178373 +0.104594330 0.659038909 +0.105571848 0.658892208 +0.106549365 0.658740291 +0.107526882 0.658588119 +0.108504399 0.658435689 +0.109481916 0.658283002 +0.110459433 0.658130057 +0.111436950 0.657976852 +0.112414467 0.657823389 +0.113391984 0.657669665 +0.114369501 0.657515680 +0.115347019 0.657357242 +0.116324536 0.657190916 +0.117302053 0.657024315 +0.118279570 0.656857437 +0.119257087 0.656690282 +0.120234604 0.656522850 +0.121212121 0.656355139 +0.122189638 0.656187149 +0.123167155 0.656018879 +0.124144673 0.655850329 +0.125122190 0.655680041 +0.126099707 0.655499270 +0.127077224 0.655318205 +0.128054741 0.655136845 +0.129032258 0.654955190 +0.130009775 0.654773238 +0.130987292 0.654590990 +0.131964809 0.654408443 +0.132942326 0.654225598 +0.133919844 0.654042454 +0.134897361 0.653859010 +0.135874878 0.653664982 +0.136852395 0.653469436 +0.137829912 0.653273578 +0.138807429 0.653077407 +0.139784946 0.652880922 +0.140762463 0.652684123 +0.141739980 0.652487008 +0.142717498 0.652289577 +0.143695015 0.652091829 +0.144672532 0.651893763 +0.145650049 0.651687855 +0.146627566 0.651477831 +0.147605083 0.651267477 +0.148582600 0.651056794 +0.149560117 0.650845780 +0.150537634 0.650634436 +0.151515152 0.650422759 +0.152492669 0.650210750 +0.153470186 0.649998407 +0.154447703 0.649785731 +0.155425220 0.649567877 +0.156402737 0.649343393 +0.157380254 0.649118566 +0.158357771 0.648893393 +0.159335288 0.648667875 +0.160312805 0.648442011 +0.161290323 0.648215799 +0.162267840 0.647989239 +0.163245357 0.647762331 +0.164222874 0.647535073 +0.165200391 0.647305221 +0.166177908 0.647066320 +0.167155425 0.646827060 +0.168132942 0.646587441 +0.169110459 0.646347463 +0.170087977 0.646107124 +0.171065494 0.645866424 +0.172043011 0.645625361 +0.173020528 0.645383936 +0.173998045 0.645142147 +0.174975562 0.644899993 +0.175953079 0.644647002 +0.176930596 0.644393373 +0.177908113 0.644139372 +0.178885630 0.643884998 +0.179863148 0.643630251 +0.180840665 0.643375130 +0.181818182 0.643119633 +0.182795699 0.642863761 +0.183773216 0.642607513 +0.184750733 0.642350886 +0.185728250 0.642086038 +0.186705767 0.641818123 +0.187683284 0.641549824 +0.188660802 0.641281142 +0.189638319 0.641012074 +0.190615836 0.640742621 +0.191593353 0.640472782 +0.192570870 0.640202555 +0.193548387 0.639931940 +0.194525904 0.639660937 +0.195503421 0.639384233 +0.196480938 0.639102138 +0.197458456 0.638819650 +0.198435973 0.638536767 +0.199413490 0.638253490 +0.200391007 0.637969817 +0.201368524 0.637685747 +0.202346041 0.637401280 +0.203323558 0.637116415 +0.204301075 0.636831150 +0.205278592 0.636542613 +0.206256109 0.636246466 +0.207233627 0.635949918 +0.208211144 0.635652966 +0.209188661 0.635355612 +0.210166178 0.635057853 +0.211143695 0.634759688 +0.212121212 0.634461118 +0.213098729 0.634162142 +0.214076246 0.633862757 +0.215053763 0.633562423 +0.216031281 0.633252376 +0.217008798 0.632941920 +0.217986315 0.632631055 +0.218963832 0.632319779 +0.219941349 0.632008091 +0.220918866 0.631695992 +0.221896383 0.631383479 +0.222873900 0.631070553 +0.223851417 0.630757212 +0.224828935 0.630443455 +0.225806452 0.630121364 +0.226783969 0.629797178 +0.227761486 0.629472576 +0.228739003 0.629147559 +0.229716520 0.628822125 +0.230694037 0.628496272 +0.231671554 0.628170002 +0.232649071 0.627843312 +0.233626588 0.627516202 +0.234604106 0.627188671 +0.235581623 0.626855159 +0.236559140 0.626517443 +0.237536657 0.626179308 +0.238514174 0.625840753 +0.239491691 0.625501777 +0.240469208 0.625162379 +0.241446725 0.624822559 +0.242424242 0.624482316 +0.243401760 0.624141649 +0.244379277 0.623800557 +0.245356794 0.623455725 +0.246334311 0.623104704 +0.247311828 0.622753262 +0.248289345 0.622401397 +0.249266862 0.622049109 +0.250244379 0.621696398 +0.251221896 0.621343261 +0.252199413 0.620989700 +0.253176931 0.620635712 +0.254154448 0.620281297 +0.255131965 0.619925265 +0.256109482 0.619561189 +0.257086999 0.619196691 +0.258064516 0.618831769 +0.259042033 0.618466424 +0.260019550 0.618100655 +0.260997067 0.617734460 +0.261974585 0.617367839 +0.262952102 0.617000791 +0.263929619 0.616633316 +0.264907136 0.616265413 +0.265884653 0.615889366 +0.266862170 0.615512088 +0.267839687 0.615134387 +0.268817204 0.614756264 +0.269794721 0.614377718 +0.270772239 0.613998747 +0.271749756 0.613619351 +0.272727273 0.613239530 +0.273704790 0.612859282 +0.274682307 0.612478608 +0.275659824 0.612091947 +0.276637341 0.611702189 +0.277614858 0.611312012 +0.278592375 0.610921415 +0.279569892 0.610530398 +0.280547410 0.610138959 +0.281524927 0.609747097 +0.282502444 0.609354813 +0.283479961 0.608962106 +0.284457478 0.608568974 +0.285434995 0.608171886 +0.286412512 0.607769974 +0.287390029 0.607367648 +0.288367546 0.606964906 +0.289345064 0.606561748 +0.290322581 0.606158173 +0.291300098 0.605754180 +0.292277615 0.605349770 +0.293255132 0.604944940 +0.294232649 0.604539690 +0.295210166 0.604132380 +0.296187683 0.603718665 +0.297165200 0.603304542 +0.298142717 0.602890009 +0.299120235 0.602475066 +0.300097752 0.602059712 +0.301075269 0.601643947 +0.302052786 0.601227769 +0.303030303 0.600811179 +0.304007820 0.600394176 +0.304985337 0.599976759 +0.305962854 0.599551726 +0.306940371 0.599126182 +0.307917889 0.598700236 +0.308895406 0.598273888 +0.309872923 0.597847137 +0.310850440 0.597419982 +0.311827957 0.596992424 +0.312805474 0.596564460 +0.313782991 0.596136092 +0.314760508 0.595707318 +0.315738025 0.595272860 +0.316715543 0.594836296 +0.317693060 0.594399340 +0.318670577 0.593961991 +0.319648094 0.593524248 +0.320625611 0.593086112 +0.321603128 0.592647581 +0.322580645 0.592208655 +0.323558162 0.591769334 +0.324535679 0.591329617 +0.325513196 0.590886006 +0.326490714 0.590438847 +0.327468231 0.589991307 +0.328445748 0.589543385 +0.329423265 0.589095081 +0.330400782 0.588646394 +0.331378299 0.588197324 +0.332355816 0.587747870 +0.333333333 0.587298033 +0.334310850 0.586847811 +0.335288368 0.586395337 +0.336265885 0.585938031 +0.337243402 0.585480357 +0.338220919 0.585022313 +0.339198436 0.584563900 +0.340175953 0.584105117 +0.341153470 0.583645965 +0.342130987 0.583186441 +0.343108504 0.582726546 +0.344086022 0.582266280 +0.345063539 0.581805253 +0.346041056 0.581338270 +0.347018573 0.580870934 +0.347996090 0.580403243 +0.348973607 0.579935197 +0.349951124 0.579466795 +0.350928641 0.578998038 +0.351906158 0.578528925 +0.352883675 0.578059455 +0.353861193 0.577589628 +0.354838710 0.577119444 +0.355816227 0.576644207 +0.356793744 0.576167703 +0.357771261 0.575690860 +0.358748778 0.575213679 +0.359726295 0.574736158 +0.360703812 0.574258297 +0.361681329 0.573780096 +0.362658847 0.573301554 +0.363636364 0.572822672 +0.364613881 0.572343449 +0.365591398 0.571860698 +0.366568915 0.571375542 +0.367546432 0.570890065 +0.368523949 0.570404267 +0.369501466 0.569918146 +0.370478983 0.569431703 +0.371456500 0.568944938 +0.372434018 0.568457849 +0.373411535 0.567970438 +0.374389052 0.567482703 +0.375366569 0.566992805 +0.376344086 0.566499534 +0.377321603 0.566005960 +0.378299120 0.565512083 +0.379276637 0.565017903 +0.380254154 0.564523420 +0.381231672 0.564028633 +0.382209189 0.563533542 +0.383186706 0.563038147 +0.384164223 0.562542448 +0.385141740 0.562045786 +0.386119257 0.561544954 +0.387096774 0.561043840 +0.388074291 0.560542444 +0.389051808 0.560040764 +0.390029326 0.559538801 +0.391006843 0.559036555 +0.391984360 0.558534026 +0.392961877 0.558031212 +0.393939394 0.557528114 +0.394916911 0.557024732 +0.395894428 0.556517268 +0.396871945 0.556009189 +0.397849462 0.555500848 +0.398826979 0.554992247 +0.399804497 0.554483383 +0.400782014 0.553974258 +0.401759531 0.553464870 +0.402737048 0.552955221 +0.403714565 0.552445308 +0.404692082 0.551935134 +0.405669599 0.551422112 +0.406647116 0.550907660 +0.407624633 0.550392969 +0.408602151 0.549878039 +0.409579668 0.549362870 +0.410557185 0.548847462 +0.411534702 0.548331815 +0.412512219 0.547815928 +0.413489736 0.547299802 +0.414467253 0.546783436 +0.415444770 0.546265287 +0.416422287 0.545745069 +0.417399804 0.545224637 +0.418377322 0.544703989 +0.419354839 0.544183126 +0.420332356 0.543662048 +0.421309873 0.543140754 +0.422287390 0.542619244 +0.423264907 0.542097518 +0.424242424 0.541575577 +0.425219941 0.541052744 +0.426197458 0.540527383 +0.427174976 0.540001832 +0.428152493 0.539476090 +0.429130010 0.538950158 +0.430107527 0.538424035 +0.431085044 0.537897722 +0.432062561 0.537371217 +0.433040078 0.536844521 +0.434017595 0.536317635 +0.434995112 0.535790557 +0.435972630 0.535260701 +0.436950147 0.534730668 +0.437927664 0.534200469 +0.438905181 0.533670106 +0.439882698 0.533139577 +0.440860215 0.532608883 +0.441837732 0.532078024 +0.442815249 0.531546999 +0.443792766 0.531015810 +0.444770283 0.530484454 +0.445747801 0.529951246 +0.446725318 0.529417377 +0.447702835 0.528883370 +0.448680352 0.528349224 +0.449657869 0.527814939 +0.450635386 0.527280516 +0.451612903 0.526745953 +0.452590420 0.526211252 +0.453567937 0.525676412 +0.454545455 0.525141432 +0.455522972 0.524605346 +0.456500489 0.524068300 +0.457478006 0.523531142 +0.458455523 0.522993872 +0.459433040 0.522456490 +0.460410557 0.521918997 +0.461388074 0.521381392 +0.462365591 0.520843675 +0.463343109 0.520305846 +0.464320626 0.519767905 +0.465298143 0.519229421 +0.466275660 0.518689863 +0.467253177 0.518150220 +0.468230694 0.517610493 +0.469208211 0.517070682 +0.470185728 0.516530787 +0.471163245 0.515990807 +0.472140762 0.515450743 +0.473118280 0.514910594 +0.474095797 0.514370361 +0.475073314 0.513829968 +0.476050831 0.513288569 +0.477028348 0.512747115 +0.478005865 0.512205604 +0.478983382 0.511664036 +0.479960899 0.511122412 +0.480938416 0.510580732 +0.481915934 0.510038995 +0.482893451 0.509497202 +0.483870968 0.508955352 +0.484848485 0.508413446 +0.485826002 0.507870980 +0.486803519 0.507328390 +0.487781036 0.506785773 +0.488758553 0.506243127 +0.489736070 0.505700453 +0.490713587 0.505157751 +0.491691105 0.504615020 +0.492668622 0.504072261 +0.493646139 0.503529474 +0.494623656 0.502986658 +0.495601173 0.502443695 +0.496578690 0.501900652 +0.497556207 0.501357608 +0.498533724 0.500814565 +0.499511241 0.500271522 +0.500488759 0.499728478 +0.501466276 0.499185435 +0.502443793 0.498642392 +0.503421310 0.498099348 +0.504398827 0.497556305 +0.505376344 0.497013342 +0.506353861 0.496470526 +0.507331378 0.495927739 +0.508308895 0.495384980 +0.509286413 0.494842249 +0.510263930 0.494299547 +0.511241447 0.493756873 +0.512218964 0.493214227 +0.513196481 0.492671610 +0.514173998 0.492129020 +0.515151515 0.491586554 +0.516129032 0.491044648 +0.517106549 0.490502798 +0.518084066 0.489961005 +0.519061584 0.489419268 +0.520039101 0.488877588 +0.521016618 0.488335964 +0.521994135 0.487794396 +0.522971652 0.487252885 +0.523949169 0.486711431 +0.524926686 0.486170032 +0.525904203 0.485629639 +0.526881720 0.485089406 +0.527859238 0.484549257 +0.528836755 0.484009193 +0.529814272 0.483469213 +0.530791789 0.482929318 +0.531769306 0.482389507 +0.532746823 0.481849780 +0.533724340 0.481310137 +0.534701857 0.480770579 +0.535679374 0.480232095 +0.536656891 0.479694154 +0.537634409 0.479156325 +0.538611926 0.478618608 +0.539589443 0.478081003 +0.540566960 0.477543510 +0.541544477 0.477006128 +0.542521994 0.476468858 +0.543499511 0.475931700 +0.544477028 0.475394654 +0.545454545 0.474858568 +0.546432063 0.474323588 +0.547409580 0.473788748 +0.548387097 0.473254047 +0.549364614 0.472719484 +0.550342131 0.472185061 +0.551319648 0.471650776 +0.552297165 0.471116630 +0.553274682 0.470582623 +0.554252199 0.470048754 +0.555229717 0.469515546 +0.556207234 0.468984190 +0.557184751 0.468453001 +0.558162268 0.467921976 +0.559139785 0.467391117 +0.560117302 0.466860423 +0.561094819 0.466329894 +0.562072336 0.465799531 +0.563049853 0.465269332 +0.564027370 0.464739299 +0.565004888 0.464209443 +0.565982405 0.463682365 +0.566959922 0.463155479 +0.567937439 0.462628783 +0.568914956 0.462102278 +0.569892473 0.461575965 +0.570869990 0.461049842 +0.571847507 0.460523910 +0.572825024 0.459998168 +0.573802542 0.459472617 +0.574780059 0.458947256 +0.575757576 0.458424423 +0.576735093 0.457902482 +0.577712610 0.457380756 +0.578690127 0.456859246 +0.579667644 0.456337952 +0.580645161 0.455816874 +0.581622678 0.455296011 +0.582600196 0.454775363 +0.583577713 0.454254931 +0.584555230 0.453734713 +0.585532747 0.453216564 +0.586510264 0.452700198 +0.587487781 0.452184072 +0.588465298 0.451668185 +0.589442815 0.451152538 +0.590420332 0.450637130 +0.591397849 0.450121961 +0.592375367 0.449607031 +0.593352884 0.449092340 +0.594330401 0.448577888 +0.595307918 0.448064866 +0.596285435 0.447554692 +0.597262952 0.447044779 +0.598240469 0.446535130 +0.599217986 0.446025742 +0.600195503 0.445516617 +0.601173021 0.445007753 +0.602150538 0.444499152 +0.603128055 0.443990811 +0.604105572 0.443482732 +0.605083089 0.442975268 +0.606060606 0.442471886 +0.607038123 0.441968788 +0.608015640 0.441465974 +0.608993157 0.440963445 +0.609970674 0.440461199 +0.610948192 0.439959236 +0.611925709 0.439457556 +0.612903226 0.438956160 +0.613880743 0.438455046 +0.614858260 0.437954214 +0.615835777 0.437457552 +0.616813294 0.436961853 +0.617790811 0.436466458 +0.618768328 0.435971367 +0.619745846 0.435476580 +0.620723363 0.434982097 +0.621700880 0.434487917 +0.622678397 0.433994040 +0.623655914 0.433500466 +0.624633431 0.433007195 +0.625610948 0.432517297 +0.626588465 0.432029562 +0.627565982 0.431542151 +0.628543500 0.431055062 +0.629521017 0.430568297 +0.630498534 0.430081854 +0.631476051 0.429595733 +0.632453568 0.429109935 +0.633431085 0.428624458 +0.634408602 0.428139302 +0.635386119 0.427656551 +0.636363636 0.427177328 +0.637341153 0.426698446 +0.638318671 0.426219904 +0.639296188 0.425741703 +0.640273705 0.425263842 +0.641251222 0.424786321 +0.642228739 0.424309140 +0.643206256 0.423832297 +0.644183773 0.423355793 +0.645161290 0.422880556 +0.646138807 0.422410372 +0.647116325 0.421940545 +0.648093842 0.421471075 +0.649071359 0.421001962 +0.650048876 0.420533205 +0.651026393 0.420064803 +0.652003910 0.419596757 +0.652981427 0.419129066 +0.653958944 0.418661730 +0.654936461 0.418194747 +0.655913978 0.417733720 +0.656891496 0.417273454 +0.657869013 0.416813559 +0.658846530 0.416354035 +0.659824047 0.415894883 +0.660801564 0.415436100 +0.661779081 0.414977687 +0.662756598 0.414519643 +0.663734115 0.414061969 +0.664711632 0.413604663 +0.665689150 0.413152189 +0.666666667 0.412701967 +0.667644184 0.412252130 +0.668621701 0.411802676 +0.669599218 0.411353606 +0.670576735 0.410904919 +0.671554252 0.410456615 +0.672531769 0.410008693 +0.673509286 0.409561153 +0.674486804 0.409113994 +0.675464321 0.408670383 +0.676441838 0.408230666 +0.677419355 0.407791345 +0.678396872 0.407352419 +0.679374389 0.406913888 +0.680351906 0.406475752 +0.681329423 0.406038009 +0.682306940 0.405600660 +0.683284457 0.405163704 +0.684261975 0.404727140 +0.685239492 0.404292682 +0.686217009 0.403863908 +0.687194526 0.403435540 +0.688172043 0.403007576 +0.689149560 0.402580018 +0.690127077 0.402152863 +0.691104594 0.401726112 +0.692082111 0.401299764 +0.693059629 0.400873818 +0.694037146 0.400448274 +0.695014663 0.400023241 +0.695992180 0.399605824 +0.696969697 0.399188821 +0.697947214 0.398772231 +0.698924731 0.398356053 +0.699902248 0.397940288 +0.700879765 0.397524934 +0.701857283 0.397109991 +0.702834800 0.396695458 +0.703812317 0.396281335 +0.704789834 0.395867620 +0.705767351 0.395460310 +0.706744868 0.395055060 +0.707722385 0.394650230 +0.708699902 0.394245820 +0.709677419 0.393841827 +0.710654936 0.393438252 +0.711632454 0.393035094 +0.712609971 0.392632352 +0.713587488 0.392230026 +0.714565005 0.391828114 +0.715542522 0.391431026 +0.716520039 0.391037894 +0.717497556 0.390645187 +0.718475073 0.390252903 +0.719452590 0.389861041 +0.720430108 0.389469602 +0.721407625 0.389078585 +0.722385142 0.388687988 +0.723362659 0.388297811 +0.724340176 0.387908053 +0.725317693 0.387521392 +0.726295210 0.387140718 +0.727272727 0.386760470 +0.728250244 0.386380649 +0.729227761 0.386001253 +0.730205279 0.385622282 +0.731182796 0.385243736 +0.732160313 0.384865613 +0.733137830 0.384487912 +0.734115347 0.384110634 +0.735092864 0.383734587 +0.736070381 0.383366684 +0.737047898 0.382999209 +0.738025415 0.382632161 +0.739002933 0.382265540 +0.739980450 0.381899345 +0.740957967 0.381533576 +0.741935484 0.381168231 +0.742913001 0.380803309 +0.743890518 0.380438811 +0.744868035 0.380074735 +0.745845552 0.379718703 +0.746823069 0.379364288 +0.747800587 0.379010300 +0.748778104 0.378656739 +0.749755621 0.378303602 +0.750733138 0.377950891 +0.751710655 0.377598603 +0.752688172 0.377246738 +0.753665689 0.376895296 +0.754643206 0.376544275 +0.755620723 0.376199443 +0.756598240 0.375858351 +0.757575758 0.375517684 +0.758553275 0.375177441 +0.759530792 0.374837621 +0.760508309 0.374498223 +0.761485826 0.374159247 +0.762463343 0.373820692 +0.763440860 0.373482557 +0.764418377 0.373144841 +0.765395894 0.372811329 +0.766373412 0.372483798 +0.767350929 0.372156688 +0.768328446 0.371829998 +0.769305963 0.371503728 +0.770283480 0.371177875 +0.771260997 0.370852441 +0.772238514 0.370527424 +0.773216031 0.370202822 +0.774193548 0.369878636 +0.775171065 0.369556545 +0.776148583 0.369242788 +0.777126100 0.368929447 +0.778103617 0.368616521 +0.779081134 0.368304008 +0.780058651 0.367991909 +0.781036168 0.367680221 +0.782013685 0.367368945 +0.782991202 0.367058080 +0.783968719 0.366747624 +0.784946237 0.366437577 +0.785923754 0.366137243 +0.786901271 0.365837858 +0.787878788 0.365538882 +0.788856305 0.365240312 +0.789833822 0.364942147 +0.790811339 0.364644388 +0.791788856 0.364347034 +0.792766373 0.364050082 +0.793743891 0.363753534 +0.794721408 0.363457387 +0.795698925 0.363168850 +0.796676442 0.362883585 +0.797653959 0.362598720 +0.798631476 0.362314253 +0.799608993 0.362030183 +0.800586510 0.361746510 +0.801564027 0.361463233 +0.802541544 0.361180350 +0.803519062 0.360897862 +0.804496579 0.360615767 +0.805474096 0.360339063 +0.806451613 0.360068060 +0.807429130 0.359797445 +0.808406647 0.359527218 +0.809384164 0.359257379 +0.810361681 0.358987926 +0.811339198 0.358718858 +0.812316716 0.358450176 +0.813294233 0.358181877 +0.814271750 0.357913962 +0.815249267 0.357649114 +0.816226784 0.357392487 +0.817204301 0.357136239 +0.818181818 0.356880367 +0.819159335 0.356624870 +0.820136852 0.356369749 +0.821114370 0.356115002 +0.822091887 0.355860628 +0.823069404 0.355606627 +0.824046921 0.355352998 +0.825024438 0.355100007 +0.826001955 0.354857853 +0.826979472 0.354616064 +0.827956989 0.354374639 +0.828934506 0.354133576 +0.829912023 0.353892876 +0.830889541 0.353652537 +0.831867058 0.353412559 +0.832844575 0.353172940 +0.833822092 0.352933680 +0.834799609 0.352694779 +0.835777126 0.352464927 +0.836754643 0.352237669 +0.837732160 0.352010761 +0.838709677 0.351784201 +0.839687195 0.351557989 +0.840664712 0.351332125 +0.841642229 0.351106607 +0.842619746 0.350881434 +0.843597263 0.350656607 +0.844574780 0.350432123 +0.845552297 0.350214269 +0.846529814 0.350001593 +0.847507331 0.349789250 +0.848484848 0.349577241 +0.849462366 0.349365564 +0.850439883 0.349154220 +0.851417400 0.348943206 +0.852394917 0.348732523 +0.853372434 0.348522169 +0.854349951 0.348312145 +0.855327468 0.348106237 +0.856304985 0.347908171 +0.857282502 0.347710423 +0.858260020 0.347512992 +0.859237537 0.347315877 +0.860215054 0.347119078 +0.861192571 0.346922593 +0.862170088 0.346726422 +0.863147605 0.346530564 +0.864125122 0.346335018 +0.865102639 0.346140990 +0.866080156 0.345957546 +0.867057674 0.345774402 +0.868035191 0.345591557 +0.869012708 0.345409010 +0.869990225 0.345226762 +0.870967742 0.345044810 +0.871945259 0.344863155 +0.872922776 0.344681795 +0.873900293 0.344500730 +0.874877810 0.344319959 +0.875855327 0.344149671 +0.876832845 0.343981121 +0.877810362 0.343812851 +0.878787879 0.343644861 +0.879765396 0.343477150 +0.880742913 0.343309718 +0.881720430 0.343142563 +0.882697947 0.342975685 +0.883675464 0.342809084 +0.884652981 0.342642758 +0.885630499 0.342484320 +0.886608016 0.342330335 +0.887585533 0.342176611 +0.888563050 0.342023148 +0.889540567 0.341869943 +0.890518084 0.341716998 +0.891495601 0.341564311 +0.892473118 0.341411881 +0.893450635 0.341259709 +0.894428152 0.341107792 +0.895405670 0.340961091 +0.896383187 0.340821627 +0.897360704 0.340682403 +0.898338221 0.340543418 +0.899315738 0.340404672 +0.900293255 0.340266165 +0.901270772 0.340127896 +0.902248289 0.339989864 +0.903225806 0.339852068 +0.904203324 0.339714508 +0.905180841 0.339579421 +0.906158358 0.339454415 +0.907135875 0.339329627 +0.908113392 0.339205058 +0.909090909 0.339080706 +0.910068426 0.338956572 +0.911045943 0.338832654 +0.912023460 0.338708952 +0.913000978 0.338585466 +0.913978495 0.338462194 +0.914956012 0.338339137 +0.915933529 0.338227961 +0.916911046 0.338117532 +0.917888563 0.338007299 +0.918866080 0.337897261 +0.919843597 0.337787419 +0.920821114 0.337677771 +0.921798631 0.337568317 +0.922776149 0.337459057 +0.923753666 0.337349989 +0.924731183 0.337241115 +0.925708700 0.337141380 +0.926686217 0.337045215 +0.927663734 0.336949224 +0.928641251 0.336853406 +0.929618768 0.336757760 +0.930596285 0.336662286 +0.931573803 0.336566984 +0.932551320 0.336471852 +0.933528837 0.336376891 +0.934506354 0.336282100 +0.935483871 0.336193646 +0.936461388 0.336111639 +0.937438905 0.336029782 +0.938416422 0.335948074 +0.939393939 0.335866515 +0.940371457 0.335785105 +0.941348974 0.335703844 +0.942326491 0.335622730 +0.943304008 0.335541763 +0.944281525 0.335460944 +0.945259042 0.335383602 +0.946236559 0.335315631 +0.947214076 0.335247787 +0.948191593 0.335180068 +0.949169110 0.335112475 +0.950146628 0.335045006 +0.951124145 0.334977661 +0.952101662 0.334910441 +0.953079179 0.334843345 +0.954056696 0.334776372 +0.955034213 0.334709966 +0.956011730 0.334655899 +0.956989247 0.334601934 +0.957966764 0.334548070 +0.958944282 0.334494307 +0.959921799 0.334440645 +0.960899316 0.334387083 +0.961876833 0.334333620 +0.962854350 0.334280258 +0.963831867 0.334226995 +0.964809384 0.334173831 +0.965786901 0.334131034 +0.966764418 0.334090804 +0.967741935 0.334050649 +0.968719453 0.334010571 +0.969696970 0.333970568 +0.970674487 0.333930642 +0.971652004 0.333890791 +0.972629521 0.333851014 +0.973607038 0.333811314 +0.974584555 0.333771687 +0.975562072 0.333739521 +0.976539589 0.333712869 +0.977517107 0.333686268 +0.978494624 0.333659718 +0.979472141 0.333633219 +0.980449658 0.333606771 +0.981427175 0.333580374 +0.982404692 0.333554026 +0.983382209 0.333527729 +0.984359726 0.333501482 +0.985337243 0.333479745 +0.986314761 0.333466506 +0.987292278 0.333453293 +0.988269795 0.333440106 +0.989247312 0.333426944 +0.990224829 0.333413807 +0.991202346 0.333400697 +0.992179863 0.333387611 +0.993157380 0.333374550 +0.994134897 0.333361515 +0.995112414 0.333350000 +0.996089932 0.333350000 +0.997067449 0.333350000 +0.998044966 0.333350000 +0.999022483 0.333350000 +1.000000000 0.333350000 diff --git a/examples/mamdani/ObstacleAvoidance.fll b/examples/mamdani/ObstacleAvoidance.fll new file mode 100644 index 0000000..a47f1b4 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.fll @@ -0,0 +1,25 @@ +Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: mSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 100 + default: nan + lock-previous: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +RuleBlock: mamdani + enabled: true + conjunction: none + disjunction: none + implication: AlgebraicProduct + activation: General + rule: if obstacle is left then mSteer is right + rule: if obstacle is right then mSteer is left
\ No newline at end of file diff --git a/examples/mamdani/ObstacleAvoidance.java b/examples/mamdani/ObstacleAvoidance.java new file mode 100644 index 0000000..8efef3b --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.java @@ -0,0 +1,60 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class ObstacleAvoidance{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("ObstacleAvoidance"); +engine.setDescription(""); + +InputVariable obstacle = new InputVariable(); +obstacle.setName("obstacle"); +obstacle.setDescription(""); +obstacle.setEnabled(true); +obstacle.setRange(0.000, 1.000); +obstacle.setLockValueInRange(false); +obstacle.addTerm(new Ramp("left", 1.000, 0.000)); +obstacle.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addInputVariable(obstacle); + +OutputVariable mSteer = new OutputVariable(); +mSteer.setName("mSteer"); +mSteer.setDescription(""); +mSteer.setEnabled(true); +mSteer.setRange(0.000, 1.000); +mSteer.setLockValueInRange(false); +mSteer.setAggregation(new Maximum()); +mSteer.setDefuzzifier(new Centroid(100)); +mSteer.setDefaultValue(Double.NaN); +mSteer.setLockPreviousValue(false); +mSteer.addTerm(new Ramp("left", 1.000, 0.000)); +mSteer.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addOutputVariable(mSteer); + +RuleBlock mamdani = new RuleBlock(); +mamdani.setName("mamdani"); +mamdani.setDescription(""); +mamdani.setEnabled(true); +mamdani.setConjunction(null); +mamdani.setDisjunction(null); +mamdani.setImplication(new AlgebraicProduct()); +mamdani.setActivation(new General()); +mamdani.addRule(Rule.parse("if obstacle is left then mSteer is right", engine)); +mamdani.addRule(Rule.parse("if obstacle is right then mSteer is left", engine)); +engine.addRuleBlock(mamdani); + + +} +} diff --git a/examples/mamdani/ObstacleAvoidance.pdf b/examples/mamdani/ObstacleAvoidance.pdf Binary files differnew file mode 100644 index 0000000..63e1fe9 --- /dev/null +++ b/examples/mamdani/ObstacleAvoidance.pdf diff --git a/examples/mamdani/SimpleDimmer.R b/examples/mamdani/SimpleDimmer.R new file mode 100644 index 0000000..77a60f3 --- /dev/null +++ b/examples/mamdani/SimpleDimmer.R @@ -0,0 +1,60 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "SimpleDimmer" +engine.fll = "Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW" + +engine.fldFile = "SimpleDimmer.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs Power") + +engine.plot.o1_i1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Power vs Ambient") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/SimpleDimmer.cpp b/examples/mamdani/SimpleDimmer.cpp new file mode 100644 index 0000000..7cd5e73 --- /dev/null +++ b/examples/mamdani/SimpleDimmer.cpp @@ -0,0 +1,52 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("SimpleDimmer"); +engine->setDescription(""); + +InputVariable* Ambient = new InputVariable; +Ambient->setName("Ambient"); +Ambient->setDescription(""); +Ambient->setEnabled(true); +Ambient->setRange(0.000, 1.000); +Ambient->setLockValueInRange(false); +Ambient->addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient->addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine->addInputVariable(Ambient); + +OutputVariable* Power = new OutputVariable; +Power->setName("Power"); +Power->setDescription(""); +Power->setEnabled(true); +Power->setRange(0.000, 1.000); +Power->setLockValueInRange(false); +Power->setAggregation(new Maximum); +Power->setDefuzzifier(new Centroid(200)); +Power->setDefaultValue(fl::nan); +Power->setLockPreviousValue(false); +Power->addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power->addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine->addOutputVariable(Power); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +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); + + +} diff --git a/examples/mamdani/SimpleDimmer.fcl b/examples/mamdani/SimpleDimmer.fcl new file mode 100644 index 0000000..104990a --- /dev/null +++ b/examples/mamdani/SimpleDimmer.fcl @@ -0,0 +1,37 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK SimpleDimmer + +VAR_INPUT + Ambient: REAL; +END_VAR + +VAR_OUTPUT + Power: REAL; +END_VAR + +FUZZIFY Ambient + RANGE := (0.000 .. 1.000); + TERM DARK := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM BRIGHT := Triangle 0.500 0.750 1.000; +END_FUZZIFY + +DEFUZZIFY Power + RANGE := (0.000 .. 1.000); + TERM LOW := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM HIGH := Triangle 0.500 0.750 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + ACT : MIN; + RULE 1 : if Ambient is DARK then Power is HIGH + RULE 2 : if Ambient is MEDIUM then Power is MEDIUM + RULE 3 : if Ambient is BRIGHT then Power is LOW +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/SimpleDimmer.fis b/examples/mamdani/SimpleDimmer.fis new file mode 100644 index 0000000..3435060 --- /dev/null +++ b/examples/mamdani/SimpleDimmer.fis @@ -0,0 +1,35 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='SimpleDimmer' +Type='mamdani' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=3 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + +[Output1] +Name='Power' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='HIGH':'trimf',[0.500 0.750 1.000] + +[Rules] +1.000 , 3.000 (1.000) : 1 +2.000 , 2.000 (1.000) : 1 +3.000 , 1.000 (1.000) : 1 diff --git a/examples/mamdani/SimpleDimmer.fld b/examples/mamdani/SimpleDimmer.fld new file mode 100644 index 0000000..bd4dc51 --- /dev/null +++ b/examples/mamdani/SimpleDimmer.fld @@ -0,0 +1,1025 @@ +Ambient Power +0.000000000 nan +0.000977517 0.750000000 +0.001955034 0.750000000 +0.002932551 0.750000000 +0.003910068 0.750000000 +0.004887586 0.750000000 +0.005865103 0.750000000 +0.006842620 0.750000000 +0.007820137 0.750000000 +0.008797654 0.750000000 +0.009775171 0.750000000 +0.010752688 0.750000000 +0.011730205 0.750000000 +0.012707722 0.750000000 +0.013685239 0.750000000 +0.014662757 0.750000000 +0.015640274 0.750000000 +0.016617791 0.750000000 +0.017595308 0.750000000 +0.018572825 0.750000000 +0.019550342 0.750000000 +0.020527859 0.750000000 +0.021505376 0.750000000 +0.022482893 0.750000000 +0.023460411 0.750000000 +0.024437928 0.750000000 +0.025415445 0.750000000 +0.026392962 0.750000000 +0.027370479 0.750000000 +0.028347996 0.750000000 +0.029325513 0.750000000 +0.030303030 0.750000000 +0.031280547 0.750000000 +0.032258065 0.750000000 +0.033235582 0.750000000 +0.034213099 0.750000000 +0.035190616 0.750000000 +0.036168133 0.750000000 +0.037145650 0.750000000 +0.038123167 0.750000000 +0.039100684 0.750000000 +0.040078201 0.750000000 +0.041055718 0.750000000 +0.042033236 0.750000000 +0.043010753 0.750000000 +0.043988270 0.750000000 +0.044965787 0.750000000 +0.045943304 0.750000000 +0.046920821 0.750000000 +0.047898338 0.750000000 +0.048875855 0.750000000 +0.049853372 0.750000000 +0.050830890 0.750000000 +0.051808407 0.750000000 +0.052785924 0.750000000 +0.053763441 0.750000000 +0.054740958 0.750000000 +0.055718475 0.750000000 +0.056695992 0.750000000 +0.057673509 0.750000000 +0.058651026 0.750000000 +0.059628543 0.750000000 +0.060606061 0.750000000 +0.061583578 0.750000000 +0.062561095 0.750000000 +0.063538612 0.750000000 +0.064516129 0.750000000 +0.065493646 0.750000000 +0.066471163 0.750000000 +0.067448680 0.750000000 +0.068426197 0.750000000 +0.069403715 0.750000000 +0.070381232 0.750000000 +0.071358749 0.750000000 +0.072336266 0.750000000 +0.073313783 0.750000000 +0.074291300 0.750000000 +0.075268817 0.750000000 +0.076246334 0.750000000 +0.077223851 0.750000000 +0.078201369 0.750000000 +0.079178886 0.750000000 +0.080156403 0.750000000 +0.081133920 0.750000000 +0.082111437 0.750000000 +0.083088954 0.750000000 +0.084066471 0.750000000 +0.085043988 0.750000000 +0.086021505 0.750000000 +0.086999022 0.750000000 +0.087976540 0.750000000 +0.088954057 0.750000000 +0.089931574 0.750000000 +0.090909091 0.750000000 +0.091886608 0.750000000 +0.092864125 0.750000000 +0.093841642 0.750000000 +0.094819159 0.750000000 +0.095796676 0.750000000 +0.096774194 0.750000000 +0.097751711 0.750000000 +0.098729228 0.750000000 +0.099706745 0.750000000 +0.100684262 0.750000000 +0.101661779 0.750000000 +0.102639296 0.750000000 +0.103616813 0.750000000 +0.104594330 0.750000000 +0.105571848 0.750000000 +0.106549365 0.750000000 +0.107526882 0.750000000 +0.108504399 0.750000000 +0.109481916 0.750000000 +0.110459433 0.750000000 +0.111436950 0.750000000 +0.112414467 0.750000000 +0.113391984 0.750000000 +0.114369501 0.750000000 +0.115347019 0.750000000 +0.116324536 0.750000000 +0.117302053 0.750000000 +0.118279570 0.750000000 +0.119257087 0.750000000 +0.120234604 0.750000000 +0.121212121 0.750000000 +0.122189638 0.750000000 +0.123167155 0.750000000 +0.124144673 0.750000000 +0.125122190 0.750000000 +0.126099707 0.750000000 +0.127077224 0.750000000 +0.128054741 0.750000000 +0.129032258 0.750000000 +0.130009775 0.750000000 +0.130987292 0.750000000 +0.131964809 0.750000000 +0.132942326 0.750000000 +0.133919844 0.750000000 +0.134897361 0.750000000 +0.135874878 0.750000000 +0.136852395 0.750000000 +0.137829912 0.750000000 +0.138807429 0.750000000 +0.139784946 0.750000000 +0.140762463 0.750000000 +0.141739980 0.750000000 +0.142717498 0.750000000 +0.143695015 0.750000000 +0.144672532 0.750000000 +0.145650049 0.750000000 +0.146627566 0.750000000 +0.147605083 0.750000000 +0.148582600 0.750000000 +0.149560117 0.750000000 +0.150537634 0.750000000 +0.151515152 0.750000000 +0.152492669 0.750000000 +0.153470186 0.750000000 +0.154447703 0.750000000 +0.155425220 0.750000000 +0.156402737 0.750000000 +0.157380254 0.750000000 +0.158357771 0.750000000 +0.159335288 0.750000000 +0.160312805 0.750000000 +0.161290323 0.750000000 +0.162267840 0.750000000 +0.163245357 0.750000000 +0.164222874 0.750000000 +0.165200391 0.750000000 +0.166177908 0.750000000 +0.167155425 0.750000000 +0.168132942 0.750000000 +0.169110459 0.750000000 +0.170087977 0.750000000 +0.171065494 0.750000000 +0.172043011 0.750000000 +0.173020528 0.750000000 +0.173998045 0.750000000 +0.174975562 0.750000000 +0.175953079 0.750000000 +0.176930596 0.750000000 +0.177908113 0.750000000 +0.178885630 0.750000000 +0.179863148 0.750000000 +0.180840665 0.750000000 +0.181818182 0.750000000 +0.182795699 0.750000000 +0.183773216 0.750000000 +0.184750733 0.750000000 +0.185728250 0.750000000 +0.186705767 0.750000000 +0.187683284 0.750000000 +0.188660802 0.750000000 +0.189638319 0.750000000 +0.190615836 0.750000000 +0.191593353 0.750000000 +0.192570870 0.750000000 +0.193548387 0.750000000 +0.194525904 0.750000000 +0.195503421 0.750000000 +0.196480938 0.750000000 +0.197458456 0.750000000 +0.198435973 0.750000000 +0.199413490 0.750000000 +0.200391007 0.750000000 +0.201368524 0.750000000 +0.202346041 0.750000000 +0.203323558 0.750000000 +0.204301075 0.750000000 +0.205278592 0.750000000 +0.206256109 0.750000000 +0.207233627 0.750000000 +0.208211144 0.750000000 +0.209188661 0.750000000 +0.210166178 0.750000000 +0.211143695 0.750000000 +0.212121212 0.750000000 +0.213098729 0.750000000 +0.214076246 0.750000000 +0.215053763 0.750000000 +0.216031281 0.750000000 +0.217008798 0.750000000 +0.217986315 0.750000000 +0.218963832 0.750000000 +0.219941349 0.750000000 +0.220918866 0.750000000 +0.221896383 0.750000000 +0.222873900 0.750000000 +0.223851417 0.750000000 +0.224828935 0.750000000 +0.225806452 0.750000000 +0.226783969 0.750000000 +0.227761486 0.750000000 +0.228739003 0.750000000 +0.229716520 0.750000000 +0.230694037 0.750000000 +0.231671554 0.750000000 +0.232649071 0.750000000 +0.233626588 0.750000000 +0.234604106 0.750000000 +0.235581623 0.750000000 +0.236559140 0.750000000 +0.237536657 0.750000000 +0.238514174 0.750000000 +0.239491691 0.750000000 +0.240469208 0.750000000 +0.241446725 0.750000000 +0.242424242 0.750000000 +0.243401760 0.750000000 +0.244379277 0.750000000 +0.245356794 0.750000000 +0.246334311 0.750000000 +0.247311828 0.750000000 +0.248289345 0.750000000 +0.249266862 0.750000000 +0.250244379 0.749633789 +0.251221896 0.748176070 +0.252199413 0.746729651 +0.253176931 0.745307268 +0.254154448 0.743901152 +0.255131965 0.742505384 +0.256109482 0.741119851 +0.257086999 0.739744439 +0.258064516 0.738388970 +0.259042033 0.737050250 +0.260019550 0.735720805 +0.260997067 0.734400539 +0.261974585 0.733089356 +0.262952102 0.731794526 +0.263929619 0.730516794 +0.264907136 0.729247388 +0.265884653 0.727986227 +0.266862170 0.726733231 +0.267839687 0.725493442 +0.268817204 0.724270974 +0.269794721 0.723055990 +0.270772239 0.721848423 +0.271749756 0.720648204 +0.272727273 0.719458438 +0.273704790 0.718286101 +0.274682307 0.717120499 +0.275659824 0.715961575 +0.276637341 0.714809270 +0.277614858 0.713665012 +0.278592375 0.712538184 +0.279569892 0.711417421 +0.280547410 0.710302674 +0.281524927 0.709193894 +0.282502444 0.708091063 +0.283479961 0.707005566 +0.284457478 0.705925531 +0.285434995 0.704850918 +0.286412512 0.703781686 +0.287390029 0.702717795 +0.288367546 0.701668621 +0.289345064 0.700625580 +0.290322581 0.699587425 +0.291300098 0.698554121 +0.292277615 0.697525635 +0.293255132 0.696509490 +0.294232649 0.695500037 +0.295210166 0.694494984 +0.296187683 0.693494303 +0.297165200 0.692497965 +0.298142717 0.691511860 +0.299120235 0.690532874 +0.300097752 0.689557847 +0.301075269 0.688586755 +0.302052786 0.687619575 +0.303030303 0.686660765 +0.304007820 0.685709376 +0.304985337 0.684761545 +0.305962854 0.683817249 +0.306940371 0.682876470 +0.307917889 0.681942420 +0.308895406 0.681015980 +0.309872923 0.680092726 +0.310850440 0.679172643 +0.311827957 0.678255714 +0.312805474 0.677344077 +0.313782991 0.676440126 +0.314760508 0.675539023 +0.315738025 0.674640752 +0.316715543 0.673745302 +0.317693060 0.672853893 +0.318670577 0.671970143 +0.319648094 0.671088924 +0.320625611 0.670210227 +0.321603128 0.669334041 +0.322580645 0.668460818 +0.323558162 0.667595126 +0.324535679 0.666731672 +0.325513196 0.665870450 +0.326490714 0.665011449 +0.327468231 0.664154662 +0.328445748 0.663304848 +0.329423265 0.662457164 +0.330400782 0.661611439 +0.331378299 0.660767667 +0.332355816 0.659925840 +0.333333333 0.659089669 +0.334310850 0.658255868 +0.335288368 0.657423770 +0.336265885 0.656593371 +0.337243402 0.655764665 +0.338220919 0.654940458 +0.339198436 0.654118746 +0.340175953 0.653298497 +0.341153470 0.652479705 +0.342130987 0.651662368 +0.343108504 0.650848521 +0.344086022 0.650037186 +0.345063539 0.649227083 +0.346041056 0.648418210 +0.347018573 0.647610563 +0.347996090 0.646805538 +0.348973607 0.646002934 +0.349951124 0.645201343 +0.350928641 0.644400763 +0.351906158 0.643601190 +0.352883675 0.642803505 +0.353861193 0.642008044 +0.354838710 0.641213384 +0.355816227 0.640419523 +0.356793744 0.639626459 +0.357771261 0.638834675 +0.358748778 0.638044814 +0.359726295 0.637255548 +0.360703812 0.636466876 +0.361681329 0.635678797 +0.362658847 0.634891512 +0.363636364 0.634105743 +0.364613881 0.633320368 +0.365591398 0.632535386 +0.366568915 0.631750798 +0.367546432 0.630966638 +0.368523949 0.630183479 +0.369501466 0.629400516 +0.370478983 0.628617749 +0.371456500 0.627835178 +0.372434018 0.627052803 +0.373411535 0.626270772 +0.374389052 0.625488759 +0.375366569 0.624706745 +0.376344086 0.623924731 +0.377321603 0.623142717 +0.378299120 0.622360434 +0.379276637 0.621577912 +0.380254154 0.620795194 +0.381231672 0.620012280 +0.382209189 0.619229171 +0.383186706 0.618445288 +0.384164223 0.617660798 +0.385141740 0.616875914 +0.386119257 0.616090638 +0.387096774 0.615304967 +0.388074291 0.614518130 +0.389051808 0.613730200 +0.390029326 0.612941676 +0.391006843 0.612152558 +0.391984360 0.611362846 +0.392961877 0.610571682 +0.393939394 0.609778818 +0.394916911 0.608985156 +0.395894428 0.608190696 +0.396871945 0.607395436 +0.397849462 0.606598545 +0.398826979 0.605799225 +0.399804497 0.604998896 +0.400782014 0.604197558 +0.401759531 0.603395208 +0.402737048 0.602591157 +0.403714565 0.601783817 +0.404692082 0.600975251 +0.405669599 0.600165455 +0.406647116 0.599354429 +0.407624633 0.598541740 +0.408602151 0.597724765 +0.409579668 0.596906338 +0.410557185 0.596086453 +0.411534702 0.595265107 +0.412512219 0.594442248 +0.413489736 0.593613964 +0.414467253 0.592783988 +0.415444770 0.591952316 +0.416422287 0.591118941 +0.417399804 0.590283858 +0.418377322 0.589442972 +0.419354839 0.588599687 +0.420332356 0.587754450 +0.421309873 0.586907257 +0.422287390 0.586058099 +0.423264907 0.585202955 +0.424242424 0.584344508 +0.425219941 0.583483842 +0.426197458 0.582620947 +0.427174976 0.581755815 +0.428152493 0.580884615 +0.429130010 0.580009054 +0.430107527 0.579130986 +0.431085044 0.578250399 +0.432062561 0.577367283 +0.433040078 0.576478121 +0.434017595 0.575583374 +0.434995112 0.574685810 +0.435972630 0.573785416 +0.436950147 0.572882178 +0.437927664 0.571973027 +0.438905181 0.571056884 +0.439882698 0.570137591 +0.440860215 0.569215132 +0.441837732 0.568289490 +0.442815249 0.567358177 +0.443792766 0.566418275 +0.444770283 0.565474860 +0.445747801 0.564527914 +0.446725318 0.563577417 +0.447702835 0.562621612 +0.448680352 0.561655405 +0.449657869 0.560685294 +0.450635386 0.559711253 +0.451612903 0.558733259 +0.452590420 0.557750445 +0.453567937 0.556755188 +0.454545455 0.555755595 +0.455522972 0.554751638 +0.456500489 0.553743287 +0.457478006 0.552730515 +0.458455523 0.551703450 +0.459433040 0.550671354 +0.460410557 0.549634415 +0.461388074 0.548592599 +0.462365591 0.547545872 +0.463343109 0.546484786 +0.464320626 0.545416893 +0.465298143 0.544343629 +0.466275660 0.543264953 +0.467253177 0.542180826 +0.468230694 0.541082374 +0.469208211 0.539975079 +0.470185728 0.538861828 +0.471163245 0.537742573 +0.472140762 0.536617267 +0.473118280 0.535477779 +0.474095797 0.534327120 +0.475073314 0.533169855 +0.476050831 0.532005928 +0.477028348 0.530835281 +0.478005865 0.529650711 +0.478983382 0.528452318 +0.479960899 0.527246594 +0.480938416 0.526033471 +0.481915934 0.524812880 +0.482893451 0.523578752 +0.483870968 0.522327784 +0.484848485 0.521068672 +0.485826002 0.519801335 +0.486803519 0.518525692 +0.487781036 0.517237031 +0.488758553 0.515928105 +0.489736070 0.514610118 +0.490713587 0.513282977 +0.491691105 0.511946585 +0.492668622 0.510597845 +0.493646139 0.509224947 +0.494623656 0.507841954 +0.495601173 0.506448755 +0.496578690 0.505045237 +0.497556207 0.503630203 +0.498533724 0.502186589 +0.499511241 0.500731707 +0.500488759 0.499268293 +0.501466276 0.497813411 +0.502443793 0.496369797 +0.503421310 0.494954763 +0.504398827 0.493551245 +0.505376344 0.492158046 +0.506353861 0.490775053 +0.507331378 0.489402155 +0.508308895 0.488053415 +0.509286413 0.486717023 +0.510263930 0.485389882 +0.511241447 0.484071895 +0.512218964 0.482762969 +0.513196481 0.481474308 +0.514173998 0.480198665 +0.515151515 0.478931328 +0.516129032 0.477672216 +0.517106549 0.476421248 +0.518084066 0.475187120 +0.519061584 0.473966529 +0.520039101 0.472753406 +0.521016618 0.471547682 +0.521994135 0.470349289 +0.522971652 0.469164719 +0.523949169 0.467994072 +0.524926686 0.466830145 +0.525904203 0.465672880 +0.526881720 0.464522221 +0.527859238 0.463382733 +0.528836755 0.462257427 +0.529814272 0.461138172 +0.530791789 0.460024921 +0.531769306 0.458917626 +0.532746823 0.457819174 +0.533724340 0.456735047 +0.534701857 0.455656371 +0.535679374 0.454583107 +0.536656891 0.453515214 +0.537634409 0.452454128 +0.538611926 0.451407401 +0.539589443 0.450365585 +0.540566960 0.449328646 +0.541544477 0.448296550 +0.542521994 0.447269485 +0.543499511 0.446256713 +0.544477028 0.445248362 +0.545454545 0.444244405 +0.546432063 0.443244812 +0.547409580 0.442249555 +0.548387097 0.441266741 +0.549364614 0.440288747 +0.550342131 0.439314706 +0.551319648 0.438344595 +0.552297165 0.437378388 +0.553274682 0.436422583 +0.554252199 0.435472086 +0.555229717 0.434525140 +0.556207234 0.433581725 +0.557184751 0.432641823 +0.558162268 0.431710510 +0.559139785 0.430784868 +0.560117302 0.429862409 +0.561094819 0.428943116 +0.562072336 0.428026973 +0.563049853 0.427117822 +0.564027370 0.426214584 +0.565004888 0.425314190 +0.565982405 0.424416626 +0.566959922 0.423521879 +0.567937439 0.422632717 +0.568914956 0.421749601 +0.569892473 0.420869014 +0.570869990 0.419990946 +0.571847507 0.419115385 +0.572825024 0.418244185 +0.573802542 0.417379053 +0.574780059 0.416516158 +0.575757576 0.415655492 +0.576735093 0.414797045 +0.577712610 0.413941901 +0.578690127 0.413092743 +0.579667644 0.412245550 +0.580645161 0.411400313 +0.581622678 0.410557028 +0.582600196 0.409716142 +0.583577713 0.408881059 +0.584555230 0.408047684 +0.585532747 0.407216012 +0.586510264 0.406386036 +0.587487781 0.405557752 +0.588465298 0.404734893 +0.589442815 0.403913547 +0.590420332 0.403093662 +0.591397849 0.402275235 +0.592375367 0.401458260 +0.593352884 0.400645571 +0.594330401 0.399834545 +0.595307918 0.399024749 +0.596285435 0.398216183 +0.597262952 0.397408843 +0.598240469 0.396604792 +0.599217986 0.395802442 +0.600195503 0.395001104 +0.601173021 0.394200775 +0.602150538 0.393401455 +0.603128055 0.392604564 +0.604105572 0.391809304 +0.605083089 0.391014844 +0.606060606 0.390221182 +0.607038123 0.389428318 +0.608015640 0.388637154 +0.608993157 0.387847442 +0.609970674 0.387058324 +0.610948192 0.386269800 +0.611925709 0.385481870 +0.612903226 0.384695033 +0.613880743 0.383909362 +0.614858260 0.383124086 +0.615835777 0.382339202 +0.616813294 0.381554712 +0.617790811 0.380770829 +0.618768328 0.379987720 +0.619745846 0.379204806 +0.620723363 0.378422088 +0.621700880 0.377639566 +0.622678397 0.376857283 +0.623655914 0.376075269 +0.624633431 0.375293255 +0.625610948 0.374511241 +0.626588465 0.373729228 +0.627565982 0.372947197 +0.628543500 0.372164822 +0.629521017 0.371382251 +0.630498534 0.370599484 +0.631476051 0.369816521 +0.632453568 0.369033362 +0.633431085 0.368249202 +0.634408602 0.367464614 +0.635386119 0.366679632 +0.636363636 0.365894257 +0.637341153 0.365108488 +0.638318671 0.364321203 +0.639296188 0.363533124 +0.640273705 0.362744452 +0.641251222 0.361955186 +0.642228739 0.361165325 +0.643206256 0.360373541 +0.644183773 0.359580477 +0.645161290 0.358786616 +0.646138807 0.357991956 +0.647116325 0.357196495 +0.648093842 0.356398810 +0.649071359 0.355599237 +0.650048876 0.354798657 +0.651026393 0.353997066 +0.652003910 0.353194462 +0.652981427 0.352389437 +0.653958944 0.351581790 +0.654936461 0.350772917 +0.655913978 0.349962814 +0.656891496 0.349151479 +0.657869013 0.348337632 +0.658846530 0.347520295 +0.659824047 0.346701503 +0.660801564 0.345881254 +0.661779081 0.345059542 +0.662756598 0.344235335 +0.663734115 0.343406629 +0.664711632 0.342576230 +0.665689150 0.341744132 +0.666666667 0.340910331 +0.667644184 0.340074160 +0.668621701 0.339232333 +0.669599218 0.338388561 +0.670576735 0.337542836 +0.671554252 0.336695152 +0.672531769 0.335845338 +0.673509286 0.334988551 +0.674486804 0.334129550 +0.675464321 0.333268328 +0.676441838 0.332404874 +0.677419355 0.331539182 +0.678396872 0.330665959 +0.679374389 0.329789773 +0.680351906 0.328911076 +0.681329423 0.328029857 +0.682306940 0.327146107 +0.683284457 0.326254698 +0.684261975 0.325359248 +0.685239492 0.324460977 +0.686217009 0.323559874 +0.687194526 0.322655923 +0.688172043 0.321744286 +0.689149560 0.320827357 +0.690127077 0.319907274 +0.691104594 0.318984020 +0.692082111 0.318057580 +0.693059629 0.317123530 +0.694037146 0.316182751 +0.695014663 0.315238455 +0.695992180 0.314290624 +0.696969697 0.313339235 +0.697947214 0.312380425 +0.698924731 0.311413245 +0.699902248 0.310442153 +0.700879765 0.309467126 +0.701857283 0.308488140 +0.702834800 0.307502035 +0.703812317 0.306505697 +0.704789834 0.305505016 +0.705767351 0.304499963 +0.706744868 0.303490510 +0.707722385 0.302474365 +0.708699902 0.301445879 +0.709677419 0.300412575 +0.710654936 0.299374420 +0.711632454 0.298331379 +0.712609971 0.297282205 +0.713587488 0.296218314 +0.714565005 0.295149082 +0.715542522 0.294074469 +0.716520039 0.292994434 +0.717497556 0.291908937 +0.718475073 0.290806106 +0.719452590 0.289697326 +0.720430108 0.288582579 +0.721407625 0.287461816 +0.722385142 0.286334988 +0.723362659 0.285190730 +0.724340176 0.284038425 +0.725317693 0.282879501 +0.726295210 0.281713899 +0.727272727 0.280541562 +0.728250244 0.279351796 +0.729227761 0.278151577 +0.730205279 0.276944010 +0.731182796 0.275729026 +0.732160313 0.274506558 +0.733137830 0.273266769 +0.734115347 0.272013773 +0.735092864 0.270752612 +0.736070381 0.269483206 +0.737047898 0.268205474 +0.738025415 0.266910644 +0.739002933 0.265599461 +0.739980450 0.264279195 +0.740957967 0.262949750 +0.741935484 0.261611030 +0.742913001 0.260255561 +0.743890518 0.258880149 +0.744868035 0.257494616 +0.745845552 0.256098848 +0.746823069 0.254692732 +0.747800587 0.253270349 +0.748778104 0.251823930 +0.749755621 0.250366211 +0.750733138 0.250000000 +0.751710655 0.250000000 +0.752688172 0.250000000 +0.753665689 0.250000000 +0.754643206 0.250000000 +0.755620723 0.250000000 +0.756598240 0.250000000 +0.757575758 0.250000000 +0.758553275 0.250000000 +0.759530792 0.250000000 +0.760508309 0.250000000 +0.761485826 0.250000000 +0.762463343 0.250000000 +0.763440860 0.250000000 +0.764418377 0.250000000 +0.765395894 0.250000000 +0.766373412 0.250000000 +0.767350929 0.250000000 +0.768328446 0.250000000 +0.769305963 0.250000000 +0.770283480 0.250000000 +0.771260997 0.250000000 +0.772238514 0.250000000 +0.773216031 0.250000000 +0.774193548 0.250000000 +0.775171065 0.250000000 +0.776148583 0.250000000 +0.777126100 0.250000000 +0.778103617 0.250000000 +0.779081134 0.250000000 +0.780058651 0.250000000 +0.781036168 0.250000000 +0.782013685 0.250000000 +0.782991202 0.250000000 +0.783968719 0.250000000 +0.784946237 0.250000000 +0.785923754 0.250000000 +0.786901271 0.250000000 +0.787878788 0.250000000 +0.788856305 0.250000000 +0.789833822 0.250000000 +0.790811339 0.250000000 +0.791788856 0.250000000 +0.792766373 0.250000000 +0.793743891 0.250000000 +0.794721408 0.250000000 +0.795698925 0.250000000 +0.796676442 0.250000000 +0.797653959 0.250000000 +0.798631476 0.250000000 +0.799608993 0.250000000 +0.800586510 0.250000000 +0.801564027 0.250000000 +0.802541544 0.250000000 +0.803519062 0.250000000 +0.804496579 0.250000000 +0.805474096 0.250000000 +0.806451613 0.250000000 +0.807429130 0.250000000 +0.808406647 0.250000000 +0.809384164 0.250000000 +0.810361681 0.250000000 +0.811339198 0.250000000 +0.812316716 0.250000000 +0.813294233 0.250000000 +0.814271750 0.250000000 +0.815249267 0.250000000 +0.816226784 0.250000000 +0.817204301 0.250000000 +0.818181818 0.250000000 +0.819159335 0.250000000 +0.820136852 0.250000000 +0.821114370 0.250000000 +0.822091887 0.250000000 +0.823069404 0.250000000 +0.824046921 0.250000000 +0.825024438 0.250000000 +0.826001955 0.250000000 +0.826979472 0.250000000 +0.827956989 0.250000000 +0.828934506 0.250000000 +0.829912023 0.250000000 +0.830889541 0.250000000 +0.831867058 0.250000000 +0.832844575 0.250000000 +0.833822092 0.250000000 +0.834799609 0.250000000 +0.835777126 0.250000000 +0.836754643 0.250000000 +0.837732160 0.250000000 +0.838709677 0.250000000 +0.839687195 0.250000000 +0.840664712 0.250000000 +0.841642229 0.250000000 +0.842619746 0.250000000 +0.843597263 0.250000000 +0.844574780 0.250000000 +0.845552297 0.250000000 +0.846529814 0.250000000 +0.847507331 0.250000000 +0.848484848 0.250000000 +0.849462366 0.250000000 +0.850439883 0.250000000 +0.851417400 0.250000000 +0.852394917 0.250000000 +0.853372434 0.250000000 +0.854349951 0.250000000 +0.855327468 0.250000000 +0.856304985 0.250000000 +0.857282502 0.250000000 +0.858260020 0.250000000 +0.859237537 0.250000000 +0.860215054 0.250000000 +0.861192571 0.250000000 +0.862170088 0.250000000 +0.863147605 0.250000000 +0.864125122 0.250000000 +0.865102639 0.250000000 +0.866080156 0.250000000 +0.867057674 0.250000000 +0.868035191 0.250000000 +0.869012708 0.250000000 +0.869990225 0.250000000 +0.870967742 0.250000000 +0.871945259 0.250000000 +0.872922776 0.250000000 +0.873900293 0.250000000 +0.874877810 0.250000000 +0.875855327 0.250000000 +0.876832845 0.250000000 +0.877810362 0.250000000 +0.878787879 0.250000000 +0.879765396 0.250000000 +0.880742913 0.250000000 +0.881720430 0.250000000 +0.882697947 0.250000000 +0.883675464 0.250000000 +0.884652981 0.250000000 +0.885630499 0.250000000 +0.886608016 0.250000000 +0.887585533 0.250000000 +0.888563050 0.250000000 +0.889540567 0.250000000 +0.890518084 0.250000000 +0.891495601 0.250000000 +0.892473118 0.250000000 +0.893450635 0.250000000 +0.894428152 0.250000000 +0.895405670 0.250000000 +0.896383187 0.250000000 +0.897360704 0.250000000 +0.898338221 0.250000000 +0.899315738 0.250000000 +0.900293255 0.250000000 +0.901270772 0.250000000 +0.902248289 0.250000000 +0.903225806 0.250000000 +0.904203324 0.250000000 +0.905180841 0.250000000 +0.906158358 0.250000000 +0.907135875 0.250000000 +0.908113392 0.250000000 +0.909090909 0.250000000 +0.910068426 0.250000000 +0.911045943 0.250000000 +0.912023460 0.250000000 +0.913000978 0.250000000 +0.913978495 0.250000000 +0.914956012 0.250000000 +0.915933529 0.250000000 +0.916911046 0.250000000 +0.917888563 0.250000000 +0.918866080 0.250000000 +0.919843597 0.250000000 +0.920821114 0.250000000 +0.921798631 0.250000000 +0.922776149 0.250000000 +0.923753666 0.250000000 +0.924731183 0.250000000 +0.925708700 0.250000000 +0.926686217 0.250000000 +0.927663734 0.250000000 +0.928641251 0.250000000 +0.929618768 0.250000000 +0.930596285 0.250000000 +0.931573803 0.250000000 +0.932551320 0.250000000 +0.933528837 0.250000000 +0.934506354 0.250000000 +0.935483871 0.250000000 +0.936461388 0.250000000 +0.937438905 0.250000000 +0.938416422 0.250000000 +0.939393939 0.250000000 +0.940371457 0.250000000 +0.941348974 0.250000000 +0.942326491 0.250000000 +0.943304008 0.250000000 +0.944281525 0.250000000 +0.945259042 0.250000000 +0.946236559 0.250000000 +0.947214076 0.250000000 +0.948191593 0.250000000 +0.949169110 0.250000000 +0.950146628 0.250000000 +0.951124145 0.250000000 +0.952101662 0.250000000 +0.953079179 0.250000000 +0.954056696 0.250000000 +0.955034213 0.250000000 +0.956011730 0.250000000 +0.956989247 0.250000000 +0.957966764 0.250000000 +0.958944282 0.250000000 +0.959921799 0.250000000 +0.960899316 0.250000000 +0.961876833 0.250000000 +0.962854350 0.250000000 +0.963831867 0.250000000 +0.964809384 0.250000000 +0.965786901 0.250000000 +0.966764418 0.250000000 +0.967741935 0.250000000 +0.968719453 0.250000000 +0.969696970 0.250000000 +0.970674487 0.250000000 +0.971652004 0.250000000 +0.972629521 0.250000000 +0.973607038 0.250000000 +0.974584555 0.250000000 +0.975562072 0.250000000 +0.976539589 0.250000000 +0.977517107 0.250000000 +0.978494624 0.250000000 +0.979472141 0.250000000 +0.980449658 0.250000000 +0.981427175 0.250000000 +0.982404692 0.250000000 +0.983382209 0.250000000 +0.984359726 0.250000000 +0.985337243 0.250000000 +0.986314761 0.250000000 +0.987292278 0.250000000 +0.988269795 0.250000000 +0.989247312 0.250000000 +0.990224829 0.250000000 +0.991202346 0.250000000 +0.992179863 0.250000000 +0.993157380 0.250000000 +0.994134897 0.250000000 +0.995112414 0.250000000 +0.996089932 0.250000000 +0.997067449 0.250000000 +0.998044966 0.250000000 +0.999022483 0.250000000 +1.000000000 nan diff --git a/examples/mamdani/SimpleDimmer.fll b/examples/mamdani/SimpleDimmer.fll new file mode 100644 index 0000000..896bebf --- /dev/null +++ b/examples/mamdani/SimpleDimmer.fll @@ -0,0 +1,28 @@ +Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW
\ No newline at end of file diff --git a/examples/mamdani/SimpleDimmer.java b/examples/mamdani/SimpleDimmer.java new file mode 100644 index 0000000..d7b127d --- /dev/null +++ b/examples/mamdani/SimpleDimmer.java @@ -0,0 +1,63 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class SimpleDimmer{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("SimpleDimmer"); +engine.setDescription(""); + +InputVariable Ambient = new InputVariable(); +Ambient.setName("Ambient"); +Ambient.setDescription(""); +Ambient.setEnabled(true); +Ambient.setRange(0.000, 1.000); +Ambient.setLockValueInRange(false); +Ambient.addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient.addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine.addInputVariable(Ambient); + +OutputVariable Power = new OutputVariable(); +Power.setName("Power"); +Power.setDescription(""); +Power.setEnabled(true); +Power.setRange(0.000, 1.000); +Power.setLockValueInRange(false); +Power.setAggregation(new Maximum()); +Power.setDefuzzifier(new Centroid(200)); +Power.setDefaultValue(Double.NaN); +Power.setLockPreviousValue(false); +Power.addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power.addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine.addOutputVariable(Power); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +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); + + +} +} diff --git a/examples/mamdani/SimpleDimmer.pdf b/examples/mamdani/SimpleDimmer.pdf Binary files differnew file mode 100644 index 0000000..82ef82f --- /dev/null +++ b/examples/mamdani/SimpleDimmer.pdf diff --git a/examples/mamdani/SimpleDimmerChained.R b/examples/mamdani/SimpleDimmerChained.R new file mode 100644 index 0000000..323aa7d --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.R @@ -0,0 +1,85 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "SimpleDimmerChained" +engine.fll = "Engine: SimpleDimmerChained +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +OutputVariable: InversePower + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 500 + default: nan + lock-previous: false + term: LOW Cosine 0.200 0.500 + term: MEDIUM Cosine 0.500 0.500 + term: HIGH Cosine 0.800 0.500 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW + rule: if Power is LOW then InversePower is HIGH + rule: if Power is MEDIUM then InversePower is MEDIUM + rule: if Power is HIGH then InversePower is LOW" + +engine.fldFile = "SimpleDimmerChained.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs Power") + +engine.plot.o1_i1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Power vs Ambient") + +engine.plot.i1_o2 = ggplot(engine.df, aes(Ambient, InversePower)) + + geom_line(aes(color=InversePower), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs InversePower") + +engine.plot.o2_i1 = ggplot(engine.df, aes(Ambient, InversePower)) + + geom_line(aes(color=InversePower), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("InversePower vs Ambient") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/SimpleDimmerChained.cpp b/examples/mamdani/SimpleDimmerChained.cpp new file mode 100644 index 0000000..bc59c8e --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.cpp @@ -0,0 +1,70 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("SimpleDimmerChained"); +engine->setDescription(""); + +InputVariable* Ambient = new InputVariable; +Ambient->setName("Ambient"); +Ambient->setDescription(""); +Ambient->setEnabled(true); +Ambient->setRange(0.000, 1.000); +Ambient->setLockValueInRange(false); +Ambient->addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient->addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine->addInputVariable(Ambient); + +OutputVariable* Power = new OutputVariable; +Power->setName("Power"); +Power->setDescription(""); +Power->setEnabled(true); +Power->setRange(0.000, 1.000); +Power->setLockValueInRange(false); +Power->setAggregation(new Maximum); +Power->setDefuzzifier(new Centroid(200)); +Power->setDefaultValue(fl::nan); +Power->setLockPreviousValue(false); +Power->addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power->addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine->addOutputVariable(Power); + +OutputVariable* InversePower = new OutputVariable; +InversePower->setName("InversePower"); +InversePower->setDescription(""); +InversePower->setEnabled(true); +InversePower->setRange(0.000, 1.000); +InversePower->setLockValueInRange(false); +InversePower->setAggregation(new Maximum); +InversePower->setDefuzzifier(new Centroid(500)); +InversePower->setDefaultValue(fl::nan); +InversePower->setLockPreviousValue(false); +InversePower->addTerm(new Cosine("LOW", 0.200, 0.500)); +InversePower->addTerm(new Cosine("MEDIUM", 0.500, 0.500)); +InversePower->addTerm(new Cosine("HIGH", 0.800, 0.500)); +engine->addOutputVariable(InversePower); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +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)); +ruleBlock->addRule(Rule::parse("if Power is LOW then InversePower is HIGH", engine)); +ruleBlock->addRule(Rule::parse("if Power is MEDIUM then InversePower is MEDIUM", engine)); +ruleBlock->addRule(Rule::parse("if Power is HIGH then InversePower is LOW", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/SimpleDimmerChained.fcl b/examples/mamdani/SimpleDimmerChained.fcl new file mode 100644 index 0000000..29bb4ea --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.fcl @@ -0,0 +1,51 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK SimpleDimmerChained + +VAR_INPUT + Ambient: REAL; +END_VAR + +VAR_OUTPUT + Power: REAL; + InversePower: REAL; +END_VAR + +FUZZIFY Ambient + RANGE := (0.000 .. 1.000); + TERM DARK := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM BRIGHT := Triangle 0.500 0.750 1.000; +END_FUZZIFY + +DEFUZZIFY Power + RANGE := (0.000 .. 1.000); + TERM LOW := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM HIGH := Triangle 0.500 0.750 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY InversePower + RANGE := (0.000 .. 1.000); + TERM LOW := Cosine 0.200 0.500; + TERM MEDIUM := Cosine 0.500 0.500; + TERM HIGH := Cosine 0.800 0.500; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + ACT : MIN; + RULE 1 : if Ambient is DARK then Power is HIGH + RULE 2 : if Ambient is MEDIUM then Power is MEDIUM + RULE 3 : if Ambient is BRIGHT then Power is LOW + RULE 4 : if Power is LOW then InversePower is HIGH + RULE 5 : if Power is MEDIUM then InversePower is MEDIUM + RULE 6 : if Power is HIGH then InversePower is LOW +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/SimpleDimmerChained.fis b/examples/mamdani/SimpleDimmerChained.fis new file mode 100644 index 0000000..c2fc642 --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.fis @@ -0,0 +1,46 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='SimpleDimmerChained' +Type='mamdani' +Version=6.0 +NumInputs=1 +NumOutputs=2 +NumRules=6 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + +[Output1] +Name='Power' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='HIGH':'trimf',[0.500 0.750 1.000] + +[Output2] +Name='InversePower' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'cosinemf',[0.200 0.500] +MF2='MEDIUM':'cosinemf',[0.500 0.500] +MF3='HIGH':'cosinemf',[0.800 0.500] + +[Rules] +1.000 , 3.000 0.000 (1.000) : 1 +2.000 , 2.000 0.000 (1.000) : 1 +3.000 , 1.000 0.000 (1.000) : 1 +0.000 , 0.000 3.000 (1.000) : 1 +0.000 , 0.000 2.000 (1.000) : 1 +0.000 , 0.000 1.000 (1.000) : 1 diff --git a/examples/mamdani/SimpleDimmerChained.fld b/examples/mamdani/SimpleDimmerChained.fld new file mode 100644 index 0000000..843c017 --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.fld @@ -0,0 +1,1025 @@ +Ambient Power InversePower +0.000000000 nan nan +0.000977517 0.750000000 0.221671502 +0.001955034 0.750000000 0.220306607 +0.002932551 0.750000000 0.219272108 +0.003910068 0.750000000 0.218372593 +0.004887586 0.750000000 0.217595038 +0.005865103 0.750000000 0.216891736 +0.006842620 0.750000000 0.216242049 +0.007820137 0.750000000 0.215635499 +0.008797654 0.750000000 0.215066121 +0.009775171 0.750000000 0.214530188 +0.010752688 0.750000000 0.214025192 +0.011730205 0.750000000 0.213535928 +0.012707722 0.750000000 0.213059653 +0.013685239 0.750000000 0.212609497 +0.014662757 0.750000000 0.212181500 +0.015640274 0.750000000 0.211749797 +0.016617791 0.750000000 0.211342499 +0.017595308 0.750000000 0.210947791 +0.018572825 0.750000000 0.210554977 +0.019550342 0.750000000 0.210185583 +0.020527859 0.750000000 0.209810047 +0.021505376 0.750000000 0.209453273 +0.022482893 0.750000000 0.209099710 +0.023460411 0.750000000 0.208754784 +0.024437928 0.750000000 0.208418460 +0.025415445 0.750000000 0.208108896 +0.026392962 0.750000000 0.207822337 +0.027370479 0.750000000 0.207557090 +0.028347996 0.750000000 0.207310043 +0.029325513 0.750000000 0.207080132 +0.030303030 0.750000000 0.206864987 +0.031280547 0.750000000 0.206663695 +0.032258065 0.750000000 0.206474685 +0.033235582 0.750000000 0.206296887 +0.034213099 0.750000000 0.206129563 +0.035190616 0.750000000 0.205971282 +0.036168133 0.750000000 0.205822154 +0.037145650 0.750000000 0.205680293 +0.038123167 0.750000000 0.205546551 +0.039100684 0.750000000 0.205418994 +0.040078201 0.750000000 0.205298019 +0.041055718 0.750000000 0.205182743 +0.042033236 0.750000000 0.205072718 +0.043010753 0.750000000 0.204968065 +0.043988270 0.750000000 0.204867643 +0.044965787 0.750000000 0.204772102 +0.045943304 0.750000000 0.204680372 +0.046920821 0.750000000 0.204592478 +0.047898338 0.750000000 0.204508389 +0.048875855 0.750000000 0.204427324 +0.049853372 0.750000000 0.204349869 +0.050830890 0.750000000 0.204275190 +0.051808407 0.750000000 0.204203265 +0.052785924 0.750000000 0.204134275 +0.053763441 0.750000000 0.204067513 +0.054740958 0.750000000 0.204003359 +0.055718475 0.750000000 0.203941436 +0.056695992 0.750000000 0.203881398 +0.057673509 0.750000000 0.203823826 +0.058651026 0.750000000 0.203767941 +0.059628543 0.750000000 0.203713842 +0.060606061 0.750000000 0.203661714 +0.061583578 0.750000000 0.203611030 +0.062561095 0.750000000 0.203562034 +0.063538612 0.750000000 0.203514617 +0.064516129 0.750000000 0.203468446 +0.065493646 0.750000000 0.203423862 +0.066471163 0.750000000 0.203380551 +0.067448680 0.750000000 0.203338322 +0.068426197 0.750000000 0.203297578 +0.069403715 0.750000000 0.203257869 +0.070381232 0.750000000 0.203219115 +0.071358749 0.750000000 0.203181723 +0.072336266 0.750000000 0.203145191 +0.073313783 0.750000000 0.203109538 +0.074291300 0.750000000 0.203075066 +0.075268817 0.750000000 0.203041351 +0.076246334 0.750000000 0.203008438 +0.077223851 0.750000000 0.202976564 +0.078201369 0.750000000 0.202945359 +0.079178886 0.750000000 0.202914878 +0.080156403 0.750000000 0.202885326 +0.081133920 0.750000000 0.202856368 +0.082111437 0.750000000 0.202828056 +0.083088954 0.750000000 0.202800588 +0.084066471 0.750000000 0.202773648 +0.085043988 0.750000000 0.202747278 +0.086021505 0.750000000 0.202721688 +0.086999022 0.750000000 0.202696569 +0.087976540 0.750000000 0.202671946 +0.088954057 0.750000000 0.202648053 +0.089931574 0.750000000 0.202624584 +0.090909091 0.750000000 0.202601536 +0.091886608 0.750000000 0.202579184 +0.092864125 0.750000000 0.202557213 +0.093841642 0.750000000 0.202535613 +0.094819159 0.750000000 0.202514642 +0.095796676 0.750000000 0.202494036 +0.096774194 0.750000000 0.202473765 +0.097751711 0.750000000 0.202454042 +0.098729228 0.750000000 0.202434684 +0.099706745 0.750000000 0.202415629 +0.100684262 0.750000000 0.202397043 +0.101661779 0.750000000 0.202378829 +0.102639296 0.750000000 0.202360889 +0.103616813 0.750000000 0.202343345 +0.104594330 0.750000000 0.202326181 +0.105571848 0.750000000 0.202309267 +0.106549365 0.750000000 0.202292677 +0.107526882 0.750000000 0.202276482 +0.108504399 0.750000000 0.202260514 +0.109481916 0.750000000 0.202244803 +0.110459433 0.750000000 0.202229501 +0.111436950 0.750000000 0.202214406 +0.112414467 0.750000000 0.202199515 +0.113391984 0.750000000 0.202185031 +0.114369501 0.750000000 0.202170746 +0.115347019 0.750000000 0.202156646 +0.116324536 0.750000000 0.202142887 +0.117302053 0.750000000 0.202129352 +0.118279570 0.750000000 0.202115988 +0.119257087 0.750000000 0.202102901 +0.120234604 0.750000000 0.202090065 +0.121212121 0.750000000 0.202077384 +0.122189638 0.750000000 0.202064922 +0.123167155 0.750000000 0.202052737 +0.124144673 0.750000000 0.202040694 +0.125122190 0.750000000 0.202028815 +0.126099707 0.750000000 0.202017236 +0.127077224 0.750000000 0.202005788 +0.128054741 0.750000000 0.201994470 +0.129032258 0.750000000 0.201983442 +0.130009775 0.750000000 0.201972551 +0.130987292 0.750000000 0.201961779 +0.131964809 0.750000000 0.201951246 +0.132942326 0.750000000 0.201940877 +0.133919844 0.750000000 0.201930618 +0.134897361 0.750000000 0.201920549 +0.135874878 0.750000000 0.201910669 +0.136852395 0.750000000 0.201900891 +0.137829912 0.750000000 0.201891259 +0.138807429 0.750000000 0.201881839 +0.139784946 0.750000000 0.201872513 +0.140762463 0.750000000 0.201863294 +0.141739980 0.750000000 0.201854307 +0.142717498 0.750000000 0.201845406 +0.143695015 0.750000000 0.201836590 +0.144672532 0.750000000 0.201827998 +0.145650049 0.750000000 0.201819498 +0.146627566 0.750000000 0.201811078 +0.147605083 0.750000000 0.201802845 +0.148582600 0.750000000 0.201794724 +0.149560117 0.750000000 0.201786676 +0.150537634 0.750000000 0.201778785 +0.151515152 0.750000000 0.201771022 +0.152492669 0.750000000 0.201763326 +0.153470186 0.750000000 0.201755760 +0.154447703 0.750000000 0.201748336 +0.155425220 0.750000000 0.201740974 +0.156402737 0.750000000 0.201733719 +0.157380254 0.750000000 0.201726616 +0.158357771 0.750000000 0.201719570 +0.159335288 0.750000000 0.201712612 +0.160312805 0.750000000 0.201705813 +0.161290323 0.750000000 0.201699068 +0.162267840 0.750000000 0.201692394 +0.163245357 0.750000000 0.201685884 +0.164222874 0.750000000 0.201679424 +0.165200391 0.750000000 0.201673024 +0.166177908 0.750000000 0.201666789 +0.167155425 0.750000000 0.201660600 +0.168132942 0.750000000 0.201654463 +0.169110459 0.750000000 0.201648489 +0.170087977 0.750000000 0.201642558 +0.171065494 0.750000000 0.201636676 +0.172043011 0.750000000 0.201630951 +0.173020528 0.750000000 0.201625266 +0.173998045 0.750000000 0.201619630 +0.174975562 0.750000000 0.201614142 +0.175953079 0.750000000 0.201608691 +0.176930596 0.750000000 0.201603293 +0.177908113 0.750000000 0.201598032 +0.178885630 0.750000000 0.201592805 +0.179863148 0.750000000 0.201587638 +0.180840665 0.750000000 0.201582594 +0.181818182 0.750000000 0.201577581 +0.182795699 0.750000000 0.201572640 +0.183773216 0.750000000 0.201567801 +0.184750733 0.750000000 0.201562993 +0.185728250 0.750000000 0.201558272 +0.186705767 0.750000000 0.201553632 +0.187683284 0.750000000 0.201549019 +0.188660802 0.750000000 0.201544513 +0.189638319 0.750000000 0.201540063 +0.190615836 0.750000000 0.201535638 +0.191593353 0.750000000 0.201531342 +0.192570870 0.750000000 0.201527074 +0.193548387 0.750000000 0.201522856 +0.194525904 0.750000000 0.201518740 +0.195503421 0.750000000 0.201514646 +0.196480938 0.750000000 0.201510635 +0.197458456 0.750000000 0.201506688 +0.198435973 0.750000000 0.201502762 +0.199413490 0.750000000 0.201498955 +0.200391007 0.750000000 0.201495170 +0.201368524 0.750000000 0.201491445 +0.202346041 0.750000000 0.201487799 +0.203323558 0.750000000 0.201484172 +0.204301075 0.750000000 0.201480648 +0.205278592 0.750000000 0.201477155 +0.206256109 0.750000000 0.201473716 +0.207233627 0.750000000 0.201470354 +0.208211144 0.750000000 0.201467007 +0.209188661 0.750000000 0.201463769 +0.210166178 0.750000000 0.201460550 +0.211143695 0.750000000 0.201457402 +0.212121212 0.750000000 0.201454307 +0.213098729 0.750000000 0.201451251 +0.214076246 0.750000000 0.201448278 +0.215053763 0.750000000 0.201445318 +0.216031281 0.750000000 0.201442464 +0.217008798 0.750000000 0.201439621 +0.217986315 0.750000000 0.201436866 +0.218963832 0.750000000 0.201434139 +0.219941349 0.750000000 0.201431486 +0.220918866 0.750000000 0.201428872 +0.221896383 0.750000000 0.201426324 +0.222873900 0.750000000 0.201423821 +0.223851417 0.750000000 0.201421381 +0.224828935 0.750000000 0.201418988 +0.225806452 0.750000000 0.201416661 +0.226783969 0.750000000 0.201414375 +0.227761486 0.750000000 0.201412163 +0.228739003 0.750000000 0.201409982 +0.229716520 0.750000000 0.201407891 +0.230694037 0.750000000 0.201405828 +0.231671554 0.750000000 0.201403846 +0.232649071 0.750000000 0.201401913 +0.233626588 0.750000000 0.201400032 +0.234604106 0.750000000 0.201398232 +0.235581623 0.750000000 0.201396477 +0.236559140 0.750000000 0.201394788 +0.237536657 0.750000000 0.201393176 +0.238514174 0.750000000 0.201391621 +0.239491691 0.750000000 0.201390128 +0.240469208 0.750000000 0.201388719 +0.241446725 0.750000000 0.201387385 +0.242424242 0.750000000 0.201386125 +0.243401760 0.750000000 0.201384946 +0.244379277 0.750000000 0.201383854 +0.245356794 0.750000000 0.201382854 +0.246334311 0.750000000 0.201381954 +0.247311828 0.750000000 0.201381173 +0.248289345 0.750000000 0.201380522 +0.249266862 0.750000000 0.201380043 +0.250244379 0.749633789 0.201846207 +0.251221896 0.748176070 0.203676892 +0.252199413 0.746729651 0.205470420 +0.253176931 0.745307268 0.207232921 +0.254154448 0.743901152 0.208969603 +0.255131965 0.742505384 0.210681995 +0.256109482 0.741119851 0.212371422 +0.257086999 0.739744439 0.214039141 +0.258064516 0.738388970 0.215686343 +0.259042033 0.737050250 0.217314161 +0.260019550 0.735720805 0.218923667 +0.260997067 0.734400539 0.220515879 +0.261974585 0.733089356 0.222091759 +0.262952102 0.731794526 0.223649762 +0.263929619 0.730516794 0.225192151 +0.264907136 0.729247388 0.226720383 +0.265884653 0.727986227 0.228232727 +0.266862170 0.726733231 0.229730635 +0.267839687 0.725493442 0.231216292 +0.268817204 0.724270974 0.232685872 +0.269794721 0.723055990 0.234144013 +0.270772239 0.721848423 0.235588818 +0.271749756 0.720648204 0.237021028 +0.272727273 0.719458438 0.238442032 +0.273704790 0.718286101 0.239849792 +0.274682307 0.717120499 0.241247924 +0.275659824 0.715961575 0.242632618 +0.276637341 0.714809270 0.244008759 +0.277614858 0.713665012 0.245371680 +0.278592375 0.712538184 0.246726670 +0.279569892 0.711417421 0.248069026 +0.280547410 0.710302674 0.249403669 +0.281524927 0.709193894 0.250726587 +0.282502444 0.708091063 0.252041647 +0.283479961 0.707005566 0.253346179 +0.284457478 0.705925531 0.254642389 +0.285434995 0.704850918 0.255929518 +0.286412512 0.703781686 0.257207578 +0.287390029 0.702717795 0.258478219 +0.288367546 0.701668621 0.259738800 +0.289345064 0.700625580 0.260993370 +0.290322581 0.699587425 0.262237549 +0.291300098 0.698554121 0.263475527 +0.292277615 0.697525635 0.264705239 +0.293255132 0.696509490 0.265927232 +0.294232649 0.695500037 0.267143201 +0.295210166 0.694494984 0.268349791 +0.296187683 0.693494303 0.269551115 +0.297165200 0.692497965 0.270744440 +0.298142717 0.691511860 0.271931138 +0.299120235 0.690532874 0.273112342 +0.300097752 0.689557847 0.274284946 +0.301075269 0.688586755 0.275452739 +0.302052786 0.687619575 0.276613621 +0.303030303 0.686660765 0.277768031 +0.304007820 0.685709376 0.278917856 +0.304985337 0.684761545 0.280059697 +0.305962854 0.683817249 0.281196818 +0.306940371 0.682876470 0.282328684 +0.307917889 0.681942420 0.283453563 +0.308895406 0.681015980 0.284574256 +0.309872923 0.680092726 0.285688972 +0.310850440 0.679172643 0.286798049 +0.311827957 0.678255714 0.287903138 +0.312805474 0.677344077 0.289001763 +0.313782991 0.676440126 0.290095833 +0.314760508 0.675539023 0.291186105 +0.315738025 0.674640752 0.292269631 +0.316715543 0.673745302 0.293349456 +0.317693060 0.672853893 0.294425247 +0.318670577 0.671970143 0.295495017 +0.319648094 0.671088924 0.296561328 +0.320625611 0.670210227 0.297623455 +0.321603128 0.669334041 0.298680243 +0.322580645 0.668460818 0.299733738 +0.323558162 0.667595126 0.300783030 +0.324535679 0.666731672 0.301827515 +0.325513196 0.665870450 0.302868868 +0.326490714 0.665011449 0.303906100 +0.327468231 0.664154662 0.304938935 +0.328445748 0.663304848 0.305968793 +0.329423265 0.662457164 0.306994695 +0.330400782 0.661611439 0.308016510 +0.331378299 0.660767667 0.309035496 +0.332355816 0.659925840 0.310050754 +0.333333333 0.659089669 0.311062154 +0.334310850 0.658255868 0.312070870 +0.335288368 0.657423770 0.313076130 +0.336265885 0.656593371 0.314077703 +0.337243402 0.655764665 0.315076729 +0.338220919 0.654940458 0.316071981 +0.339198436 0.654118746 0.317062640 +0.340175953 0.653298497 0.318050990 +0.341153470 0.652479705 0.319036167 +0.342130987 0.651662368 0.320016921 +0.343108504 0.650848521 0.320995595 +0.344086022 0.650037186 0.321971698 +0.345063539 0.649227083 0.322943523 +0.346041056 0.648418210 0.323913488 +0.347018573 0.647610563 0.324881463 +0.347996090 0.646805538 0.325845303 +0.348973607 0.646002934 0.326807497 +0.349951124 0.645201343 0.327768050 +0.350928641 0.644400763 0.328725018 +0.351906158 0.643601190 0.329680354 +0.352883675 0.642803505 0.330634256 +0.353861193 0.642008044 0.331585332 +0.354838710 0.641213384 0.332534700 +0.355816227 0.640419523 0.333482835 +0.356793744 0.639626459 0.334428830 +0.357771261 0.638834675 0.335373101 +0.358748778 0.638044814 0.336316337 +0.359726295 0.637255548 0.337258027 +0.360703812 0.636466876 0.338198057 +0.361681329 0.635678797 0.339137245 +0.362658847 0.634891512 0.340075384 +0.363636364 0.634105743 0.341012014 +0.364613881 0.633320368 0.341947992 +0.365591398 0.632535386 0.342883313 +0.366568915 0.631750798 0.343817374 +0.367546432 0.630966638 0.344750971 +0.368523949 0.630183479 0.345684104 +0.369501466 0.629400516 0.346616504 +0.370478983 0.628617749 0.347548540 +0.371456500 0.627835178 0.348480299 +0.372434018 0.627052803 0.349411745 +0.373411535 0.626270772 0.350343037 +0.374389052 0.625488759 0.351274237 +0.375366569 0.624706745 0.352205426 +0.376344086 0.623924731 0.353136787 +0.377321603 0.623142717 0.354068240 +0.378299120 0.622360434 0.354999866 +0.379276637 0.621577912 0.355932108 +0.380254154 0.620795194 0.356864629 +0.381231672 0.620012280 0.357797428 +0.382209189 0.619229171 0.358731329 +0.383186706 0.618445288 0.359665733 +0.384164223 0.617660798 0.360600602 +0.385141740 0.616875914 0.361536789 +0.386119257 0.616090638 0.362473899 +0.387096774 0.615304967 0.363411663 +0.388074291 0.614518130 0.364350853 +0.389051808 0.613730200 0.365291500 +0.390029326 0.612941676 0.366232990 +0.391006843 0.612152558 0.367175921 +0.391984360 0.611362846 0.368120944 +0.392961877 0.610571682 0.369067005 +0.393939394 0.609778818 0.370014435 +0.394916911 0.608985156 0.370964689 +0.395894428 0.608190696 0.371916178 +0.396871945 0.607395436 0.372868906 +0.397849462 0.606598545 0.373825246 +0.398826979 0.605799225 0.374783038 +0.399804497 0.604998896 0.375742272 +0.400782014 0.604197558 0.376705194 +0.401759531 0.603395208 0.377670184 +0.402737048 0.602591157 0.378636823 +0.403714565 0.601783817 0.379607193 +0.404692082 0.600975251 0.380580296 +0.405669599 0.600165455 0.381555265 +0.406647116 0.599354429 0.382533989 +0.407624633 0.598541740 0.383516150 +0.408602151 0.597724765 0.384500397 +0.409579668 0.596906338 0.385488433 +0.410557185 0.596086453 0.386480623 +0.411534702 0.595265107 0.387475131 +0.412512219 0.594442248 0.388473492 +0.413489736 0.593613964 0.389476718 +0.414467253 0.592783988 0.390482499 +0.415444770 0.591952316 0.391491555 +0.416422287 0.591118941 0.392504668 +0.417399804 0.590283858 0.393520477 +0.418377322 0.589442972 0.394539685 +0.419354839 0.588599687 0.395563270 +0.420332356 0.587754450 0.396589695 +0.421309873 0.586907257 0.397619709 +0.422287390 0.586058099 0.398654373 +0.423264907 0.585202955 0.399692025 +0.424242424 0.584344508 0.400733540 +0.425219941 0.583483842 0.401779909 +0.426197458 0.582620947 0.402829422 +0.427174976 0.581755815 0.403883177 +0.428152493 0.580884615 0.404941902 +0.429130010 0.580009054 0.406003935 +0.430107527 0.579130986 0.407070716 +0.431085044 0.578250399 0.408142475 +0.432062561 0.577367283 0.409217712 +0.433040078 0.576478121 0.410298357 +0.434017595 0.575583374 0.411383856 +0.434995112 0.574685810 0.412473008 +0.435972630 0.573785416 0.413568413 +0.436950147 0.572882178 0.414668387 +0.437927664 0.571973027 0.415772198 +0.438905181 0.571056884 0.416883317 +0.439882698 0.570137591 0.417998533 +0.440860215 0.569215132 0.419118581 +0.441837732 0.568289490 0.420245634 +0.442815249 0.567358177 0.421376894 +0.443792766 0.566418275 0.422514343 +0.444770283 0.565474860 0.423658069 +0.445747801 0.564527914 0.424806212 +0.446725318 0.563577417 0.425962211 +0.447702835 0.562621612 0.427123480 +0.448680352 0.561655405 0.428290282 +0.449657869 0.560685294 0.429465166 +0.450635386 0.559711253 0.430644890 +0.451612903 0.558733259 0.431832308 +0.452590420 0.557750445 0.433026364 +0.453567937 0.556755188 0.434226000 +0.454545455 0.555755595 0.435434924 +0.455522972 0.554751638 0.436649146 +0.456500489 0.553743287 0.437871753 +0.457478006 0.552730515 0.439101626 +0.458455523 0.551703450 0.440338101 +0.459433040 0.550671354 0.441584214 +0.460410557 0.549634415 0.442836126 +0.461388074 0.548592599 0.444098260 +0.462365591 0.547545872 0.445367270 +0.463343109 0.546484786 0.446645195 +0.464320626 0.545416893 0.447931951 +0.465298143 0.544343629 0.449226535 +0.466275660 0.543264953 0.450531713 +0.467253177 0.542180826 0.451843888 +0.468230694 0.541082374 0.453168194 +0.469208211 0.539975079 0.454499403 +0.470185728 0.538861828 0.455843131 +0.471163245 0.537742573 0.457194500 +0.472140762 0.536617267 0.458558366 +0.473118280 0.535477779 0.459930679 +0.474095797 0.534327120 0.461315854 +0.475073314 0.533169855 0.462709935 +0.476050831 0.532005928 0.464117671 +0.477028348 0.530835281 0.465534381 +0.478005865 0.529650711 0.466952620 +0.478983382 0.528452318 0.468377996 +0.479960899 0.527246594 0.469806093 +0.480938416 0.526033471 0.471239943 +0.481915934 0.524812880 0.472678374 +0.482893451 0.523578752 0.474120606 +0.483870968 0.522327784 0.475569070 +0.484848485 0.521068672 0.477020289 +0.485826002 0.519801335 0.478476759 +0.486803519 0.518525692 0.479938796 +0.487781036 0.517237031 0.481403707 +0.488758553 0.515928105 0.482873363 +0.489736070 0.514610118 0.484347894 +0.490713587 0.513282977 0.485826893 +0.491691105 0.511946585 0.487309221 +0.492668622 0.510597845 0.488795133 +0.493646139 0.509224947 0.490284775 +0.494623656 0.507841954 0.491777716 +0.495601173 0.506448755 0.493273513 +0.496578690 0.505045237 0.494770784 +0.497556207 0.503630203 0.496268873 +0.498533724 0.502186589 0.497766318 +0.499511241 0.500731707 0.499259366 +0.500488759 0.499268293 0.500740634 +0.501466276 0.497813411 0.502233682 +0.502443793 0.496369797 0.503731127 +0.503421310 0.494954763 0.505229216 +0.504398827 0.493551245 0.506726487 +0.505376344 0.492158046 0.508222284 +0.506353861 0.490775053 0.509715225 +0.507331378 0.489402155 0.511204867 +0.508308895 0.488053415 0.512690779 +0.509286413 0.486717023 0.514173107 +0.510263930 0.485389882 0.515652106 +0.511241447 0.484071895 0.517126637 +0.512218964 0.482762969 0.518596293 +0.513196481 0.481474308 0.520061204 +0.514173998 0.480198665 0.521523241 +0.515151515 0.478931328 0.522979711 +0.516129032 0.477672216 0.524430930 +0.517106549 0.476421248 0.525879394 +0.518084066 0.475187120 0.527321626 +0.519061584 0.473966529 0.528760057 +0.520039101 0.472753406 0.530193907 +0.521016618 0.471547682 0.531622004 +0.521994135 0.470349289 0.533047380 +0.522971652 0.469164719 0.534465619 +0.523949169 0.467994072 0.535882329 +0.524926686 0.466830145 0.537290065 +0.525904203 0.465672880 0.538684146 +0.526881720 0.464522221 0.540069321 +0.527859238 0.463382733 0.541441634 +0.528836755 0.462257427 0.542805500 +0.529814272 0.461138172 0.544156869 +0.530791789 0.460024921 0.545500597 +0.531769306 0.458917626 0.546831806 +0.532746823 0.457819174 0.548156112 +0.533724340 0.456735047 0.549468287 +0.534701857 0.455656371 0.550773465 +0.535679374 0.454583107 0.552068049 +0.536656891 0.453515214 0.553354805 +0.537634409 0.452454128 0.554632730 +0.538611926 0.451407401 0.555901740 +0.539589443 0.450365585 0.557163874 +0.540566960 0.449328646 0.558415786 +0.541544477 0.448296550 0.559661899 +0.542521994 0.447269485 0.560898374 +0.543499511 0.446256713 0.562128247 +0.544477028 0.445248362 0.563350854 +0.545454545 0.444244405 0.564565076 +0.546432063 0.443244812 0.565774000 +0.547409580 0.442249555 0.566973636 +0.548387097 0.441266741 0.568167692 +0.549364614 0.440288747 0.569355110 +0.550342131 0.439314706 0.570534834 +0.551319648 0.438344595 0.571709718 +0.552297165 0.437378388 0.572876520 +0.553274682 0.436422583 0.574037789 +0.554252199 0.435472086 0.575193788 +0.555229717 0.434525140 0.576341931 +0.556207234 0.433581725 0.577485657 +0.557184751 0.432641823 0.578623106 +0.558162268 0.431710510 0.579754366 +0.559139785 0.430784868 0.580881419 +0.560117302 0.429862409 0.582001467 +0.561094819 0.428943116 0.583116683 +0.562072336 0.428026973 0.584227802 +0.563049853 0.427117822 0.585331613 +0.564027370 0.426214584 0.586431587 +0.565004888 0.425314190 0.587526992 +0.565982405 0.424416626 0.588616144 +0.566959922 0.423521879 0.589701643 +0.567937439 0.422632717 0.590782288 +0.568914956 0.421749601 0.591857525 +0.569892473 0.420869014 0.592929284 +0.570869990 0.419990946 0.593996065 +0.571847507 0.419115385 0.595058098 +0.572825024 0.418244185 0.596116823 +0.573802542 0.417379053 0.597170578 +0.574780059 0.416516158 0.598220091 +0.575757576 0.415655492 0.599266460 +0.576735093 0.414797045 0.600307975 +0.577712610 0.413941901 0.601345627 +0.578690127 0.413092743 0.602380291 +0.579667644 0.412245550 0.603410305 +0.580645161 0.411400313 0.604436730 +0.581622678 0.410557028 0.605460315 +0.582600196 0.409716142 0.606479523 +0.583577713 0.408881059 0.607495332 +0.584555230 0.408047684 0.608508445 +0.585532747 0.407216012 0.609517501 +0.586510264 0.406386036 0.610523282 +0.587487781 0.405557752 0.611526508 +0.588465298 0.404734893 0.612524869 +0.589442815 0.403913547 0.613519377 +0.590420332 0.403093662 0.614511567 +0.591397849 0.402275235 0.615499603 +0.592375367 0.401458260 0.616483850 +0.593352884 0.400645571 0.617466011 +0.594330401 0.399834545 0.618444735 +0.595307918 0.399024749 0.619419704 +0.596285435 0.398216183 0.620392807 +0.597262952 0.397408843 0.621363177 +0.598240469 0.396604792 0.622329816 +0.599217986 0.395802442 0.623294806 +0.600195503 0.395001104 0.624257728 +0.601173021 0.394200775 0.625216962 +0.602150538 0.393401455 0.626174754 +0.603128055 0.392604564 0.627131094 +0.604105572 0.391809304 0.628083822 +0.605083089 0.391014844 0.629035311 +0.606060606 0.390221182 0.629985565 +0.607038123 0.389428318 0.630932995 +0.608015640 0.388637154 0.631879056 +0.608993157 0.387847442 0.632824079 +0.609970674 0.387058324 0.633767010 +0.610948192 0.386269800 0.634708500 +0.611925709 0.385481870 0.635649147 +0.612903226 0.384695033 0.636588337 +0.613880743 0.383909362 0.637526101 +0.614858260 0.383124086 0.638463211 +0.615835777 0.382339202 0.639399398 +0.616813294 0.381554712 0.640334267 +0.617790811 0.380770829 0.641268671 +0.618768328 0.379987720 0.642202572 +0.619745846 0.379204806 0.643135371 +0.620723363 0.378422088 0.644067892 +0.621700880 0.377639566 0.645000134 +0.622678397 0.376857283 0.645931760 +0.623655914 0.376075269 0.646863213 +0.624633431 0.375293255 0.647794574 +0.625610948 0.374511241 0.648725763 +0.626588465 0.373729228 0.649656963 +0.627565982 0.372947197 0.650588255 +0.628543500 0.372164822 0.651519701 +0.629521017 0.371382251 0.652451460 +0.630498534 0.370599484 0.653383496 +0.631476051 0.369816521 0.654315896 +0.632453568 0.369033362 0.655249029 +0.633431085 0.368249202 0.656182626 +0.634408602 0.367464614 0.657116687 +0.635386119 0.366679632 0.658052008 +0.636363636 0.365894257 0.658987986 +0.637341153 0.365108488 0.659924616 +0.638318671 0.364321203 0.660862755 +0.639296188 0.363533124 0.661801943 +0.640273705 0.362744452 0.662741973 +0.641251222 0.361955186 0.663683663 +0.642228739 0.361165325 0.664626899 +0.643206256 0.360373541 0.665571170 +0.644183773 0.359580477 0.666517165 +0.645161290 0.358786616 0.667465300 +0.646138807 0.357991956 0.668414668 +0.647116325 0.357196495 0.669365744 +0.648093842 0.356398810 0.670319646 +0.649071359 0.355599237 0.671274982 +0.650048876 0.354798657 0.672231950 +0.651026393 0.353997066 0.673192503 +0.652003910 0.353194462 0.674154697 +0.652981427 0.352389437 0.675118537 +0.653958944 0.351581790 0.676086512 +0.654936461 0.350772917 0.677056477 +0.655913978 0.349962814 0.678028302 +0.656891496 0.349151479 0.679004405 +0.657869013 0.348337632 0.679983079 +0.658846530 0.347520295 0.680963833 +0.659824047 0.346701503 0.681949010 +0.660801564 0.345881254 0.682937360 +0.661779081 0.345059542 0.683928019 +0.662756598 0.344235335 0.684923271 +0.663734115 0.343406629 0.685922297 +0.664711632 0.342576230 0.686923870 +0.665689150 0.341744132 0.687929130 +0.666666667 0.340910331 0.688937846 +0.667644184 0.340074160 0.689949246 +0.668621701 0.339232333 0.690964504 +0.669599218 0.338388561 0.691983490 +0.670576735 0.337542836 0.693005305 +0.671554252 0.336695152 0.694031207 +0.672531769 0.335845338 0.695061065 +0.673509286 0.334988551 0.696093900 +0.674486804 0.334129550 0.697131132 +0.675464321 0.333268328 0.698172485 +0.676441838 0.332404874 0.699216970 +0.677419355 0.331539182 0.700266262 +0.678396872 0.330665959 0.701319757 +0.679374389 0.329789773 0.702376545 +0.680351906 0.328911076 0.703438672 +0.681329423 0.328029857 0.704504983 +0.682306940 0.327146107 0.705574753 +0.683284457 0.326254698 0.706650544 +0.684261975 0.325359248 0.707730369 +0.685239492 0.324460977 0.708813895 +0.686217009 0.323559874 0.709904167 +0.687194526 0.322655923 0.710998237 +0.688172043 0.321744286 0.712096862 +0.689149560 0.320827357 0.713201951 +0.690127077 0.319907274 0.714311028 +0.691104594 0.318984020 0.715425744 +0.692082111 0.318057580 0.716546437 +0.693059629 0.317123530 0.717671316 +0.694037146 0.316182751 0.718803182 +0.695014663 0.315238455 0.719940303 +0.695992180 0.314290624 0.721082144 +0.696969697 0.313339235 0.722231969 +0.697947214 0.312380425 0.723386379 +0.698924731 0.311413245 0.724547261 +0.699902248 0.310442153 0.725715054 +0.700879765 0.309467126 0.726887658 +0.701857283 0.308488140 0.728068862 +0.702834800 0.307502035 0.729255560 +0.703812317 0.306505697 0.730448885 +0.704789834 0.305505016 0.731650209 +0.705767351 0.304499963 0.732856799 +0.706744868 0.303490510 0.734072768 +0.707722385 0.302474365 0.735294761 +0.708699902 0.301445879 0.736524473 +0.709677419 0.300412575 0.737762451 +0.710654936 0.299374420 0.739006630 +0.711632454 0.298331379 0.740261200 +0.712609971 0.297282205 0.741521781 +0.713587488 0.296218314 0.742792422 +0.714565005 0.295149082 0.744070482 +0.715542522 0.294074469 0.745357611 +0.716520039 0.292994434 0.746653821 +0.717497556 0.291908937 0.747958353 +0.718475073 0.290806106 0.749273413 +0.719452590 0.289697326 0.750596331 +0.720430108 0.288582579 0.751930974 +0.721407625 0.287461816 0.753273330 +0.722385142 0.286334988 0.754628320 +0.723362659 0.285190730 0.755991241 +0.724340176 0.284038425 0.757367382 +0.725317693 0.282879501 0.758752076 +0.726295210 0.281713899 0.760150208 +0.727272727 0.280541562 0.761557968 +0.728250244 0.279351796 0.762978972 +0.729227761 0.278151577 0.764411182 +0.730205279 0.276944010 0.765855987 +0.731182796 0.275729026 0.767314128 +0.732160313 0.274506558 0.768783708 +0.733137830 0.273266769 0.770269365 +0.734115347 0.272013773 0.771767273 +0.735092864 0.270752612 0.773279617 +0.736070381 0.269483206 0.774807849 +0.737047898 0.268205474 0.776350238 +0.738025415 0.266910644 0.777908241 +0.739002933 0.265599461 0.779484121 +0.739980450 0.264279195 0.781076333 +0.740957967 0.262949750 0.782685839 +0.741935484 0.261611030 0.784313657 +0.742913001 0.260255561 0.785960859 +0.743890518 0.258880149 0.787628578 +0.744868035 0.257494616 0.789318005 +0.745845552 0.256098848 0.791030397 +0.746823069 0.254692732 0.792767079 +0.747800587 0.253270349 0.794529580 +0.748778104 0.251823930 0.796323108 +0.749755621 0.250366211 0.798153793 +0.750733138 0.250000000 0.798619957 +0.751710655 0.250000000 0.798619478 +0.752688172 0.250000000 0.798618827 +0.753665689 0.250000000 0.798618046 +0.754643206 0.250000000 0.798617146 +0.755620723 0.250000000 0.798616146 +0.756598240 0.250000000 0.798615054 +0.757575758 0.250000000 0.798613875 +0.758553275 0.250000000 0.798612615 +0.759530792 0.250000000 0.798611281 +0.760508309 0.250000000 0.798609872 +0.761485826 0.250000000 0.798608379 +0.762463343 0.250000000 0.798606824 +0.763440860 0.250000000 0.798605212 +0.764418377 0.250000000 0.798603523 +0.765395894 0.250000000 0.798601768 +0.766373412 0.250000000 0.798599968 +0.767350929 0.250000000 0.798598087 +0.768328446 0.250000000 0.798596154 +0.769305963 0.250000000 0.798594172 +0.770283480 0.250000000 0.798592109 +0.771260997 0.250000000 0.798590018 +0.772238514 0.250000000 0.798587837 +0.773216031 0.250000000 0.798585625 +0.774193548 0.250000000 0.798583339 +0.775171065 0.250000000 0.798581012 +0.776148583 0.250000000 0.798578619 +0.777126100 0.250000000 0.798576179 +0.778103617 0.250000000 0.798573676 +0.779081134 0.250000000 0.798571128 +0.780058651 0.250000000 0.798568514 +0.781036168 0.250000000 0.798565861 +0.782013685 0.250000000 0.798563134 +0.782991202 0.250000000 0.798560379 +0.783968719 0.250000000 0.798557536 +0.784946237 0.250000000 0.798554682 +0.785923754 0.250000000 0.798551722 +0.786901271 0.250000000 0.798548749 +0.787878788 0.250000000 0.798545693 +0.788856305 0.250000000 0.798542598 +0.789833822 0.250000000 0.798539450 +0.790811339 0.250000000 0.798536231 +0.791788856 0.250000000 0.798532993 +0.792766373 0.250000000 0.798529646 +0.793743891 0.250000000 0.798526284 +0.794721408 0.250000000 0.798522845 +0.795698925 0.250000000 0.798519352 +0.796676442 0.250000000 0.798515828 +0.797653959 0.250000000 0.798512201 +0.798631476 0.250000000 0.798508555 +0.799608993 0.250000000 0.798504830 +0.800586510 0.250000000 0.798501045 +0.801564027 0.250000000 0.798497238 +0.802541544 0.250000000 0.798493312 +0.803519062 0.250000000 0.798489365 +0.804496579 0.250000000 0.798485354 +0.805474096 0.250000000 0.798481260 +0.806451613 0.250000000 0.798477144 +0.807429130 0.250000000 0.798472926 +0.808406647 0.250000000 0.798468658 +0.809384164 0.250000000 0.798464362 +0.810361681 0.250000000 0.798459937 +0.811339198 0.250000000 0.798455487 +0.812316716 0.250000000 0.798450981 +0.813294233 0.250000000 0.798446368 +0.814271750 0.250000000 0.798441728 +0.815249267 0.250000000 0.798437007 +0.816226784 0.250000000 0.798432199 +0.817204301 0.250000000 0.798427360 +0.818181818 0.250000000 0.798422419 +0.819159335 0.250000000 0.798417406 +0.820136852 0.250000000 0.798412362 +0.821114370 0.250000000 0.798407195 +0.822091887 0.250000000 0.798401968 +0.823069404 0.250000000 0.798396707 +0.824046921 0.250000000 0.798391309 +0.825024438 0.250000000 0.798385858 +0.826001955 0.250000000 0.798380370 +0.826979472 0.250000000 0.798374734 +0.827956989 0.250000000 0.798369049 +0.828934506 0.250000000 0.798363324 +0.829912023 0.250000000 0.798357442 +0.830889541 0.250000000 0.798351511 +0.831867058 0.250000000 0.798345537 +0.832844575 0.250000000 0.798339400 +0.833822092 0.250000000 0.798333211 +0.834799609 0.250000000 0.798326976 +0.835777126 0.250000000 0.798320576 +0.836754643 0.250000000 0.798314116 +0.837732160 0.250000000 0.798307606 +0.838709677 0.250000000 0.798300932 +0.839687195 0.250000000 0.798294187 +0.840664712 0.250000000 0.798287388 +0.841642229 0.250000000 0.798280430 +0.842619746 0.250000000 0.798273384 +0.843597263 0.250000000 0.798266281 +0.844574780 0.250000000 0.798259026 +0.845552297 0.250000000 0.798251664 +0.846529814 0.250000000 0.798244240 +0.847507331 0.250000000 0.798236674 +0.848484848 0.250000000 0.798228978 +0.849462366 0.250000000 0.798221215 +0.850439883 0.250000000 0.798213324 +0.851417400 0.250000000 0.798205276 +0.852394917 0.250000000 0.798197155 +0.853372434 0.250000000 0.798188922 +0.854349951 0.250000000 0.798180502 +0.855327468 0.250000000 0.798172002 +0.856304985 0.250000000 0.798163410 +0.857282502 0.250000000 0.798154594 +0.858260020 0.250000000 0.798145693 +0.859237537 0.250000000 0.798136706 +0.860215054 0.250000000 0.798127487 +0.861192571 0.250000000 0.798118161 +0.862170088 0.250000000 0.798108741 +0.863147605 0.250000000 0.798099109 +0.864125122 0.250000000 0.798089331 +0.865102639 0.250000000 0.798079451 +0.866080156 0.250000000 0.798069382 +0.867057674 0.250000000 0.798059123 +0.868035191 0.250000000 0.798048754 +0.869012708 0.250000000 0.798038221 +0.869990225 0.250000000 0.798027449 +0.870967742 0.250000000 0.798016558 +0.871945259 0.250000000 0.798005530 +0.872922776 0.250000000 0.797994212 +0.873900293 0.250000000 0.797982764 +0.874877810 0.250000000 0.797971185 +0.875855327 0.250000000 0.797959306 +0.876832845 0.250000000 0.797947263 +0.877810362 0.250000000 0.797935078 +0.878787879 0.250000000 0.797922616 +0.879765396 0.250000000 0.797909935 +0.880742913 0.250000000 0.797897099 +0.881720430 0.250000000 0.797884012 +0.882697947 0.250000000 0.797870648 +0.883675464 0.250000000 0.797857113 +0.884652981 0.250000000 0.797843354 +0.885630499 0.250000000 0.797829254 +0.886608016 0.250000000 0.797814969 +0.887585533 0.250000000 0.797800485 +0.888563050 0.250000000 0.797785594 +0.889540567 0.250000000 0.797770499 +0.890518084 0.250000000 0.797755197 +0.891495601 0.250000000 0.797739486 +0.892473118 0.250000000 0.797723518 +0.893450635 0.250000000 0.797707323 +0.894428152 0.250000000 0.797690733 +0.895405670 0.250000000 0.797673819 +0.896383187 0.250000000 0.797656655 +0.897360704 0.250000000 0.797639111 +0.898338221 0.250000000 0.797621171 +0.899315738 0.250000000 0.797602957 +0.900293255 0.250000000 0.797584371 +0.901270772 0.250000000 0.797565316 +0.902248289 0.250000000 0.797545958 +0.903225806 0.250000000 0.797526235 +0.904203324 0.250000000 0.797505964 +0.905180841 0.250000000 0.797485358 +0.906158358 0.250000000 0.797464387 +0.907135875 0.250000000 0.797442787 +0.908113392 0.250000000 0.797420816 +0.909090909 0.250000000 0.797398464 +0.910068426 0.250000000 0.797375416 +0.911045943 0.250000000 0.797351947 +0.912023460 0.250000000 0.797328054 +0.913000978 0.250000000 0.797303431 +0.913978495 0.250000000 0.797278312 +0.914956012 0.250000000 0.797252722 +0.915933529 0.250000000 0.797226352 +0.916911046 0.250000000 0.797199412 +0.917888563 0.250000000 0.797171944 +0.918866080 0.250000000 0.797143632 +0.919843597 0.250000000 0.797114674 +0.920821114 0.250000000 0.797085122 +0.921798631 0.250000000 0.797054641 +0.922776149 0.250000000 0.797023436 +0.923753666 0.250000000 0.796991562 +0.924731183 0.250000000 0.796958649 +0.925708700 0.250000000 0.796924934 +0.926686217 0.250000000 0.796890462 +0.927663734 0.250000000 0.796854809 +0.928641251 0.250000000 0.796818277 +0.929618768 0.250000000 0.796780885 +0.930596285 0.250000000 0.796742131 +0.931573803 0.250000000 0.796702422 +0.932551320 0.250000000 0.796661678 +0.933528837 0.250000000 0.796619449 +0.934506354 0.250000000 0.796576138 +0.935483871 0.250000000 0.796531554 +0.936461388 0.250000000 0.796485383 +0.937438905 0.250000000 0.796437966 +0.938416422 0.250000000 0.796388970 +0.939393939 0.250000000 0.796338286 +0.940371457 0.250000000 0.796286158 +0.941348974 0.250000000 0.796232059 +0.942326491 0.250000000 0.796176174 +0.943304008 0.250000000 0.796118602 +0.944281525 0.250000000 0.796058564 +0.945259042 0.250000000 0.795996641 +0.946236559 0.250000000 0.795932487 +0.947214076 0.250000000 0.795865725 +0.948191593 0.250000000 0.795796735 +0.949169110 0.250000000 0.795724810 +0.950146628 0.250000000 0.795650131 +0.951124145 0.250000000 0.795572676 +0.952101662 0.250000000 0.795491611 +0.953079179 0.250000000 0.795407522 +0.954056696 0.250000000 0.795319628 +0.955034213 0.250000000 0.795227898 +0.956011730 0.250000000 0.795132357 +0.956989247 0.250000000 0.795031935 +0.957966764 0.250000000 0.794927282 +0.958944282 0.250000000 0.794817257 +0.959921799 0.250000000 0.794701981 +0.960899316 0.250000000 0.794581006 +0.961876833 0.250000000 0.794453449 +0.962854350 0.250000000 0.794319707 +0.963831867 0.250000000 0.794177846 +0.964809384 0.250000000 0.794028718 +0.965786901 0.250000000 0.793870437 +0.966764418 0.250000000 0.793703113 +0.967741935 0.250000000 0.793525315 +0.968719453 0.250000000 0.793336305 +0.969696970 0.250000000 0.793135013 +0.970674487 0.250000000 0.792919868 +0.971652004 0.250000000 0.792689957 +0.972629521 0.250000000 0.792442910 +0.973607038 0.250000000 0.792177663 +0.974584555 0.250000000 0.791891104 +0.975562072 0.250000000 0.791581540 +0.976539589 0.250000000 0.791245216 +0.977517107 0.250000000 0.790900290 +0.978494624 0.250000000 0.790546727 +0.979472141 0.250000000 0.790189953 +0.980449658 0.250000000 0.789814417 +0.981427175 0.250000000 0.789445023 +0.982404692 0.250000000 0.789052209 +0.983382209 0.250000000 0.788657501 +0.984359726 0.250000000 0.788250203 +0.985337243 0.250000000 0.787818500 +0.986314761 0.250000000 0.787390503 +0.987292278 0.250000000 0.786940347 +0.988269795 0.250000000 0.786464072 +0.989247312 0.250000000 0.785974808 +0.990224829 0.250000000 0.785469812 +0.991202346 0.250000000 0.784933879 +0.992179863 0.250000000 0.784364501 +0.993157380 0.250000000 0.783757951 +0.994134897 0.250000000 0.783108264 +0.995112414 0.250000000 0.782404962 +0.996089932 0.250000000 0.781627407 +0.997067449 0.250000000 0.780727892 +0.998044966 0.250000000 0.779693393 +0.999022483 0.250000000 0.778328498 +1.000000000 nan nan diff --git a/examples/mamdani/SimpleDimmerChained.fll b/examples/mamdani/SimpleDimmerChained.fll new file mode 100644 index 0000000..02b35cc --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.fll @@ -0,0 +1,42 @@ +Engine: SimpleDimmerChained +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +OutputVariable: InversePower + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 500 + default: nan + lock-previous: false + term: LOW Cosine 0.200 0.500 + term: MEDIUM Cosine 0.500 0.500 + term: HIGH Cosine 0.800 0.500 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW + rule: if Power is LOW then InversePower is HIGH + rule: if Power is MEDIUM then InversePower is MEDIUM + rule: if Power is HIGH then InversePower is LOW
\ No newline at end of file diff --git a/examples/mamdani/SimpleDimmerChained.java b/examples/mamdani/SimpleDimmerChained.java new file mode 100644 index 0000000..a7c28c6 --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.java @@ -0,0 +1,81 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class SimpleDimmerChained{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("SimpleDimmerChained"); +engine.setDescription(""); + +InputVariable Ambient = new InputVariable(); +Ambient.setName("Ambient"); +Ambient.setDescription(""); +Ambient.setEnabled(true); +Ambient.setRange(0.000, 1.000); +Ambient.setLockValueInRange(false); +Ambient.addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient.addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine.addInputVariable(Ambient); + +OutputVariable Power = new OutputVariable(); +Power.setName("Power"); +Power.setDescription(""); +Power.setEnabled(true); +Power.setRange(0.000, 1.000); +Power.setLockValueInRange(false); +Power.setAggregation(new Maximum()); +Power.setDefuzzifier(new Centroid(200)); +Power.setDefaultValue(Double.NaN); +Power.setLockPreviousValue(false); +Power.addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power.addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine.addOutputVariable(Power); + +OutputVariable InversePower = new OutputVariable(); +InversePower.setName("InversePower"); +InversePower.setDescription(""); +InversePower.setEnabled(true); +InversePower.setRange(0.000, 1.000); +InversePower.setLockValueInRange(false); +InversePower.setAggregation(new Maximum()); +InversePower.setDefuzzifier(new Centroid(500)); +InversePower.setDefaultValue(Double.NaN); +InversePower.setLockPreviousValue(false); +InversePower.addTerm(new Cosine("LOW", 0.200, 0.500)); +InversePower.addTerm(new Cosine("MEDIUM", 0.500, 0.500)); +InversePower.addTerm(new Cosine("HIGH", 0.800, 0.500)); +engine.addOutputVariable(InversePower); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +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)); +ruleBlock.addRule(Rule.parse("if Power is LOW then InversePower is HIGH", engine)); +ruleBlock.addRule(Rule.parse("if Power is MEDIUM then InversePower is MEDIUM", engine)); +ruleBlock.addRule(Rule.parse("if Power is HIGH then InversePower is LOW", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/SimpleDimmerChained.pdf b/examples/mamdani/SimpleDimmerChained.pdf Binary files differnew file mode 100644 index 0000000..bc22cfa --- /dev/null +++ b/examples/mamdani/SimpleDimmerChained.pdf diff --git a/examples/mamdani/SimpleDimmerInverse.R b/examples/mamdani/SimpleDimmerInverse.R new file mode 100644 index 0000000..358916d --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.R @@ -0,0 +1,85 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "SimpleDimmerInverse" +engine.fll = "Engine: SimpleDimmerInverse +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +OutputVariable: InversePower + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 500 + default: nan + lock-previous: false + term: LOW Cosine 0.200 0.500 + term: MEDIUM Cosine 0.500 0.500 + term: HIGH Cosine 0.800 0.500 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW + rule: if Power is LOW then InversePower is HIGH + rule: if Power is MEDIUM then InversePower is MEDIUM + rule: if Power is HIGH then InversePower is LOW" + +engine.fldFile = "SimpleDimmerInverse.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs Power") + +engine.plot.o1_i1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Power vs Ambient") + +engine.plot.i1_o2 = ggplot(engine.df, aes(Ambient, InversePower)) + + geom_line(aes(color=InversePower), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs InversePower") + +engine.plot.o2_i1 = ggplot(engine.df, aes(Ambient, InversePower)) + + geom_line(aes(color=InversePower), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("InversePower vs Ambient") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/SimpleDimmerInverse.cpp b/examples/mamdani/SimpleDimmerInverse.cpp new file mode 100644 index 0000000..1c22275 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.cpp @@ -0,0 +1,70 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("SimpleDimmerInverse"); +engine->setDescription(""); + +InputVariable* Ambient = new InputVariable; +Ambient->setName("Ambient"); +Ambient->setDescription(""); +Ambient->setEnabled(true); +Ambient->setRange(0.000, 1.000); +Ambient->setLockValueInRange(false); +Ambient->addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient->addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine->addInputVariable(Ambient); + +OutputVariable* Power = new OutputVariable; +Power->setName("Power"); +Power->setDescription(""); +Power->setEnabled(true); +Power->setRange(0.000, 1.000); +Power->setLockValueInRange(false); +Power->setAggregation(new Maximum); +Power->setDefuzzifier(new Centroid(200)); +Power->setDefaultValue(fl::nan); +Power->setLockPreviousValue(false); +Power->addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power->addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine->addOutputVariable(Power); + +OutputVariable* InversePower = new OutputVariable; +InversePower->setName("InversePower"); +InversePower->setDescription(""); +InversePower->setEnabled(true); +InversePower->setRange(0.000, 1.000); +InversePower->setLockValueInRange(false); +InversePower->setAggregation(new Maximum); +InversePower->setDefuzzifier(new Centroid(500)); +InversePower->setDefaultValue(fl::nan); +InversePower->setLockPreviousValue(false); +InversePower->addTerm(new Cosine("LOW", 0.200, 0.500)); +InversePower->addTerm(new Cosine("MEDIUM", 0.500, 0.500)); +InversePower->addTerm(new Cosine("HIGH", 0.800, 0.500)); +engine->addOutputVariable(InversePower); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +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)); +ruleBlock->addRule(Rule::parse("if Power is LOW then InversePower is HIGH", engine)); +ruleBlock->addRule(Rule::parse("if Power is MEDIUM then InversePower is MEDIUM", engine)); +ruleBlock->addRule(Rule::parse("if Power is HIGH then InversePower is LOW", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/SimpleDimmerInverse.fcl b/examples/mamdani/SimpleDimmerInverse.fcl new file mode 100644 index 0000000..d8043d3 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.fcl @@ -0,0 +1,51 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK SimpleDimmerInverse + +VAR_INPUT + Ambient: REAL; +END_VAR + +VAR_OUTPUT + Power: REAL; + InversePower: REAL; +END_VAR + +FUZZIFY Ambient + RANGE := (0.000 .. 1.000); + TERM DARK := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM BRIGHT := Triangle 0.500 0.750 1.000; +END_FUZZIFY + +DEFUZZIFY Power + RANGE := (0.000 .. 1.000); + TERM LOW := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM HIGH := Triangle 0.500 0.750 1.000; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY InversePower + RANGE := (0.000 .. 1.000); + TERM LOW := Cosine 0.200 0.500; + TERM MEDIUM := Cosine 0.500 0.500; + TERM HIGH := Cosine 0.800 0.500; + METHOD : COG; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + ACT : MIN; + RULE 1 : if Ambient is DARK then Power is HIGH + RULE 2 : if Ambient is MEDIUM then Power is MEDIUM + RULE 3 : if Ambient is BRIGHT then Power is LOW + RULE 4 : if Power is LOW then InversePower is HIGH + RULE 5 : if Power is MEDIUM then InversePower is MEDIUM + RULE 6 : if Power is HIGH then InversePower is LOW +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/SimpleDimmerInverse.fis b/examples/mamdani/SimpleDimmerInverse.fis new file mode 100644 index 0000000..b044014 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.fis @@ -0,0 +1,46 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='SimpleDimmerInverse' +Type='mamdani' +Version=6.0 +NumInputs=1 +NumOutputs=2 +NumRules=6 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + +[Output1] +Name='Power' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='HIGH':'trimf',[0.500 0.750 1.000] + +[Output2] +Name='InversePower' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'cosinemf',[0.200 0.500] +MF2='MEDIUM':'cosinemf',[0.500 0.500] +MF3='HIGH':'cosinemf',[0.800 0.500] + +[Rules] +1.000 , 3.000 0.000 (1.000) : 1 +2.000 , 2.000 0.000 (1.000) : 1 +3.000 , 1.000 0.000 (1.000) : 1 +0.000 , 0.000 3.000 (1.000) : 1 +0.000 , 0.000 2.000 (1.000) : 1 +0.000 , 0.000 1.000 (1.000) : 1 diff --git a/examples/mamdani/SimpleDimmerInverse.fld b/examples/mamdani/SimpleDimmerInverse.fld new file mode 100644 index 0000000..843c017 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.fld @@ -0,0 +1,1025 @@ +Ambient Power InversePower +0.000000000 nan nan +0.000977517 0.750000000 0.221671502 +0.001955034 0.750000000 0.220306607 +0.002932551 0.750000000 0.219272108 +0.003910068 0.750000000 0.218372593 +0.004887586 0.750000000 0.217595038 +0.005865103 0.750000000 0.216891736 +0.006842620 0.750000000 0.216242049 +0.007820137 0.750000000 0.215635499 +0.008797654 0.750000000 0.215066121 +0.009775171 0.750000000 0.214530188 +0.010752688 0.750000000 0.214025192 +0.011730205 0.750000000 0.213535928 +0.012707722 0.750000000 0.213059653 +0.013685239 0.750000000 0.212609497 +0.014662757 0.750000000 0.212181500 +0.015640274 0.750000000 0.211749797 +0.016617791 0.750000000 0.211342499 +0.017595308 0.750000000 0.210947791 +0.018572825 0.750000000 0.210554977 +0.019550342 0.750000000 0.210185583 +0.020527859 0.750000000 0.209810047 +0.021505376 0.750000000 0.209453273 +0.022482893 0.750000000 0.209099710 +0.023460411 0.750000000 0.208754784 +0.024437928 0.750000000 0.208418460 +0.025415445 0.750000000 0.208108896 +0.026392962 0.750000000 0.207822337 +0.027370479 0.750000000 0.207557090 +0.028347996 0.750000000 0.207310043 +0.029325513 0.750000000 0.207080132 +0.030303030 0.750000000 0.206864987 +0.031280547 0.750000000 0.206663695 +0.032258065 0.750000000 0.206474685 +0.033235582 0.750000000 0.206296887 +0.034213099 0.750000000 0.206129563 +0.035190616 0.750000000 0.205971282 +0.036168133 0.750000000 0.205822154 +0.037145650 0.750000000 0.205680293 +0.038123167 0.750000000 0.205546551 +0.039100684 0.750000000 0.205418994 +0.040078201 0.750000000 0.205298019 +0.041055718 0.750000000 0.205182743 +0.042033236 0.750000000 0.205072718 +0.043010753 0.750000000 0.204968065 +0.043988270 0.750000000 0.204867643 +0.044965787 0.750000000 0.204772102 +0.045943304 0.750000000 0.204680372 +0.046920821 0.750000000 0.204592478 +0.047898338 0.750000000 0.204508389 +0.048875855 0.750000000 0.204427324 +0.049853372 0.750000000 0.204349869 +0.050830890 0.750000000 0.204275190 +0.051808407 0.750000000 0.204203265 +0.052785924 0.750000000 0.204134275 +0.053763441 0.750000000 0.204067513 +0.054740958 0.750000000 0.204003359 +0.055718475 0.750000000 0.203941436 +0.056695992 0.750000000 0.203881398 +0.057673509 0.750000000 0.203823826 +0.058651026 0.750000000 0.203767941 +0.059628543 0.750000000 0.203713842 +0.060606061 0.750000000 0.203661714 +0.061583578 0.750000000 0.203611030 +0.062561095 0.750000000 0.203562034 +0.063538612 0.750000000 0.203514617 +0.064516129 0.750000000 0.203468446 +0.065493646 0.750000000 0.203423862 +0.066471163 0.750000000 0.203380551 +0.067448680 0.750000000 0.203338322 +0.068426197 0.750000000 0.203297578 +0.069403715 0.750000000 0.203257869 +0.070381232 0.750000000 0.203219115 +0.071358749 0.750000000 0.203181723 +0.072336266 0.750000000 0.203145191 +0.073313783 0.750000000 0.203109538 +0.074291300 0.750000000 0.203075066 +0.075268817 0.750000000 0.203041351 +0.076246334 0.750000000 0.203008438 +0.077223851 0.750000000 0.202976564 +0.078201369 0.750000000 0.202945359 +0.079178886 0.750000000 0.202914878 +0.080156403 0.750000000 0.202885326 +0.081133920 0.750000000 0.202856368 +0.082111437 0.750000000 0.202828056 +0.083088954 0.750000000 0.202800588 +0.084066471 0.750000000 0.202773648 +0.085043988 0.750000000 0.202747278 +0.086021505 0.750000000 0.202721688 +0.086999022 0.750000000 0.202696569 +0.087976540 0.750000000 0.202671946 +0.088954057 0.750000000 0.202648053 +0.089931574 0.750000000 0.202624584 +0.090909091 0.750000000 0.202601536 +0.091886608 0.750000000 0.202579184 +0.092864125 0.750000000 0.202557213 +0.093841642 0.750000000 0.202535613 +0.094819159 0.750000000 0.202514642 +0.095796676 0.750000000 0.202494036 +0.096774194 0.750000000 0.202473765 +0.097751711 0.750000000 0.202454042 +0.098729228 0.750000000 0.202434684 +0.099706745 0.750000000 0.202415629 +0.100684262 0.750000000 0.202397043 +0.101661779 0.750000000 0.202378829 +0.102639296 0.750000000 0.202360889 +0.103616813 0.750000000 0.202343345 +0.104594330 0.750000000 0.202326181 +0.105571848 0.750000000 0.202309267 +0.106549365 0.750000000 0.202292677 +0.107526882 0.750000000 0.202276482 +0.108504399 0.750000000 0.202260514 +0.109481916 0.750000000 0.202244803 +0.110459433 0.750000000 0.202229501 +0.111436950 0.750000000 0.202214406 +0.112414467 0.750000000 0.202199515 +0.113391984 0.750000000 0.202185031 +0.114369501 0.750000000 0.202170746 +0.115347019 0.750000000 0.202156646 +0.116324536 0.750000000 0.202142887 +0.117302053 0.750000000 0.202129352 +0.118279570 0.750000000 0.202115988 +0.119257087 0.750000000 0.202102901 +0.120234604 0.750000000 0.202090065 +0.121212121 0.750000000 0.202077384 +0.122189638 0.750000000 0.202064922 +0.123167155 0.750000000 0.202052737 +0.124144673 0.750000000 0.202040694 +0.125122190 0.750000000 0.202028815 +0.126099707 0.750000000 0.202017236 +0.127077224 0.750000000 0.202005788 +0.128054741 0.750000000 0.201994470 +0.129032258 0.750000000 0.201983442 +0.130009775 0.750000000 0.201972551 +0.130987292 0.750000000 0.201961779 +0.131964809 0.750000000 0.201951246 +0.132942326 0.750000000 0.201940877 +0.133919844 0.750000000 0.201930618 +0.134897361 0.750000000 0.201920549 +0.135874878 0.750000000 0.201910669 +0.136852395 0.750000000 0.201900891 +0.137829912 0.750000000 0.201891259 +0.138807429 0.750000000 0.201881839 +0.139784946 0.750000000 0.201872513 +0.140762463 0.750000000 0.201863294 +0.141739980 0.750000000 0.201854307 +0.142717498 0.750000000 0.201845406 +0.143695015 0.750000000 0.201836590 +0.144672532 0.750000000 0.201827998 +0.145650049 0.750000000 0.201819498 +0.146627566 0.750000000 0.201811078 +0.147605083 0.750000000 0.201802845 +0.148582600 0.750000000 0.201794724 +0.149560117 0.750000000 0.201786676 +0.150537634 0.750000000 0.201778785 +0.151515152 0.750000000 0.201771022 +0.152492669 0.750000000 0.201763326 +0.153470186 0.750000000 0.201755760 +0.154447703 0.750000000 0.201748336 +0.155425220 0.750000000 0.201740974 +0.156402737 0.750000000 0.201733719 +0.157380254 0.750000000 0.201726616 +0.158357771 0.750000000 0.201719570 +0.159335288 0.750000000 0.201712612 +0.160312805 0.750000000 0.201705813 +0.161290323 0.750000000 0.201699068 +0.162267840 0.750000000 0.201692394 +0.163245357 0.750000000 0.201685884 +0.164222874 0.750000000 0.201679424 +0.165200391 0.750000000 0.201673024 +0.166177908 0.750000000 0.201666789 +0.167155425 0.750000000 0.201660600 +0.168132942 0.750000000 0.201654463 +0.169110459 0.750000000 0.201648489 +0.170087977 0.750000000 0.201642558 +0.171065494 0.750000000 0.201636676 +0.172043011 0.750000000 0.201630951 +0.173020528 0.750000000 0.201625266 +0.173998045 0.750000000 0.201619630 +0.174975562 0.750000000 0.201614142 +0.175953079 0.750000000 0.201608691 +0.176930596 0.750000000 0.201603293 +0.177908113 0.750000000 0.201598032 +0.178885630 0.750000000 0.201592805 +0.179863148 0.750000000 0.201587638 +0.180840665 0.750000000 0.201582594 +0.181818182 0.750000000 0.201577581 +0.182795699 0.750000000 0.201572640 +0.183773216 0.750000000 0.201567801 +0.184750733 0.750000000 0.201562993 +0.185728250 0.750000000 0.201558272 +0.186705767 0.750000000 0.201553632 +0.187683284 0.750000000 0.201549019 +0.188660802 0.750000000 0.201544513 +0.189638319 0.750000000 0.201540063 +0.190615836 0.750000000 0.201535638 +0.191593353 0.750000000 0.201531342 +0.192570870 0.750000000 0.201527074 +0.193548387 0.750000000 0.201522856 +0.194525904 0.750000000 0.201518740 +0.195503421 0.750000000 0.201514646 +0.196480938 0.750000000 0.201510635 +0.197458456 0.750000000 0.201506688 +0.198435973 0.750000000 0.201502762 +0.199413490 0.750000000 0.201498955 +0.200391007 0.750000000 0.201495170 +0.201368524 0.750000000 0.201491445 +0.202346041 0.750000000 0.201487799 +0.203323558 0.750000000 0.201484172 +0.204301075 0.750000000 0.201480648 +0.205278592 0.750000000 0.201477155 +0.206256109 0.750000000 0.201473716 +0.207233627 0.750000000 0.201470354 +0.208211144 0.750000000 0.201467007 +0.209188661 0.750000000 0.201463769 +0.210166178 0.750000000 0.201460550 +0.211143695 0.750000000 0.201457402 +0.212121212 0.750000000 0.201454307 +0.213098729 0.750000000 0.201451251 +0.214076246 0.750000000 0.201448278 +0.215053763 0.750000000 0.201445318 +0.216031281 0.750000000 0.201442464 +0.217008798 0.750000000 0.201439621 +0.217986315 0.750000000 0.201436866 +0.218963832 0.750000000 0.201434139 +0.219941349 0.750000000 0.201431486 +0.220918866 0.750000000 0.201428872 +0.221896383 0.750000000 0.201426324 +0.222873900 0.750000000 0.201423821 +0.223851417 0.750000000 0.201421381 +0.224828935 0.750000000 0.201418988 +0.225806452 0.750000000 0.201416661 +0.226783969 0.750000000 0.201414375 +0.227761486 0.750000000 0.201412163 +0.228739003 0.750000000 0.201409982 +0.229716520 0.750000000 0.201407891 +0.230694037 0.750000000 0.201405828 +0.231671554 0.750000000 0.201403846 +0.232649071 0.750000000 0.201401913 +0.233626588 0.750000000 0.201400032 +0.234604106 0.750000000 0.201398232 +0.235581623 0.750000000 0.201396477 +0.236559140 0.750000000 0.201394788 +0.237536657 0.750000000 0.201393176 +0.238514174 0.750000000 0.201391621 +0.239491691 0.750000000 0.201390128 +0.240469208 0.750000000 0.201388719 +0.241446725 0.750000000 0.201387385 +0.242424242 0.750000000 0.201386125 +0.243401760 0.750000000 0.201384946 +0.244379277 0.750000000 0.201383854 +0.245356794 0.750000000 0.201382854 +0.246334311 0.750000000 0.201381954 +0.247311828 0.750000000 0.201381173 +0.248289345 0.750000000 0.201380522 +0.249266862 0.750000000 0.201380043 +0.250244379 0.749633789 0.201846207 +0.251221896 0.748176070 0.203676892 +0.252199413 0.746729651 0.205470420 +0.253176931 0.745307268 0.207232921 +0.254154448 0.743901152 0.208969603 +0.255131965 0.742505384 0.210681995 +0.256109482 0.741119851 0.212371422 +0.257086999 0.739744439 0.214039141 +0.258064516 0.738388970 0.215686343 +0.259042033 0.737050250 0.217314161 +0.260019550 0.735720805 0.218923667 +0.260997067 0.734400539 0.220515879 +0.261974585 0.733089356 0.222091759 +0.262952102 0.731794526 0.223649762 +0.263929619 0.730516794 0.225192151 +0.264907136 0.729247388 0.226720383 +0.265884653 0.727986227 0.228232727 +0.266862170 0.726733231 0.229730635 +0.267839687 0.725493442 0.231216292 +0.268817204 0.724270974 0.232685872 +0.269794721 0.723055990 0.234144013 +0.270772239 0.721848423 0.235588818 +0.271749756 0.720648204 0.237021028 +0.272727273 0.719458438 0.238442032 +0.273704790 0.718286101 0.239849792 +0.274682307 0.717120499 0.241247924 +0.275659824 0.715961575 0.242632618 +0.276637341 0.714809270 0.244008759 +0.277614858 0.713665012 0.245371680 +0.278592375 0.712538184 0.246726670 +0.279569892 0.711417421 0.248069026 +0.280547410 0.710302674 0.249403669 +0.281524927 0.709193894 0.250726587 +0.282502444 0.708091063 0.252041647 +0.283479961 0.707005566 0.253346179 +0.284457478 0.705925531 0.254642389 +0.285434995 0.704850918 0.255929518 +0.286412512 0.703781686 0.257207578 +0.287390029 0.702717795 0.258478219 +0.288367546 0.701668621 0.259738800 +0.289345064 0.700625580 0.260993370 +0.290322581 0.699587425 0.262237549 +0.291300098 0.698554121 0.263475527 +0.292277615 0.697525635 0.264705239 +0.293255132 0.696509490 0.265927232 +0.294232649 0.695500037 0.267143201 +0.295210166 0.694494984 0.268349791 +0.296187683 0.693494303 0.269551115 +0.297165200 0.692497965 0.270744440 +0.298142717 0.691511860 0.271931138 +0.299120235 0.690532874 0.273112342 +0.300097752 0.689557847 0.274284946 +0.301075269 0.688586755 0.275452739 +0.302052786 0.687619575 0.276613621 +0.303030303 0.686660765 0.277768031 +0.304007820 0.685709376 0.278917856 +0.304985337 0.684761545 0.280059697 +0.305962854 0.683817249 0.281196818 +0.306940371 0.682876470 0.282328684 +0.307917889 0.681942420 0.283453563 +0.308895406 0.681015980 0.284574256 +0.309872923 0.680092726 0.285688972 +0.310850440 0.679172643 0.286798049 +0.311827957 0.678255714 0.287903138 +0.312805474 0.677344077 0.289001763 +0.313782991 0.676440126 0.290095833 +0.314760508 0.675539023 0.291186105 +0.315738025 0.674640752 0.292269631 +0.316715543 0.673745302 0.293349456 +0.317693060 0.672853893 0.294425247 +0.318670577 0.671970143 0.295495017 +0.319648094 0.671088924 0.296561328 +0.320625611 0.670210227 0.297623455 +0.321603128 0.669334041 0.298680243 +0.322580645 0.668460818 0.299733738 +0.323558162 0.667595126 0.300783030 +0.324535679 0.666731672 0.301827515 +0.325513196 0.665870450 0.302868868 +0.326490714 0.665011449 0.303906100 +0.327468231 0.664154662 0.304938935 +0.328445748 0.663304848 0.305968793 +0.329423265 0.662457164 0.306994695 +0.330400782 0.661611439 0.308016510 +0.331378299 0.660767667 0.309035496 +0.332355816 0.659925840 0.310050754 +0.333333333 0.659089669 0.311062154 +0.334310850 0.658255868 0.312070870 +0.335288368 0.657423770 0.313076130 +0.336265885 0.656593371 0.314077703 +0.337243402 0.655764665 0.315076729 +0.338220919 0.654940458 0.316071981 +0.339198436 0.654118746 0.317062640 +0.340175953 0.653298497 0.318050990 +0.341153470 0.652479705 0.319036167 +0.342130987 0.651662368 0.320016921 +0.343108504 0.650848521 0.320995595 +0.344086022 0.650037186 0.321971698 +0.345063539 0.649227083 0.322943523 +0.346041056 0.648418210 0.323913488 +0.347018573 0.647610563 0.324881463 +0.347996090 0.646805538 0.325845303 +0.348973607 0.646002934 0.326807497 +0.349951124 0.645201343 0.327768050 +0.350928641 0.644400763 0.328725018 +0.351906158 0.643601190 0.329680354 +0.352883675 0.642803505 0.330634256 +0.353861193 0.642008044 0.331585332 +0.354838710 0.641213384 0.332534700 +0.355816227 0.640419523 0.333482835 +0.356793744 0.639626459 0.334428830 +0.357771261 0.638834675 0.335373101 +0.358748778 0.638044814 0.336316337 +0.359726295 0.637255548 0.337258027 +0.360703812 0.636466876 0.338198057 +0.361681329 0.635678797 0.339137245 +0.362658847 0.634891512 0.340075384 +0.363636364 0.634105743 0.341012014 +0.364613881 0.633320368 0.341947992 +0.365591398 0.632535386 0.342883313 +0.366568915 0.631750798 0.343817374 +0.367546432 0.630966638 0.344750971 +0.368523949 0.630183479 0.345684104 +0.369501466 0.629400516 0.346616504 +0.370478983 0.628617749 0.347548540 +0.371456500 0.627835178 0.348480299 +0.372434018 0.627052803 0.349411745 +0.373411535 0.626270772 0.350343037 +0.374389052 0.625488759 0.351274237 +0.375366569 0.624706745 0.352205426 +0.376344086 0.623924731 0.353136787 +0.377321603 0.623142717 0.354068240 +0.378299120 0.622360434 0.354999866 +0.379276637 0.621577912 0.355932108 +0.380254154 0.620795194 0.356864629 +0.381231672 0.620012280 0.357797428 +0.382209189 0.619229171 0.358731329 +0.383186706 0.618445288 0.359665733 +0.384164223 0.617660798 0.360600602 +0.385141740 0.616875914 0.361536789 +0.386119257 0.616090638 0.362473899 +0.387096774 0.615304967 0.363411663 +0.388074291 0.614518130 0.364350853 +0.389051808 0.613730200 0.365291500 +0.390029326 0.612941676 0.366232990 +0.391006843 0.612152558 0.367175921 +0.391984360 0.611362846 0.368120944 +0.392961877 0.610571682 0.369067005 +0.393939394 0.609778818 0.370014435 +0.394916911 0.608985156 0.370964689 +0.395894428 0.608190696 0.371916178 +0.396871945 0.607395436 0.372868906 +0.397849462 0.606598545 0.373825246 +0.398826979 0.605799225 0.374783038 +0.399804497 0.604998896 0.375742272 +0.400782014 0.604197558 0.376705194 +0.401759531 0.603395208 0.377670184 +0.402737048 0.602591157 0.378636823 +0.403714565 0.601783817 0.379607193 +0.404692082 0.600975251 0.380580296 +0.405669599 0.600165455 0.381555265 +0.406647116 0.599354429 0.382533989 +0.407624633 0.598541740 0.383516150 +0.408602151 0.597724765 0.384500397 +0.409579668 0.596906338 0.385488433 +0.410557185 0.596086453 0.386480623 +0.411534702 0.595265107 0.387475131 +0.412512219 0.594442248 0.388473492 +0.413489736 0.593613964 0.389476718 +0.414467253 0.592783988 0.390482499 +0.415444770 0.591952316 0.391491555 +0.416422287 0.591118941 0.392504668 +0.417399804 0.590283858 0.393520477 +0.418377322 0.589442972 0.394539685 +0.419354839 0.588599687 0.395563270 +0.420332356 0.587754450 0.396589695 +0.421309873 0.586907257 0.397619709 +0.422287390 0.586058099 0.398654373 +0.423264907 0.585202955 0.399692025 +0.424242424 0.584344508 0.400733540 +0.425219941 0.583483842 0.401779909 +0.426197458 0.582620947 0.402829422 +0.427174976 0.581755815 0.403883177 +0.428152493 0.580884615 0.404941902 +0.429130010 0.580009054 0.406003935 +0.430107527 0.579130986 0.407070716 +0.431085044 0.578250399 0.408142475 +0.432062561 0.577367283 0.409217712 +0.433040078 0.576478121 0.410298357 +0.434017595 0.575583374 0.411383856 +0.434995112 0.574685810 0.412473008 +0.435972630 0.573785416 0.413568413 +0.436950147 0.572882178 0.414668387 +0.437927664 0.571973027 0.415772198 +0.438905181 0.571056884 0.416883317 +0.439882698 0.570137591 0.417998533 +0.440860215 0.569215132 0.419118581 +0.441837732 0.568289490 0.420245634 +0.442815249 0.567358177 0.421376894 +0.443792766 0.566418275 0.422514343 +0.444770283 0.565474860 0.423658069 +0.445747801 0.564527914 0.424806212 +0.446725318 0.563577417 0.425962211 +0.447702835 0.562621612 0.427123480 +0.448680352 0.561655405 0.428290282 +0.449657869 0.560685294 0.429465166 +0.450635386 0.559711253 0.430644890 +0.451612903 0.558733259 0.431832308 +0.452590420 0.557750445 0.433026364 +0.453567937 0.556755188 0.434226000 +0.454545455 0.555755595 0.435434924 +0.455522972 0.554751638 0.436649146 +0.456500489 0.553743287 0.437871753 +0.457478006 0.552730515 0.439101626 +0.458455523 0.551703450 0.440338101 +0.459433040 0.550671354 0.441584214 +0.460410557 0.549634415 0.442836126 +0.461388074 0.548592599 0.444098260 +0.462365591 0.547545872 0.445367270 +0.463343109 0.546484786 0.446645195 +0.464320626 0.545416893 0.447931951 +0.465298143 0.544343629 0.449226535 +0.466275660 0.543264953 0.450531713 +0.467253177 0.542180826 0.451843888 +0.468230694 0.541082374 0.453168194 +0.469208211 0.539975079 0.454499403 +0.470185728 0.538861828 0.455843131 +0.471163245 0.537742573 0.457194500 +0.472140762 0.536617267 0.458558366 +0.473118280 0.535477779 0.459930679 +0.474095797 0.534327120 0.461315854 +0.475073314 0.533169855 0.462709935 +0.476050831 0.532005928 0.464117671 +0.477028348 0.530835281 0.465534381 +0.478005865 0.529650711 0.466952620 +0.478983382 0.528452318 0.468377996 +0.479960899 0.527246594 0.469806093 +0.480938416 0.526033471 0.471239943 +0.481915934 0.524812880 0.472678374 +0.482893451 0.523578752 0.474120606 +0.483870968 0.522327784 0.475569070 +0.484848485 0.521068672 0.477020289 +0.485826002 0.519801335 0.478476759 +0.486803519 0.518525692 0.479938796 +0.487781036 0.517237031 0.481403707 +0.488758553 0.515928105 0.482873363 +0.489736070 0.514610118 0.484347894 +0.490713587 0.513282977 0.485826893 +0.491691105 0.511946585 0.487309221 +0.492668622 0.510597845 0.488795133 +0.493646139 0.509224947 0.490284775 +0.494623656 0.507841954 0.491777716 +0.495601173 0.506448755 0.493273513 +0.496578690 0.505045237 0.494770784 +0.497556207 0.503630203 0.496268873 +0.498533724 0.502186589 0.497766318 +0.499511241 0.500731707 0.499259366 +0.500488759 0.499268293 0.500740634 +0.501466276 0.497813411 0.502233682 +0.502443793 0.496369797 0.503731127 +0.503421310 0.494954763 0.505229216 +0.504398827 0.493551245 0.506726487 +0.505376344 0.492158046 0.508222284 +0.506353861 0.490775053 0.509715225 +0.507331378 0.489402155 0.511204867 +0.508308895 0.488053415 0.512690779 +0.509286413 0.486717023 0.514173107 +0.510263930 0.485389882 0.515652106 +0.511241447 0.484071895 0.517126637 +0.512218964 0.482762969 0.518596293 +0.513196481 0.481474308 0.520061204 +0.514173998 0.480198665 0.521523241 +0.515151515 0.478931328 0.522979711 +0.516129032 0.477672216 0.524430930 +0.517106549 0.476421248 0.525879394 +0.518084066 0.475187120 0.527321626 +0.519061584 0.473966529 0.528760057 +0.520039101 0.472753406 0.530193907 +0.521016618 0.471547682 0.531622004 +0.521994135 0.470349289 0.533047380 +0.522971652 0.469164719 0.534465619 +0.523949169 0.467994072 0.535882329 +0.524926686 0.466830145 0.537290065 +0.525904203 0.465672880 0.538684146 +0.526881720 0.464522221 0.540069321 +0.527859238 0.463382733 0.541441634 +0.528836755 0.462257427 0.542805500 +0.529814272 0.461138172 0.544156869 +0.530791789 0.460024921 0.545500597 +0.531769306 0.458917626 0.546831806 +0.532746823 0.457819174 0.548156112 +0.533724340 0.456735047 0.549468287 +0.534701857 0.455656371 0.550773465 +0.535679374 0.454583107 0.552068049 +0.536656891 0.453515214 0.553354805 +0.537634409 0.452454128 0.554632730 +0.538611926 0.451407401 0.555901740 +0.539589443 0.450365585 0.557163874 +0.540566960 0.449328646 0.558415786 +0.541544477 0.448296550 0.559661899 +0.542521994 0.447269485 0.560898374 +0.543499511 0.446256713 0.562128247 +0.544477028 0.445248362 0.563350854 +0.545454545 0.444244405 0.564565076 +0.546432063 0.443244812 0.565774000 +0.547409580 0.442249555 0.566973636 +0.548387097 0.441266741 0.568167692 +0.549364614 0.440288747 0.569355110 +0.550342131 0.439314706 0.570534834 +0.551319648 0.438344595 0.571709718 +0.552297165 0.437378388 0.572876520 +0.553274682 0.436422583 0.574037789 +0.554252199 0.435472086 0.575193788 +0.555229717 0.434525140 0.576341931 +0.556207234 0.433581725 0.577485657 +0.557184751 0.432641823 0.578623106 +0.558162268 0.431710510 0.579754366 +0.559139785 0.430784868 0.580881419 +0.560117302 0.429862409 0.582001467 +0.561094819 0.428943116 0.583116683 +0.562072336 0.428026973 0.584227802 +0.563049853 0.427117822 0.585331613 +0.564027370 0.426214584 0.586431587 +0.565004888 0.425314190 0.587526992 +0.565982405 0.424416626 0.588616144 +0.566959922 0.423521879 0.589701643 +0.567937439 0.422632717 0.590782288 +0.568914956 0.421749601 0.591857525 +0.569892473 0.420869014 0.592929284 +0.570869990 0.419990946 0.593996065 +0.571847507 0.419115385 0.595058098 +0.572825024 0.418244185 0.596116823 +0.573802542 0.417379053 0.597170578 +0.574780059 0.416516158 0.598220091 +0.575757576 0.415655492 0.599266460 +0.576735093 0.414797045 0.600307975 +0.577712610 0.413941901 0.601345627 +0.578690127 0.413092743 0.602380291 +0.579667644 0.412245550 0.603410305 +0.580645161 0.411400313 0.604436730 +0.581622678 0.410557028 0.605460315 +0.582600196 0.409716142 0.606479523 +0.583577713 0.408881059 0.607495332 +0.584555230 0.408047684 0.608508445 +0.585532747 0.407216012 0.609517501 +0.586510264 0.406386036 0.610523282 +0.587487781 0.405557752 0.611526508 +0.588465298 0.404734893 0.612524869 +0.589442815 0.403913547 0.613519377 +0.590420332 0.403093662 0.614511567 +0.591397849 0.402275235 0.615499603 +0.592375367 0.401458260 0.616483850 +0.593352884 0.400645571 0.617466011 +0.594330401 0.399834545 0.618444735 +0.595307918 0.399024749 0.619419704 +0.596285435 0.398216183 0.620392807 +0.597262952 0.397408843 0.621363177 +0.598240469 0.396604792 0.622329816 +0.599217986 0.395802442 0.623294806 +0.600195503 0.395001104 0.624257728 +0.601173021 0.394200775 0.625216962 +0.602150538 0.393401455 0.626174754 +0.603128055 0.392604564 0.627131094 +0.604105572 0.391809304 0.628083822 +0.605083089 0.391014844 0.629035311 +0.606060606 0.390221182 0.629985565 +0.607038123 0.389428318 0.630932995 +0.608015640 0.388637154 0.631879056 +0.608993157 0.387847442 0.632824079 +0.609970674 0.387058324 0.633767010 +0.610948192 0.386269800 0.634708500 +0.611925709 0.385481870 0.635649147 +0.612903226 0.384695033 0.636588337 +0.613880743 0.383909362 0.637526101 +0.614858260 0.383124086 0.638463211 +0.615835777 0.382339202 0.639399398 +0.616813294 0.381554712 0.640334267 +0.617790811 0.380770829 0.641268671 +0.618768328 0.379987720 0.642202572 +0.619745846 0.379204806 0.643135371 +0.620723363 0.378422088 0.644067892 +0.621700880 0.377639566 0.645000134 +0.622678397 0.376857283 0.645931760 +0.623655914 0.376075269 0.646863213 +0.624633431 0.375293255 0.647794574 +0.625610948 0.374511241 0.648725763 +0.626588465 0.373729228 0.649656963 +0.627565982 0.372947197 0.650588255 +0.628543500 0.372164822 0.651519701 +0.629521017 0.371382251 0.652451460 +0.630498534 0.370599484 0.653383496 +0.631476051 0.369816521 0.654315896 +0.632453568 0.369033362 0.655249029 +0.633431085 0.368249202 0.656182626 +0.634408602 0.367464614 0.657116687 +0.635386119 0.366679632 0.658052008 +0.636363636 0.365894257 0.658987986 +0.637341153 0.365108488 0.659924616 +0.638318671 0.364321203 0.660862755 +0.639296188 0.363533124 0.661801943 +0.640273705 0.362744452 0.662741973 +0.641251222 0.361955186 0.663683663 +0.642228739 0.361165325 0.664626899 +0.643206256 0.360373541 0.665571170 +0.644183773 0.359580477 0.666517165 +0.645161290 0.358786616 0.667465300 +0.646138807 0.357991956 0.668414668 +0.647116325 0.357196495 0.669365744 +0.648093842 0.356398810 0.670319646 +0.649071359 0.355599237 0.671274982 +0.650048876 0.354798657 0.672231950 +0.651026393 0.353997066 0.673192503 +0.652003910 0.353194462 0.674154697 +0.652981427 0.352389437 0.675118537 +0.653958944 0.351581790 0.676086512 +0.654936461 0.350772917 0.677056477 +0.655913978 0.349962814 0.678028302 +0.656891496 0.349151479 0.679004405 +0.657869013 0.348337632 0.679983079 +0.658846530 0.347520295 0.680963833 +0.659824047 0.346701503 0.681949010 +0.660801564 0.345881254 0.682937360 +0.661779081 0.345059542 0.683928019 +0.662756598 0.344235335 0.684923271 +0.663734115 0.343406629 0.685922297 +0.664711632 0.342576230 0.686923870 +0.665689150 0.341744132 0.687929130 +0.666666667 0.340910331 0.688937846 +0.667644184 0.340074160 0.689949246 +0.668621701 0.339232333 0.690964504 +0.669599218 0.338388561 0.691983490 +0.670576735 0.337542836 0.693005305 +0.671554252 0.336695152 0.694031207 +0.672531769 0.335845338 0.695061065 +0.673509286 0.334988551 0.696093900 +0.674486804 0.334129550 0.697131132 +0.675464321 0.333268328 0.698172485 +0.676441838 0.332404874 0.699216970 +0.677419355 0.331539182 0.700266262 +0.678396872 0.330665959 0.701319757 +0.679374389 0.329789773 0.702376545 +0.680351906 0.328911076 0.703438672 +0.681329423 0.328029857 0.704504983 +0.682306940 0.327146107 0.705574753 +0.683284457 0.326254698 0.706650544 +0.684261975 0.325359248 0.707730369 +0.685239492 0.324460977 0.708813895 +0.686217009 0.323559874 0.709904167 +0.687194526 0.322655923 0.710998237 +0.688172043 0.321744286 0.712096862 +0.689149560 0.320827357 0.713201951 +0.690127077 0.319907274 0.714311028 +0.691104594 0.318984020 0.715425744 +0.692082111 0.318057580 0.716546437 +0.693059629 0.317123530 0.717671316 +0.694037146 0.316182751 0.718803182 +0.695014663 0.315238455 0.719940303 +0.695992180 0.314290624 0.721082144 +0.696969697 0.313339235 0.722231969 +0.697947214 0.312380425 0.723386379 +0.698924731 0.311413245 0.724547261 +0.699902248 0.310442153 0.725715054 +0.700879765 0.309467126 0.726887658 +0.701857283 0.308488140 0.728068862 +0.702834800 0.307502035 0.729255560 +0.703812317 0.306505697 0.730448885 +0.704789834 0.305505016 0.731650209 +0.705767351 0.304499963 0.732856799 +0.706744868 0.303490510 0.734072768 +0.707722385 0.302474365 0.735294761 +0.708699902 0.301445879 0.736524473 +0.709677419 0.300412575 0.737762451 +0.710654936 0.299374420 0.739006630 +0.711632454 0.298331379 0.740261200 +0.712609971 0.297282205 0.741521781 +0.713587488 0.296218314 0.742792422 +0.714565005 0.295149082 0.744070482 +0.715542522 0.294074469 0.745357611 +0.716520039 0.292994434 0.746653821 +0.717497556 0.291908937 0.747958353 +0.718475073 0.290806106 0.749273413 +0.719452590 0.289697326 0.750596331 +0.720430108 0.288582579 0.751930974 +0.721407625 0.287461816 0.753273330 +0.722385142 0.286334988 0.754628320 +0.723362659 0.285190730 0.755991241 +0.724340176 0.284038425 0.757367382 +0.725317693 0.282879501 0.758752076 +0.726295210 0.281713899 0.760150208 +0.727272727 0.280541562 0.761557968 +0.728250244 0.279351796 0.762978972 +0.729227761 0.278151577 0.764411182 +0.730205279 0.276944010 0.765855987 +0.731182796 0.275729026 0.767314128 +0.732160313 0.274506558 0.768783708 +0.733137830 0.273266769 0.770269365 +0.734115347 0.272013773 0.771767273 +0.735092864 0.270752612 0.773279617 +0.736070381 0.269483206 0.774807849 +0.737047898 0.268205474 0.776350238 +0.738025415 0.266910644 0.777908241 +0.739002933 0.265599461 0.779484121 +0.739980450 0.264279195 0.781076333 +0.740957967 0.262949750 0.782685839 +0.741935484 0.261611030 0.784313657 +0.742913001 0.260255561 0.785960859 +0.743890518 0.258880149 0.787628578 +0.744868035 0.257494616 0.789318005 +0.745845552 0.256098848 0.791030397 +0.746823069 0.254692732 0.792767079 +0.747800587 0.253270349 0.794529580 +0.748778104 0.251823930 0.796323108 +0.749755621 0.250366211 0.798153793 +0.750733138 0.250000000 0.798619957 +0.751710655 0.250000000 0.798619478 +0.752688172 0.250000000 0.798618827 +0.753665689 0.250000000 0.798618046 +0.754643206 0.250000000 0.798617146 +0.755620723 0.250000000 0.798616146 +0.756598240 0.250000000 0.798615054 +0.757575758 0.250000000 0.798613875 +0.758553275 0.250000000 0.798612615 +0.759530792 0.250000000 0.798611281 +0.760508309 0.250000000 0.798609872 +0.761485826 0.250000000 0.798608379 +0.762463343 0.250000000 0.798606824 +0.763440860 0.250000000 0.798605212 +0.764418377 0.250000000 0.798603523 +0.765395894 0.250000000 0.798601768 +0.766373412 0.250000000 0.798599968 +0.767350929 0.250000000 0.798598087 +0.768328446 0.250000000 0.798596154 +0.769305963 0.250000000 0.798594172 +0.770283480 0.250000000 0.798592109 +0.771260997 0.250000000 0.798590018 +0.772238514 0.250000000 0.798587837 +0.773216031 0.250000000 0.798585625 +0.774193548 0.250000000 0.798583339 +0.775171065 0.250000000 0.798581012 +0.776148583 0.250000000 0.798578619 +0.777126100 0.250000000 0.798576179 +0.778103617 0.250000000 0.798573676 +0.779081134 0.250000000 0.798571128 +0.780058651 0.250000000 0.798568514 +0.781036168 0.250000000 0.798565861 +0.782013685 0.250000000 0.798563134 +0.782991202 0.250000000 0.798560379 +0.783968719 0.250000000 0.798557536 +0.784946237 0.250000000 0.798554682 +0.785923754 0.250000000 0.798551722 +0.786901271 0.250000000 0.798548749 +0.787878788 0.250000000 0.798545693 +0.788856305 0.250000000 0.798542598 +0.789833822 0.250000000 0.798539450 +0.790811339 0.250000000 0.798536231 +0.791788856 0.250000000 0.798532993 +0.792766373 0.250000000 0.798529646 +0.793743891 0.250000000 0.798526284 +0.794721408 0.250000000 0.798522845 +0.795698925 0.250000000 0.798519352 +0.796676442 0.250000000 0.798515828 +0.797653959 0.250000000 0.798512201 +0.798631476 0.250000000 0.798508555 +0.799608993 0.250000000 0.798504830 +0.800586510 0.250000000 0.798501045 +0.801564027 0.250000000 0.798497238 +0.802541544 0.250000000 0.798493312 +0.803519062 0.250000000 0.798489365 +0.804496579 0.250000000 0.798485354 +0.805474096 0.250000000 0.798481260 +0.806451613 0.250000000 0.798477144 +0.807429130 0.250000000 0.798472926 +0.808406647 0.250000000 0.798468658 +0.809384164 0.250000000 0.798464362 +0.810361681 0.250000000 0.798459937 +0.811339198 0.250000000 0.798455487 +0.812316716 0.250000000 0.798450981 +0.813294233 0.250000000 0.798446368 +0.814271750 0.250000000 0.798441728 +0.815249267 0.250000000 0.798437007 +0.816226784 0.250000000 0.798432199 +0.817204301 0.250000000 0.798427360 +0.818181818 0.250000000 0.798422419 +0.819159335 0.250000000 0.798417406 +0.820136852 0.250000000 0.798412362 +0.821114370 0.250000000 0.798407195 +0.822091887 0.250000000 0.798401968 +0.823069404 0.250000000 0.798396707 +0.824046921 0.250000000 0.798391309 +0.825024438 0.250000000 0.798385858 +0.826001955 0.250000000 0.798380370 +0.826979472 0.250000000 0.798374734 +0.827956989 0.250000000 0.798369049 +0.828934506 0.250000000 0.798363324 +0.829912023 0.250000000 0.798357442 +0.830889541 0.250000000 0.798351511 +0.831867058 0.250000000 0.798345537 +0.832844575 0.250000000 0.798339400 +0.833822092 0.250000000 0.798333211 +0.834799609 0.250000000 0.798326976 +0.835777126 0.250000000 0.798320576 +0.836754643 0.250000000 0.798314116 +0.837732160 0.250000000 0.798307606 +0.838709677 0.250000000 0.798300932 +0.839687195 0.250000000 0.798294187 +0.840664712 0.250000000 0.798287388 +0.841642229 0.250000000 0.798280430 +0.842619746 0.250000000 0.798273384 +0.843597263 0.250000000 0.798266281 +0.844574780 0.250000000 0.798259026 +0.845552297 0.250000000 0.798251664 +0.846529814 0.250000000 0.798244240 +0.847507331 0.250000000 0.798236674 +0.848484848 0.250000000 0.798228978 +0.849462366 0.250000000 0.798221215 +0.850439883 0.250000000 0.798213324 +0.851417400 0.250000000 0.798205276 +0.852394917 0.250000000 0.798197155 +0.853372434 0.250000000 0.798188922 +0.854349951 0.250000000 0.798180502 +0.855327468 0.250000000 0.798172002 +0.856304985 0.250000000 0.798163410 +0.857282502 0.250000000 0.798154594 +0.858260020 0.250000000 0.798145693 +0.859237537 0.250000000 0.798136706 +0.860215054 0.250000000 0.798127487 +0.861192571 0.250000000 0.798118161 +0.862170088 0.250000000 0.798108741 +0.863147605 0.250000000 0.798099109 +0.864125122 0.250000000 0.798089331 +0.865102639 0.250000000 0.798079451 +0.866080156 0.250000000 0.798069382 +0.867057674 0.250000000 0.798059123 +0.868035191 0.250000000 0.798048754 +0.869012708 0.250000000 0.798038221 +0.869990225 0.250000000 0.798027449 +0.870967742 0.250000000 0.798016558 +0.871945259 0.250000000 0.798005530 +0.872922776 0.250000000 0.797994212 +0.873900293 0.250000000 0.797982764 +0.874877810 0.250000000 0.797971185 +0.875855327 0.250000000 0.797959306 +0.876832845 0.250000000 0.797947263 +0.877810362 0.250000000 0.797935078 +0.878787879 0.250000000 0.797922616 +0.879765396 0.250000000 0.797909935 +0.880742913 0.250000000 0.797897099 +0.881720430 0.250000000 0.797884012 +0.882697947 0.250000000 0.797870648 +0.883675464 0.250000000 0.797857113 +0.884652981 0.250000000 0.797843354 +0.885630499 0.250000000 0.797829254 +0.886608016 0.250000000 0.797814969 +0.887585533 0.250000000 0.797800485 +0.888563050 0.250000000 0.797785594 +0.889540567 0.250000000 0.797770499 +0.890518084 0.250000000 0.797755197 +0.891495601 0.250000000 0.797739486 +0.892473118 0.250000000 0.797723518 +0.893450635 0.250000000 0.797707323 +0.894428152 0.250000000 0.797690733 +0.895405670 0.250000000 0.797673819 +0.896383187 0.250000000 0.797656655 +0.897360704 0.250000000 0.797639111 +0.898338221 0.250000000 0.797621171 +0.899315738 0.250000000 0.797602957 +0.900293255 0.250000000 0.797584371 +0.901270772 0.250000000 0.797565316 +0.902248289 0.250000000 0.797545958 +0.903225806 0.250000000 0.797526235 +0.904203324 0.250000000 0.797505964 +0.905180841 0.250000000 0.797485358 +0.906158358 0.250000000 0.797464387 +0.907135875 0.250000000 0.797442787 +0.908113392 0.250000000 0.797420816 +0.909090909 0.250000000 0.797398464 +0.910068426 0.250000000 0.797375416 +0.911045943 0.250000000 0.797351947 +0.912023460 0.250000000 0.797328054 +0.913000978 0.250000000 0.797303431 +0.913978495 0.250000000 0.797278312 +0.914956012 0.250000000 0.797252722 +0.915933529 0.250000000 0.797226352 +0.916911046 0.250000000 0.797199412 +0.917888563 0.250000000 0.797171944 +0.918866080 0.250000000 0.797143632 +0.919843597 0.250000000 0.797114674 +0.920821114 0.250000000 0.797085122 +0.921798631 0.250000000 0.797054641 +0.922776149 0.250000000 0.797023436 +0.923753666 0.250000000 0.796991562 +0.924731183 0.250000000 0.796958649 +0.925708700 0.250000000 0.796924934 +0.926686217 0.250000000 0.796890462 +0.927663734 0.250000000 0.796854809 +0.928641251 0.250000000 0.796818277 +0.929618768 0.250000000 0.796780885 +0.930596285 0.250000000 0.796742131 +0.931573803 0.250000000 0.796702422 +0.932551320 0.250000000 0.796661678 +0.933528837 0.250000000 0.796619449 +0.934506354 0.250000000 0.796576138 +0.935483871 0.250000000 0.796531554 +0.936461388 0.250000000 0.796485383 +0.937438905 0.250000000 0.796437966 +0.938416422 0.250000000 0.796388970 +0.939393939 0.250000000 0.796338286 +0.940371457 0.250000000 0.796286158 +0.941348974 0.250000000 0.796232059 +0.942326491 0.250000000 0.796176174 +0.943304008 0.250000000 0.796118602 +0.944281525 0.250000000 0.796058564 +0.945259042 0.250000000 0.795996641 +0.946236559 0.250000000 0.795932487 +0.947214076 0.250000000 0.795865725 +0.948191593 0.250000000 0.795796735 +0.949169110 0.250000000 0.795724810 +0.950146628 0.250000000 0.795650131 +0.951124145 0.250000000 0.795572676 +0.952101662 0.250000000 0.795491611 +0.953079179 0.250000000 0.795407522 +0.954056696 0.250000000 0.795319628 +0.955034213 0.250000000 0.795227898 +0.956011730 0.250000000 0.795132357 +0.956989247 0.250000000 0.795031935 +0.957966764 0.250000000 0.794927282 +0.958944282 0.250000000 0.794817257 +0.959921799 0.250000000 0.794701981 +0.960899316 0.250000000 0.794581006 +0.961876833 0.250000000 0.794453449 +0.962854350 0.250000000 0.794319707 +0.963831867 0.250000000 0.794177846 +0.964809384 0.250000000 0.794028718 +0.965786901 0.250000000 0.793870437 +0.966764418 0.250000000 0.793703113 +0.967741935 0.250000000 0.793525315 +0.968719453 0.250000000 0.793336305 +0.969696970 0.250000000 0.793135013 +0.970674487 0.250000000 0.792919868 +0.971652004 0.250000000 0.792689957 +0.972629521 0.250000000 0.792442910 +0.973607038 0.250000000 0.792177663 +0.974584555 0.250000000 0.791891104 +0.975562072 0.250000000 0.791581540 +0.976539589 0.250000000 0.791245216 +0.977517107 0.250000000 0.790900290 +0.978494624 0.250000000 0.790546727 +0.979472141 0.250000000 0.790189953 +0.980449658 0.250000000 0.789814417 +0.981427175 0.250000000 0.789445023 +0.982404692 0.250000000 0.789052209 +0.983382209 0.250000000 0.788657501 +0.984359726 0.250000000 0.788250203 +0.985337243 0.250000000 0.787818500 +0.986314761 0.250000000 0.787390503 +0.987292278 0.250000000 0.786940347 +0.988269795 0.250000000 0.786464072 +0.989247312 0.250000000 0.785974808 +0.990224829 0.250000000 0.785469812 +0.991202346 0.250000000 0.784933879 +0.992179863 0.250000000 0.784364501 +0.993157380 0.250000000 0.783757951 +0.994134897 0.250000000 0.783108264 +0.995112414 0.250000000 0.782404962 +0.996089932 0.250000000 0.781627407 +0.997067449 0.250000000 0.780727892 +0.998044966 0.250000000 0.779693393 +0.999022483 0.250000000 0.778328498 +1.000000000 nan nan diff --git a/examples/mamdani/SimpleDimmerInverse.fll b/examples/mamdani/SimpleDimmerInverse.fll new file mode 100644 index 0000000..4ce7313 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.fll @@ -0,0 +1,42 @@ +Engine: SimpleDimmerInverse +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +OutputVariable: InversePower + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: Centroid 500 + default: nan + lock-previous: false + term: LOW Cosine 0.200 0.500 + term: MEDIUM Cosine 0.500 0.500 + term: HIGH Cosine 0.800 0.500 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW + rule: if Power is LOW then InversePower is HIGH + rule: if Power is MEDIUM then InversePower is MEDIUM + rule: if Power is HIGH then InversePower is LOW
\ No newline at end of file diff --git a/examples/mamdani/SimpleDimmerInverse.java b/examples/mamdani/SimpleDimmerInverse.java new file mode 100644 index 0000000..218f831 --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.java @@ -0,0 +1,81 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class SimpleDimmerInverse{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("SimpleDimmerInverse"); +engine.setDescription(""); + +InputVariable Ambient = new InputVariable(); +Ambient.setName("Ambient"); +Ambient.setDescription(""); +Ambient.setEnabled(true); +Ambient.setRange(0.000, 1.000); +Ambient.setLockValueInRange(false); +Ambient.addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient.addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine.addInputVariable(Ambient); + +OutputVariable Power = new OutputVariable(); +Power.setName("Power"); +Power.setDescription(""); +Power.setEnabled(true); +Power.setRange(0.000, 1.000); +Power.setLockValueInRange(false); +Power.setAggregation(new Maximum()); +Power.setDefuzzifier(new Centroid(200)); +Power.setDefaultValue(Double.NaN); +Power.setLockPreviousValue(false); +Power.addTerm(new Triangle("LOW", 0.000, 0.250, 0.500)); +Power.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Power.addTerm(new Triangle("HIGH", 0.500, 0.750, 1.000)); +engine.addOutputVariable(Power); + +OutputVariable InversePower = new OutputVariable(); +InversePower.setName("InversePower"); +InversePower.setDescription(""); +InversePower.setEnabled(true); +InversePower.setRange(0.000, 1.000); +InversePower.setLockValueInRange(false); +InversePower.setAggregation(new Maximum()); +InversePower.setDefuzzifier(new Centroid(500)); +InversePower.setDefaultValue(Double.NaN); +InversePower.setLockPreviousValue(false); +InversePower.addTerm(new Cosine("LOW", 0.200, 0.500)); +InversePower.addTerm(new Cosine("MEDIUM", 0.500, 0.500)); +InversePower.addTerm(new Cosine("HIGH", 0.800, 0.500)); +engine.addOutputVariable(InversePower); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +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)); +ruleBlock.addRule(Rule.parse("if Power is LOW then InversePower is HIGH", engine)); +ruleBlock.addRule(Rule.parse("if Power is MEDIUM then InversePower is MEDIUM", engine)); +ruleBlock.addRule(Rule.parse("if Power is HIGH then InversePower is LOW", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/SimpleDimmerInverse.pdf b/examples/mamdani/SimpleDimmerInverse.pdf Binary files differnew file mode 100644 index 0000000..0cfb26d --- /dev/null +++ b/examples/mamdani/SimpleDimmerInverse.pdf diff --git a/examples/mamdani/octave/COPYING b/examples/mamdani/octave/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/examples/mamdani/octave/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/examples/mamdani/octave/DESCRIPTION b/examples/mamdani/octave/DESCRIPTION new file mode 100644 index 0000000..35df57d --- /dev/null +++ b/examples/mamdani/octave/DESCRIPTION @@ -0,0 +1,12 @@ +Name: fuzzy-logic-toolkit +Version: 0.4.2 +Date: 2012-10-02 +Author: L. Markowsky <lmarkov@users.sourceforge.net> +Maintainer: L. Markowsky <lmarkov@users.sourceforge.net> +Title: Octave Fuzzy Logic Toolkit +Description: A mostly MATLAB-compatible fuzzy logic toolkit for Octave. +Depends: octave (>= 3.2.4) +Autoload: no +License: GPLv3+ +Url: http://octave.sf.net + http://sf.net/projects/octave-fuzzy diff --git a/examples/mamdani/octave/investment_portfolio.R b/examples/mamdani/octave/investment_portfolio.R new file mode 100644 index 0000000..c752dab --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.R @@ -0,0 +1,67 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "investment_portfolio" +engine.fll = "Engine: investment_portfolio +InputVariable: Age + enabled: true + range: 20.000 100.000 + lock-range: false + term: Young ZShape 30.000 90.000 + term: Old SShape 30.000 90.000 +InputVariable: RiskTolerance + enabled: true + range: 0.000 10.000 + lock-range: false + term: Low ZShape 2.000 8.000 + term: High SShape 2.000 8.000 +OutputVariable: PercentageInStocks + enabled: true + range: 0.000 100.000 + lock-range: false + aggregation: EinsteinSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: AboutFifteen Gaussian 15.000 10.000 + term: AboutFifty Gaussian 50.000 10.000 + term: AboutEightyFive Gaussian 85.000 10.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: EinsteinSum + implication: EinsteinProduct + activation: General + rule: if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive + rule: if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen + rule: if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500 + rule: if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500" + +engine.fldFile = "investment_portfolio.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(Age, RiskTolerance)) + + geom_tile(aes(fill=PercentageInStocks)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Age, y=RiskTolerance, z=PercentageInStocks), color="black") + + ggtitle("(Age, RiskTolerance) = PercentageInStocks") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(RiskTolerance, Age)) + + geom_tile(aes(fill=PercentageInStocks)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=RiskTolerance, y=Age, z=PercentageInStocks), color="black") + + ggtitle("(RiskTolerance, Age) = PercentageInStocks") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/octave/investment_portfolio.cpp b/examples/mamdani/octave/investment_portfolio.cpp new file mode 100644 index 0000000..2b82b8c --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.cpp @@ -0,0 +1,62 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("investment_portfolio"); +engine->setDescription(""); + +InputVariable* Age = new InputVariable; +Age->setName("Age"); +Age->setDescription(""); +Age->setEnabled(true); +Age->setRange(20.000, 100.000); +Age->setLockValueInRange(false); +Age->addTerm(new ZShape("Young", 30.000, 90.000)); +Age->addTerm(new SShape("Old", 30.000, 90.000)); +engine->addInputVariable(Age); + +InputVariable* RiskTolerance = new InputVariable; +RiskTolerance->setName("RiskTolerance"); +RiskTolerance->setDescription(""); +RiskTolerance->setEnabled(true); +RiskTolerance->setRange(0.000, 10.000); +RiskTolerance->setLockValueInRange(false); +RiskTolerance->addTerm(new ZShape("Low", 2.000, 8.000)); +RiskTolerance->addTerm(new SShape("High", 2.000, 8.000)); +engine->addInputVariable(RiskTolerance); + +OutputVariable* PercentageInStocks = new OutputVariable; +PercentageInStocks->setName("PercentageInStocks"); +PercentageInStocks->setDescription(""); +PercentageInStocks->setEnabled(true); +PercentageInStocks->setRange(0.000, 100.000); +PercentageInStocks->setLockValueInRange(false); +PercentageInStocks->setAggregation(new EinsteinSum); +PercentageInStocks->setDefuzzifier(new Centroid(200)); +PercentageInStocks->setDefaultValue(fl::nan); +PercentageInStocks->setLockPreviousValue(false); +PercentageInStocks->addTerm(new Gaussian("AboutFifteen", 15.000, 10.000)); +PercentageInStocks->addTerm(new Gaussian("AboutFifty", 50.000, 10.000)); +PercentageInStocks->addTerm(new Gaussian("AboutEightyFive", 85.000, 10.000)); +engine->addOutputVariable(PercentageInStocks); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new EinsteinProduct); +ruleBlock->setDisjunction(new EinsteinSum); +ruleBlock->setImplication(new EinsteinProduct); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive", engine)); +ruleBlock->addRule(Rule::parse("if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen", engine)); +ruleBlock->addRule(Rule::parse("if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500", engine)); +ruleBlock->addRule(Rule::parse("if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/octave/investment_portfolio.fcl b/examples/mamdani/octave/investment_portfolio.fcl new file mode 100644 index 0000000..ec837a7 --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.fcl @@ -0,0 +1,46 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK investment_portfolio + +VAR_INPUT + Age: REAL; + RiskTolerance: REAL; +END_VAR + +VAR_OUTPUT + PercentageInStocks: REAL; +END_VAR + +FUZZIFY Age + RANGE := (20.000 .. 100.000); + TERM Young := ZShape 30.000 90.000; + TERM Old := SShape 30.000 90.000; +END_FUZZIFY + +FUZZIFY RiskTolerance + RANGE := (0.000 .. 10.000); + TERM Low := ZShape 2.000 8.000; + TERM High := SShape 2.000 8.000; +END_FUZZIFY + +DEFUZZIFY PercentageInStocks + RANGE := (0.000 .. 100.000); + TERM AboutFifteen := Gaussian 15.000 10.000; + TERM AboutFifty := Gaussian 50.000 10.000; + TERM AboutEightyFive := Gaussian 85.000 10.000; + METHOD : COG; + ACCU : ESUM; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : EPROD; + OR : ESUM; + ACT : EPROD; + RULE 1 : if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive + RULE 2 : if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen + RULE 3 : if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500 + RULE 4 : if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500 +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/octave/investment_portfolio.fis b/examples/mamdani/octave/investment_portfolio.fis new file mode 100644 index 0000000..b512a68 --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.fis @@ -0,0 +1,42 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='investment_portfolio' +Type='mamdani' +Version=6.0 +NumInputs=2 +NumOutputs=1 +NumRules=4 +AndMethod='einstein_product' +OrMethod='einstein_sum' +ImpMethod='einstein_product' +AggMethod='einstein_sum' +DefuzzMethod='centroid' + +[Input1] +Name='Age' +Range=[20.000 100.000] +NumMFs=2 +MF1='Young':'zmf',[30.000 90.000] +MF2='Old':'smf',[30.000 90.000] + +[Input2] +Name='RiskTolerance' +Range=[0.000 10.000] +NumMFs=2 +MF1='Low':'zmf',[2.000 8.000] +MF2='High':'smf',[2.000 8.000] + +[Output1] +Name='PercentageInStocks' +Range=[0.000 100.000] +NumMFs=3 +MF1='AboutFifteen':'gaussmf',[10.000 15.000] +MF2='AboutFifty':'gaussmf',[10.000 50.000] +MF3='AboutEightyFive':'gaussmf',[10.000 85.000] + +[Rules] +1.000 2.000 , 3.000 (1.000) : 2 +2.000 1.000 , 1.000 (1.000) : 2 +-2.300 -1.300 , 2.000 (0.500) : 1 +-1.300 -2.300 , 2.000 (0.500) : 1 diff --git a/examples/mamdani/octave/investment_portfolio.fld b/examples/mamdani/octave/investment_portfolio.fld new file mode 100644 index 0000000..4da9cb9 --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.fld @@ -0,0 +1,1025 @@ +Age RiskTolerance PercentageInStocks +20.000000000 0.000000000 50.000000000 +20.000000000 0.322580645 50.000000000 +20.000000000 0.645161290 50.000000000 +20.000000000 0.967741935 50.000000000 +20.000000000 1.290322581 50.000000000 +20.000000000 1.612903226 50.000000000 +20.000000000 1.935483871 50.000000000 +20.000000000 2.258064516 50.076648486 +20.000000000 2.580645161 50.390076379 +20.000000000 2.903225806 50.952326813 +20.000000000 3.225806452 51.774928323 +20.000000000 3.548387097 52.870980129 +20.000000000 3.870967742 54.250136129 +20.000000000 4.193548387 55.910060541 +20.000000000 4.516129032 57.823117640 +20.000000000 4.838709677 59.917996684 +20.000000000 5.161290323 62.043162940 +20.000000000 5.483870968 64.006621117 +20.000000000 5.806451613 65.820682078 +20.000000000 6.129032258 67.494976640 +20.000000000 6.451612903 69.013706618 +20.000000000 6.774193548 70.341645817 +20.000000000 7.096774194 71.431615962 +20.000000000 7.419354839 72.233442079 +20.000000000 7.741935484 72.703595829 +20.000000000 8.064516129 72.821314025 +20.000000000 8.387096774 72.821314025 +20.000000000 8.709677419 72.821314025 +20.000000000 9.032258065 72.821314025 +20.000000000 9.354838710 72.821314025 +20.000000000 9.677419355 72.821314025 +20.000000000 10.000000000 72.821314025 +22.580645161 0.000000000 50.000000000 +22.580645161 0.322580645 50.000000000 +22.580645161 0.645161290 50.000000000 +22.580645161 0.967741935 50.000000000 +22.580645161 1.290322581 50.000000000 +22.580645161 1.612903226 50.000000000 +22.580645161 1.935483871 50.000000000 +22.580645161 2.258064516 50.076648486 +22.580645161 2.580645161 50.390076379 +22.580645161 2.903225806 50.952326813 +22.580645161 3.225806452 51.774928323 +22.580645161 3.548387097 52.870980129 +22.580645161 3.870967742 54.250136129 +22.580645161 4.193548387 55.910060541 +22.580645161 4.516129032 57.823117640 +22.580645161 4.838709677 59.917996684 +22.580645161 5.161290323 62.043162940 +22.580645161 5.483870968 64.006621117 +22.580645161 5.806451613 65.820682078 +22.580645161 6.129032258 67.494976640 +22.580645161 6.451612903 69.013706618 +22.580645161 6.774193548 70.341645817 +22.580645161 7.096774194 71.431615962 +22.580645161 7.419354839 72.233442079 +22.580645161 7.741935484 72.703595829 +22.580645161 8.064516129 72.821314025 +22.580645161 8.387096774 72.821314025 +22.580645161 8.709677419 72.821314025 +22.580645161 9.032258065 72.821314025 +22.580645161 9.354838710 72.821314025 +22.580645161 9.677419355 72.821314025 +22.580645161 10.000000000 72.821314025 +25.161290323 0.000000000 50.000000000 +25.161290323 0.322580645 50.000000000 +25.161290323 0.645161290 50.000000000 +25.161290323 0.967741935 50.000000000 +25.161290323 1.290322581 50.000000000 +25.161290323 1.612903226 50.000000000 +25.161290323 1.935483871 50.000000000 +25.161290323 2.258064516 50.076648486 +25.161290323 2.580645161 50.390076379 +25.161290323 2.903225806 50.952326813 +25.161290323 3.225806452 51.774928323 +25.161290323 3.548387097 52.870980129 +25.161290323 3.870967742 54.250136129 +25.161290323 4.193548387 55.910060541 +25.161290323 4.516129032 57.823117640 +25.161290323 4.838709677 59.917996684 +25.161290323 5.161290323 62.043162940 +25.161290323 5.483870968 64.006621117 +25.161290323 5.806451613 65.820682078 +25.161290323 6.129032258 67.494976640 +25.161290323 6.451612903 69.013706618 +25.161290323 6.774193548 70.341645817 +25.161290323 7.096774194 71.431615962 +25.161290323 7.419354839 72.233442079 +25.161290323 7.741935484 72.703595829 +25.161290323 8.064516129 72.821314025 +25.161290323 8.387096774 72.821314025 +25.161290323 8.709677419 72.821314025 +25.161290323 9.032258065 72.821314025 +25.161290323 9.354838710 72.821314025 +25.161290323 9.677419355 72.821314025 +25.161290323 10.000000000 72.821314025 +27.741935484 0.000000000 50.000000000 +27.741935484 0.322580645 50.000000000 +27.741935484 0.645161290 50.000000000 +27.741935484 0.967741935 50.000000000 +27.741935484 1.290322581 50.000000000 +27.741935484 1.612903226 50.000000000 +27.741935484 1.935483871 50.000000000 +27.741935484 2.258064516 50.076648486 +27.741935484 2.580645161 50.390076379 +27.741935484 2.903225806 50.952326813 +27.741935484 3.225806452 51.774928323 +27.741935484 3.548387097 52.870980129 +27.741935484 3.870967742 54.250136129 +27.741935484 4.193548387 55.910060541 +27.741935484 4.516129032 57.823117640 +27.741935484 4.838709677 59.917996684 +27.741935484 5.161290323 62.043162940 +27.741935484 5.483870968 64.006621117 +27.741935484 5.806451613 65.820682078 +27.741935484 6.129032258 67.494976640 +27.741935484 6.451612903 69.013706618 +27.741935484 6.774193548 70.341645817 +27.741935484 7.096774194 71.431615962 +27.741935484 7.419354839 72.233442079 +27.741935484 7.741935484 72.703595829 +27.741935484 8.064516129 72.821314025 +27.741935484 8.387096774 72.821314025 +27.741935484 8.709677419 72.821314025 +27.741935484 9.032258065 72.821314025 +27.741935484 9.354838710 72.821314025 +27.741935484 9.677419355 72.821314025 +27.741935484 10.000000000 72.821314025 +30.322580645 0.000000000 49.998803919 +30.322580645 0.322580645 49.998803919 +30.322580645 0.645161290 49.998803919 +30.322580645 0.967741935 49.998803919 +30.322580645 1.290322581 49.998803919 +30.322580645 1.612903226 49.998803919 +30.322580645 1.935483871 49.998803919 +30.322580645 2.258064516 50.075452379 +30.322580645 2.580645161 50.388879647 +30.322580645 2.903225806 50.951126990 +30.322580645 3.225806452 51.773719919 +30.322580645 3.548387097 52.869753955 +30.322580645 3.870967742 54.248879432 +30.322580645 4.193548387 55.908758472 +30.322580645 4.516129032 57.821756837 +30.322580645 4.838709677 59.916571839 +30.322580645 5.161290323 62.041682326 +30.322580645 5.483870968 64.005085024 +30.322580645 5.806451613 65.819089933 +30.322580645 6.129032258 67.493329173 +30.322580645 6.451612903 69.012006089 +30.322580645 6.774193548 70.339896659 +30.322580645 7.096774194 71.429825333 +30.322580645 7.419354839 72.231620048 +30.322580645 7.741935484 72.701755036 +30.322580645 8.064516129 72.819468494 +30.322580645 8.387096774 72.819468494 +30.322580645 8.709677419 72.819468494 +30.322580645 9.032258065 72.819468494 +30.322580645 9.354838710 72.819468494 +30.322580645 9.677419355 72.819468494 +30.322580645 10.000000000 72.819468494 +32.903225806 0.000000000 49.902957979 +32.903225806 0.322580645 49.902957979 +32.903225806 0.645161290 49.902957979 +32.903225806 0.967741935 49.902957979 +32.903225806 1.290322581 49.902957979 +32.903225806 1.612903226 49.902957979 +32.903225806 1.935483871 49.902957979 +32.903225806 2.258064516 49.979607017 +32.903225806 2.580645161 50.292994821 +32.903225806 2.903225806 50.855013655 +32.903225806 3.225806452 51.676947279 +32.903225806 3.548387097 52.771596216 +32.903225806 3.870967742 54.148327846 +32.903225806 4.193548387 55.804640065 +32.903225806 4.516129032 57.713021387 +32.903225806 4.838709677 59.802814253 +32.903225806 5.161290323 61.923569792 +32.903225806 5.483870968 63.882614176 +32.903225806 5.806451613 65.692193202 +32.903225806 6.129032258 67.362058048 +32.903225806 6.451612903 68.876521949 +32.903225806 6.774193548 70.200548955 +32.903225806 7.096774194 71.287181858 +32.903225806 7.419354839 72.086480819 +32.903225806 7.741935484 72.555124481 +32.903225806 8.064516129 72.672461319 +32.903225806 8.387096774 72.672461319 +32.903225806 8.709677419 72.672461319 +32.903225806 9.032258065 72.672461319 +32.903225806 9.354838710 72.672461319 +32.903225806 9.677419355 72.672461319 +32.903225806 10.000000000 72.672461319 +35.483870968 0.000000000 49.652304243 +35.483870968 0.322580645 49.652304243 +35.483870968 0.645161290 49.652304243 +35.483870968 0.967741935 49.652304243 +35.483870968 1.290322581 49.652304243 +35.483870968 1.612903226 49.652304243 +35.483870968 1.935483871 49.652304243 +35.483870968 2.258064516 49.728978589 +35.483870968 2.580645161 50.042360495 +35.483870968 2.903225806 50.603956690 +35.483870968 3.225806452 51.424424786 +35.483870968 3.548387097 52.515806201 +35.483870968 3.870967742 53.886750889 +35.483870968 4.193548387 55.534360928 +35.483870968 4.516129032 57.431479038 +35.483870968 4.838709677 59.509129544 +35.483870968 5.161290323 61.619524277 +35.483870968 5.483870968 63.567960518 +35.483870968 5.806451613 65.366559879 +35.483870968 6.129032258 67.025427611 +35.483870968 6.451612903 68.529270750 +35.483870968 6.774193548 69.843520900 +35.483870968 7.096774194 70.921801863 +35.483870968 7.419354839 71.714759421 +35.483870968 7.741935484 72.179613221 +35.483870968 8.064516129 72.295992918 +35.483870968 8.387096774 72.295992918 +35.483870968 8.709677419 72.295992918 +35.483870968 9.032258065 72.295992918 +35.483870968 9.354838710 72.295992918 +35.483870968 9.677419355 72.295992918 +35.483870968 10.000000000 72.295992918 +38.064516129 0.000000000 49.243098952 +38.064516129 0.322580645 49.243098952 +38.064516129 0.645161290 49.243098952 +38.064516129 0.967741935 49.243098952 +38.064516129 1.290322581 49.243098952 +38.064516129 1.612903226 49.243098952 +38.064516129 1.935483871 49.243098952 +38.064516129 2.258064516 49.319884816 +38.064516129 2.580645161 49.633543934 +38.064516129 2.903225806 50.194964997 +38.064516129 3.225806452 51.013799907 +38.064516129 3.548387097 52.100885441 +38.064516129 3.870967742 53.463764454 +38.064516129 4.193548387 55.098988836 +38.064516129 4.516129032 56.980073530 +38.064516129 4.838709677 59.040771242 +38.064516129 5.161290323 61.137226881 +38.064516129 5.483870968 63.070642355 +38.064516129 5.806451613 64.853053568 +38.064516129 6.129032258 66.495347777 +38.064516129 6.451612903 67.982967596 +38.064516129 6.774193548 69.282183577 +38.064516129 7.096774194 70.347560475 +38.064516129 7.419354839 71.130729588 +38.064516129 7.741935484 71.589715449 +38.064516129 8.064516129 71.704613000 +38.064516129 8.387096774 71.704613000 +38.064516129 8.709677419 71.704613000 +38.064516129 9.032258065 71.704613000 +38.064516129 9.354838710 71.704613000 +38.064516129 9.677419355 71.704613000 +38.064516129 10.000000000 71.704613000 +40.645161290 0.000000000 48.669743020 +40.645161290 0.322580645 48.669743020 +40.645161290 0.645161290 48.669743020 +40.645161290 0.967741935 48.669743020 +40.645161290 1.290322581 48.669743020 +40.645161290 1.612903226 48.669743020 +40.645161290 1.935483871 48.669743020 +40.645161290 2.258064516 48.746819724 +40.645161290 2.580645161 49.061416258 +40.645161290 2.903225806 49.623573900 +40.645161290 3.225806452 50.441561774 +40.645161290 3.548387097 51.524588313 +40.645161290 3.870967742 52.878759776 +40.645161290 4.193548387 54.500031239 +40.645161290 4.516129032 56.363029835 +40.645161290 4.838709677 58.405298469 +40.645161290 5.161290323 60.487754513 +40.645161290 5.483870968 62.404445671 +40.645161290 5.806451613 64.167465175 +40.645161290 6.129032258 65.789133360 +40.645161290 6.451612903 67.256143706 +40.645161290 6.774193548 68.536047010 +40.645161290 7.096774194 69.584753827 +40.645161290 7.419354839 70.355212405 +40.645161290 7.741935484 70.806584970 +40.645161290 8.064516129 70.919555525 +40.645161290 8.387096774 70.919555525 +40.645161290 8.709677419 70.919555525 +40.645161290 9.032258065 70.919555525 +40.645161290 9.354838710 70.919555525 +40.645161290 9.677419355 70.919555525 +40.645161290 10.000000000 70.919555525 +43.225806452 0.000000000 47.925533624 +43.225806452 0.322580645 47.925533624 +43.225806452 0.645161290 47.925533624 +43.225806452 0.967741935 47.925533624 +43.225806452 1.290322581 47.925533624 +43.225806452 1.612903226 47.925533624 +43.225806452 1.935483871 47.925533624 +43.225806452 2.258064516 48.003196119 +43.225806452 2.580645161 48.319856471 +43.225806452 2.903225806 48.884475705 +43.225806452 3.225806452 49.703554418 +43.225806452 3.548387097 50.784261421 +43.225806452 3.870967742 52.130995284 +43.225806452 4.193548387 53.739185104 +43.225806452 4.516129032 55.585152066 +43.225806452 4.838709677 57.611329633 +43.225806452 5.161290323 59.683821844 +43.225806452 5.483870968 61.585369310 +43.225806452 5.806451613 63.328281417 +43.225806452 6.129032258 64.927182028 +43.225806452 6.451612903 66.370699474 +43.225806452 6.774193548 67.628203974 +43.225806452 7.096774194 68.657390741 +43.225806452 7.419354839 69.412890949 +43.225806452 7.741935484 69.855269182 +43.225806452 8.064516129 69.965961562 +43.225806452 8.387096774 69.965961562 +43.225806452 8.709677419 69.965961562 +43.225806452 9.032258065 69.965961562 +43.225806452 9.354838710 69.965961562 +43.225806452 9.677419355 69.965961562 +43.225806452 10.000000000 69.965961562 +45.806451613 0.000000000 47.003934865 +45.806451613 0.322580645 47.003934865 +45.806451613 0.645161290 47.003934865 +45.806451613 0.967741935 47.003934865 +45.806451613 1.290322581 47.003934865 +45.806451613 1.612903226 47.003934865 +45.806451613 1.935483871 47.003934865 +45.806451613 2.258064516 47.082602480 +45.806451613 2.580645161 47.402950274 +45.806451613 2.903225806 47.972607613 +45.806451613 3.225806452 48.795888161 +45.806451613 3.548387097 49.877495327 +45.806451613 3.870967742 51.219883421 +45.806451613 4.193548387 52.818130271 +45.806451613 4.516129032 54.650985755 +45.806451613 4.838709677 56.666980792 +45.806451613 5.161290323 58.737589822 +45.806451613 5.483870968 60.629114424 +45.806451613 5.806451613 62.354014142 +45.806451613 6.129032258 63.930194608 +45.806451613 6.451612903 65.349040002 +45.806451613 6.774193548 66.582379353 +45.806451613 7.096774194 67.590187304 +45.806451613 7.419354839 68.329162947 +45.806451613 7.741935484 68.761558609 +45.806451613 8.064516129 68.869717097 +45.806451613 8.387096774 68.869717097 +45.806451613 8.709677419 68.869717097 +45.806451613 9.032258065 68.869717097 +45.806451613 9.354838710 68.869717097 +45.806451613 9.677419355 68.869717097 +45.806451613 10.000000000 68.869717097 +48.387096774 0.000000000 45.900598613 +48.387096774 0.322580645 45.900598613 +48.387096774 0.645161290 45.900598613 +48.387096774 0.967741935 45.900598613 +48.387096774 1.290322581 45.900598613 +48.387096774 1.612903226 45.900598613 +48.387096774 1.935483871 45.900598613 +48.387096774 2.258064516 45.980803355 +48.387096774 2.580645161 46.306905089 +48.387096774 2.903225806 46.884906961 +48.387096774 3.225806452 47.716447362 +48.387096774 3.548387097 48.803279055 +48.387096774 3.870967742 50.145663256 +48.387096774 4.193548387 51.738567788 +48.387096774 4.516129032 53.564064802 +48.387096774 4.838709677 55.578226605 +48.387096774 5.161290323 57.658283364 +48.387096774 5.483870968 59.548370180 +48.387096774 5.806451613 61.260362735 +48.387096774 6.129032258 62.816285423 +48.387096774 6.451612903 64.211142848 +48.387096774 6.774193548 65.419944811 +48.387096774 7.096774194 66.405514442 +48.387096774 7.419354839 67.127059853 +48.387096774 7.741935484 67.548845082 +48.387096774 8.064516129 67.654301037 +48.387096774 8.387096774 67.654301037 +48.387096774 8.709677419 67.654301037 +48.387096774 9.032258065 67.654301037 +48.387096774 9.354838710 67.654301037 +48.387096774 9.677419355 67.654301037 +48.387096774 10.000000000 67.654301037 +50.967741935 0.000000000 44.616415770 +50.967741935 0.322580645 44.616415770 +50.967741935 0.645161290 44.616415770 +50.967741935 0.967741935 44.616415770 +50.967741935 1.290322581 44.616415770 +50.967741935 1.612903226 44.616415770 +50.967741935 1.935483871 44.616415770 +50.967741935 2.258064516 44.698760304 +50.967741935 2.580645161 45.032946883 +50.967741935 2.903225806 45.622985345 +50.967741935 3.225806452 46.467238467 +50.967741935 3.548387097 47.563910116 +50.967741935 3.870967742 48.910743445 +50.967741935 4.193548387 50.502840212 +50.967741935 4.516129032 52.326633965 +50.967741935 4.838709677 54.347588260 +50.967741935 5.161290323 56.449954685 +50.967741935 5.483870968 58.350161475 +50.967741935 5.806451613 60.057440330 +50.967741935 6.129032258 61.598198804 +50.967741935 6.451612903 62.971785017 +50.967741935 6.774193548 64.157141145 +50.967741935 7.096774194 65.120596669 +50.967741935 7.419354839 65.824409419 +50.967741935 7.741935484 66.235264649 +50.967741935 8.064516129 66.337921286 +50.967741935 8.387096774 66.337921286 +50.967741935 8.709677419 66.337921286 +50.967741935 9.032258065 66.337921286 +50.967741935 9.354838710 66.337921286 +50.967741935 9.677419355 66.337921286 +50.967741935 10.000000000 66.337921286 +53.548387097 0.000000000 43.161863967 +53.548387097 0.322580645 43.161863967 +53.548387097 0.645161290 43.161863967 +53.548387097 0.967741935 43.161863967 +53.548387097 1.290322581 43.161863967 +53.548387097 1.612903226 43.161863967 +53.548387097 1.935483871 43.161863967 +53.548387097 2.258064516 43.246935669 +53.548387097 2.580645161 43.591449152 +53.548387097 2.903225806 44.196962107 +53.548387097 3.225806452 45.057826729 +53.548387097 3.548387097 46.167949378 +53.548387097 3.870967742 47.522086534 +53.548387097 4.193548387 49.115617384 +53.548387097 4.516129032 50.940434962 +53.548387097 4.838709677 52.973755088 +53.548387097 5.161290323 55.109848682 +53.548387097 5.483870968 57.033537819 +53.548387097 5.806451613 58.747231415 +53.548387097 6.129032258 60.280747236 +53.548387097 6.451612903 61.638028848 +53.548387097 6.774193548 62.802609961 +53.548387097 7.096774194 63.745066439 +53.548387097 7.419354839 64.431393253 +53.548387097 7.741935484 64.831240735 +53.548387097 8.064516129 64.931066230 +53.548387097 8.387096774 64.931066230 +53.548387097 8.709677419 64.931066230 +53.548387097 9.032258065 64.931066230 +53.548387097 9.354838710 64.931066230 +53.548387097 9.677419355 64.931066230 +53.548387097 10.000000000 64.931066230 +56.129032258 0.000000000 41.562757424 +56.129032258 0.322580645 41.562757424 +56.129032258 0.645161290 41.562757424 +56.129032258 0.967741935 41.562757424 +56.129032258 1.290322581 41.562757424 +56.129032258 1.612903226 41.562757424 +56.129032258 1.935483871 41.562757424 +56.129032258 2.258064516 41.650983104 +56.129032258 2.580645161 42.007394877 +56.129032258 2.903225806 42.630567878 +56.129032258 3.225806452 43.510014838 +56.129032258 3.548387097 44.634466681 +56.129032258 3.870967742 45.995029495 +56.129032258 4.193548387 47.587232438 +56.129032258 4.516129032 49.409320054 +56.129032258 4.838709677 51.452965804 +56.129032258 5.161290323 53.627995525 +56.129032258 5.483870968 55.587931245 +56.129032258 5.806451613 57.321397482 +56.129032258 6.129032258 58.858477926 +56.129032258 6.451612903 60.206932126 +56.129032258 6.774193548 61.355194390 +56.129032258 7.096774194 62.278842892 +56.129032258 7.419354839 62.948475434 +56.129032258 7.741935484 63.337473295 +56.129032258 8.064516129 63.434463522 +56.129032258 8.387096774 63.434463522 +56.129032258 8.709677419 63.434463522 +56.129032258 9.032258065 63.434463522 +56.129032258 9.354838710 63.434463522 +56.129032258 9.677419355 63.434463522 +56.129032258 10.000000000 63.434463522 +58.709677419 0.000000000 39.867082291 +58.709677419 0.322580645 39.867082291 +58.709677419 0.645161290 39.867082291 +58.709677419 0.967741935 39.867082291 +58.709677419 1.290322581 39.867082291 +58.709677419 1.612903226 39.867082291 +58.709677419 1.935483871 39.867082291 +58.709677419 2.258064516 39.958513244 +58.709677419 2.580645161 40.326884614 +58.709677419 2.903225806 40.967289350 +58.709677419 3.225806452 41.863642692 +58.709677419 3.548387097 42.998628756 +58.709677419 3.870967742 44.358835965 +58.709677419 4.193548387 45.939269950 +58.709677419 4.516129032 47.744614100 +58.709677419 4.838709677 49.783268810 +58.709677419 5.161290323 51.988970730 +58.709677419 5.483870968 53.992678480 +58.709677419 5.806451613 55.759559804 +58.709677419 6.129032258 57.313492323 +58.709677419 6.451612903 58.663327822 +58.709677419 6.774193548 59.801844372 +58.709677419 7.096774194 60.710189164 +58.709677419 7.419354839 61.364580282 +58.709677419 7.741935484 61.743138699 +58.709677419 8.064516129 61.837345788 +58.709677419 8.387096774 61.837345788 +58.709677419 8.709677419 61.837345788 +58.709677419 9.032258065 61.837345788 +58.709677419 9.354838710 61.837345788 +58.709677419 9.677419355 61.837345788 +58.709677419 10.000000000 61.837345788 +61.290322581 0.000000000 38.162654212 +61.290322581 0.322580645 38.162654212 +61.290322581 0.645161290 38.162654212 +61.290322581 0.967741935 38.162654212 +61.290322581 1.290322581 38.162654212 +61.290322581 1.612903226 38.162654212 +61.290322581 1.935483871 38.162654212 +61.290322581 2.258064516 38.256861301 +61.290322581 2.580645161 38.635419718 +61.290322581 2.903225806 39.289810836 +61.290322581 3.225806452 40.198155628 +61.290322581 3.548387097 41.336672178 +61.290322581 3.870967742 42.686507677 +61.290322581 4.193548387 44.240440196 +61.290322581 4.516129032 46.007321520 +61.290322581 4.838709677 48.011029270 +61.290322581 5.161290323 50.216731190 +61.290322581 5.483870968 52.255385900 +61.290322581 5.806451613 54.060730050 +61.290322581 6.129032258 55.641164035 +61.290322581 6.451612903 57.001371244 +61.290322581 6.774193548 58.136357308 +61.290322581 7.096774194 59.032710650 +61.290322581 7.419354839 59.673115386 +61.290322581 7.741935484 60.041486756 +61.290322581 8.064516129 60.132917709 +61.290322581 8.387096774 60.132917709 +61.290322581 8.709677419 60.132917709 +61.290322581 9.032258065 60.132917709 +61.290322581 9.354838710 60.132917709 +61.290322581 9.677419355 60.132917709 +61.290322581 10.000000000 60.132917709 +63.870967742 0.000000000 36.565536478 +63.870967742 0.322580645 36.565536478 +63.870967742 0.645161290 36.565536478 +63.870967742 0.967741935 36.565536478 +63.870967742 1.290322581 36.565536478 +63.870967742 1.612903226 36.565536478 +63.870967742 1.935483871 36.565536478 +63.870967742 2.258064516 36.662526705 +63.870967742 2.580645161 37.051524566 +63.870967742 2.903225806 37.721157108 +63.870967742 3.225806452 38.644805610 +63.870967742 3.548387097 39.793067874 +63.870967742 3.870967742 41.141522074 +63.870967742 4.193548387 42.678602518 +63.870967742 4.516129032 44.412068755 +63.870967742 4.838709677 46.372004475 +63.870967742 5.161290323 48.547034196 +63.870967742 5.483870968 50.590679946 +63.870967742 5.806451613 52.412767562 +63.870967742 6.129032258 54.004970505 +63.870967742 6.451612903 55.365533319 +63.870967742 6.774193548 56.489985162 +63.870967742 7.096774194 57.369432122 +63.870967742 7.419354839 57.992605123 +63.870967742 7.741935484 58.349016896 +63.870967742 8.064516129 58.437242576 +63.870967742 8.387096774 58.437242576 +63.870967742 8.709677419 58.437242576 +63.870967742 9.032258065 58.437242576 +63.870967742 9.354838710 58.437242576 +63.870967742 9.677419355 58.437242576 +63.870967742 10.000000000 58.437242576 +66.451612903 0.000000000 35.068933770 +66.451612903 0.322580645 35.068933770 +66.451612903 0.645161290 35.068933770 +66.451612903 0.967741935 35.068933770 +66.451612903 1.290322581 35.068933770 +66.451612903 1.612903226 35.068933770 +66.451612903 1.935483871 35.068933770 +66.451612903 2.258064516 35.168759265 +66.451612903 2.580645161 35.568606747 +66.451612903 2.903225806 36.254933561 +66.451612903 3.225806452 37.197390039 +66.451612903 3.548387097 38.361971152 +66.451612903 3.870967742 39.719252764 +66.451612903 4.193548387 41.252768585 +66.451612903 4.516129032 42.966462181 +66.451612903 4.838709677 44.890151318 +66.451612903 5.161290323 47.026244912 +66.451612903 5.483870968 49.059565038 +66.451612903 5.806451613 50.884382616 +66.451612903 6.129032258 52.477913466 +66.451612903 6.451612903 53.832050622 +66.451612903 6.774193548 54.942173271 +66.451612903 7.096774194 55.803037893 +66.451612903 7.419354839 56.408550848 +66.451612903 7.741935484 56.753064331 +66.451612903 8.064516129 56.838136033 +66.451612903 8.387096774 56.838136033 +66.451612903 8.709677419 56.838136033 +66.451612903 9.032258065 56.838136033 +66.451612903 9.354838710 56.838136033 +66.451612903 9.677419355 56.838136033 +66.451612903 10.000000000 56.838136033 +69.032258065 0.000000000 33.662078714 +69.032258065 0.322580645 33.662078714 +69.032258065 0.645161290 33.662078714 +69.032258065 0.967741935 33.662078714 +69.032258065 1.290322581 33.662078714 +69.032258065 1.612903226 33.662078714 +69.032258065 1.935483871 33.662078714 +69.032258065 2.258064516 33.764735351 +69.032258065 2.580645161 34.175590581 +69.032258065 2.903225806 34.879403331 +69.032258065 3.225806452 35.842858855 +69.032258065 3.548387097 37.028214983 +69.032258065 3.870967742 38.401801196 +69.032258065 4.193548387 39.942559670 +69.032258065 4.516129032 41.649838525 +69.032258065 4.838709677 43.550045315 +69.032258065 5.161290323 45.652411740 +69.032258065 5.483870968 47.673366035 +69.032258065 5.806451613 49.497159788 +69.032258065 6.129032258 51.089256555 +69.032258065 6.451612903 52.436089884 +69.032258065 6.774193548 53.532761533 +69.032258065 7.096774194 54.377014655 +69.032258065 7.419354839 54.967053117 +69.032258065 7.741935484 55.301239696 +69.032258065 8.064516129 55.383584230 +69.032258065 8.387096774 55.383584230 +69.032258065 8.709677419 55.383584230 +69.032258065 9.032258065 55.383584230 +69.032258065 9.354838710 55.383584230 +69.032258065 9.677419355 55.383584230 +69.032258065 10.000000000 55.383584230 +71.612903226 0.000000000 32.345698963 +71.612903226 0.322580645 32.345698963 +71.612903226 0.645161290 32.345698963 +71.612903226 0.967741935 32.345698963 +71.612903226 1.290322581 32.345698963 +71.612903226 1.612903226 32.345698963 +71.612903226 1.935483871 32.345698963 +71.612903226 2.258064516 32.451154918 +71.612903226 2.580645161 32.872940147 +71.612903226 2.903225806 33.594485558 +71.612903226 3.225806452 34.580055189 +71.612903226 3.548387097 35.788857152 +71.612903226 3.870967742 37.183714577 +71.612903226 4.193548387 38.739637265 +71.612903226 4.516129032 40.451629820 +71.612903226 4.838709677 42.341716636 +71.612903226 5.161290323 44.421773395 +71.612903226 5.483870968 46.435935198 +71.612903226 5.806451613 48.261432212 +71.612903226 6.129032258 49.854336744 +71.612903226 6.451612903 51.196720945 +71.612903226 6.774193548 52.283552638 +71.612903226 7.096774194 53.115093039 +71.612903226 7.419354839 53.693094911 +71.612903226 7.741935484 54.019196645 +71.612903226 8.064516129 54.099401387 +71.612903226 8.387096774 54.099401387 +71.612903226 8.709677419 54.099401387 +71.612903226 9.032258065 54.099401387 +71.612903226 9.354838710 54.099401387 +71.612903226 9.677419355 54.099401387 +71.612903226 10.000000000 54.099401387 +74.193548387 0.000000000 31.130282903 +74.193548387 0.322580645 31.130282903 +74.193548387 0.645161290 31.130282903 +74.193548387 0.967741935 31.130282903 +74.193548387 1.290322581 31.130282903 +74.193548387 1.612903226 31.130282903 +74.193548387 1.935483871 31.130282903 +74.193548387 2.258064516 31.238441391 +74.193548387 2.580645161 31.670837053 +74.193548387 2.903225806 32.409812696 +74.193548387 3.225806452 33.417620647 +74.193548387 3.548387097 34.650959998 +74.193548387 3.870967742 36.069805392 +74.193548387 4.193548387 37.645985858 +74.193548387 4.516129032 39.370885576 +74.193548387 4.838709677 41.262410178 +74.193548387 5.161290323 43.333019208 +74.193548387 5.483870968 45.349014245 +74.193548387 5.806451613 47.181869729 +74.193548387 6.129032258 48.780116579 +74.193548387 6.451612903 50.122504673 +74.193548387 6.774193548 51.204111839 +74.193548387 7.096774194 52.027392387 +74.193548387 7.419354839 52.597049726 +74.193548387 7.741935484 52.917397520 +74.193548387 8.064516129 52.996065135 +74.193548387 8.387096774 52.996065135 +74.193548387 8.709677419 52.996065135 +74.193548387 9.032258065 52.996065135 +74.193548387 9.354838710 52.996065135 +74.193548387 9.677419355 52.996065135 +74.193548387 10.000000000 52.996065135 +76.774193548 0.000000000 30.034038438 +76.774193548 0.322580645 30.034038438 +76.774193548 0.645161290 30.034038438 +76.774193548 0.967741935 30.034038438 +76.774193548 1.290322581 30.034038438 +76.774193548 1.612903226 30.034038438 +76.774193548 1.935483871 30.034038438 +76.774193548 2.258064516 30.144730818 +76.774193548 2.580645161 30.587109051 +76.774193548 2.903225806 31.342609259 +76.774193548 3.225806452 32.371796026 +76.774193548 3.548387097 33.629300526 +76.774193548 3.870967742 35.072817972 +76.774193548 4.193548387 36.671718583 +76.774193548 4.516129032 38.414630690 +76.774193548 4.838709677 40.316178156 +76.774193548 5.161290323 42.388670367 +76.774193548 5.483870968 44.414847934 +76.774193548 5.806451613 46.260814896 +76.774193548 6.129032258 47.869004716 +76.774193548 6.451612903 49.215738579 +76.774193548 6.774193548 50.296445582 +76.774193548 7.096774194 51.115524295 +76.774193548 7.419354839 51.680143529 +76.774193548 7.741935484 51.996803881 +76.774193548 8.064516129 52.074466376 +76.774193548 8.387096774 52.074466376 +76.774193548 8.709677419 52.074466376 +76.774193548 9.032258065 52.074466376 +76.774193548 9.354838710 52.074466376 +76.774193548 9.677419355 52.074466376 +76.774193548 10.000000000 52.074466376 +79.354838710 0.000000000 29.080444475 +79.354838710 0.322580645 29.080444475 +79.354838710 0.645161290 29.080444475 +79.354838710 0.967741935 29.080444475 +79.354838710 1.290322581 29.080444475 +79.354838710 1.612903226 29.080444475 +79.354838710 1.935483871 29.080444475 +79.354838710 2.258064516 29.193415030 +79.354838710 2.580645161 29.644787595 +79.354838710 2.903225806 30.415246173 +79.354838710 3.225806452 31.463952990 +79.354838710 3.548387097 32.743856294 +79.354838710 3.870967742 34.210866640 +79.354838710 4.193548387 35.832534825 +79.354838710 4.516129032 37.595554329 +79.354838710 4.838709677 39.512245487 +79.354838710 5.161290323 41.594701531 +79.354838710 5.483870968 43.636970165 +79.354838710 5.806451613 45.499968761 +79.354838710 6.129032258 47.121240224 +79.354838710 6.451612903 48.475411687 +79.354838710 6.774193548 49.558438226 +79.354838710 7.096774194 50.376426100 +79.354838710 7.419354839 50.938583742 +79.354838710 7.741935484 51.253180276 +79.354838710 8.064516129 51.330256980 +79.354838710 8.387096774 51.330256980 +79.354838710 8.709677419 51.330256980 +79.354838710 9.032258065 51.330256980 +79.354838710 9.354838710 51.330256980 +79.354838710 9.677419355 51.330256980 +79.354838710 10.000000000 51.330256980 +81.935483871 0.000000000 28.295387000 +81.935483871 0.322580645 28.295387000 +81.935483871 0.645161290 28.295387000 +81.935483871 0.967741935 28.295387000 +81.935483871 1.290322581 28.295387000 +81.935483871 1.612903226 28.295387000 +81.935483871 1.935483871 28.295387000 +81.935483871 2.258064516 28.410284551 +81.935483871 2.580645161 28.869270412 +81.935483871 2.903225806 29.652439525 +81.935483871 3.225806452 30.717816423 +81.935483871 3.548387097 32.017032404 +81.935483871 3.870967742 33.504652223 +81.935483871 4.193548387 35.146946432 +81.935483871 4.516129032 36.929357645 +81.935483871 4.838709677 38.862773119 +81.935483871 5.161290323 40.959228758 +81.935483871 5.483870968 43.019926470 +81.935483871 5.806451613 44.901011164 +81.935483871 6.129032258 46.536235546 +81.935483871 6.451612903 47.899114559 +81.935483871 6.774193548 48.986200093 +81.935483871 7.096774194 49.805035003 +81.935483871 7.419354839 50.366456066 +81.935483871 7.741935484 50.680115184 +81.935483871 8.064516129 50.756901048 +81.935483871 8.387096774 50.756901048 +81.935483871 8.709677419 50.756901048 +81.935483871 9.032258065 50.756901048 +81.935483871 9.354838710 50.756901048 +81.935483871 9.677419355 50.756901048 +81.935483871 10.000000000 50.756901048 +84.516129032 0.000000000 27.704007082 +84.516129032 0.322580645 27.704007082 +84.516129032 0.645161290 27.704007082 +84.516129032 0.967741935 27.704007082 +84.516129032 1.290322581 27.704007082 +84.516129032 1.612903226 27.704007082 +84.516129032 1.935483871 27.704007082 +84.516129032 2.258064516 27.820386779 +84.516129032 2.580645161 28.285240579 +84.516129032 2.903225806 29.078198137 +84.516129032 3.225806452 30.156479100 +84.516129032 3.548387097 31.470729250 +84.516129032 3.870967742 32.974572389 +84.516129032 4.193548387 34.633440121 +84.516129032 4.516129032 36.432039482 +84.516129032 4.838709677 38.380475723 +84.516129032 5.161290323 40.490870456 +84.516129032 5.483870968 42.568520962 +84.516129032 5.806451613 44.465639072 +84.516129032 6.129032258 46.113249111 +84.516129032 6.451612903 47.484193799 +84.516129032 6.774193548 48.575575214 +84.516129032 7.096774194 49.396043310 +84.516129032 7.419354839 49.957639505 +84.516129032 7.741935484 50.271021411 +84.516129032 8.064516129 50.347695757 +84.516129032 8.387096774 50.347695757 +84.516129032 8.709677419 50.347695757 +84.516129032 9.032258065 50.347695757 +84.516129032 9.354838710 50.347695757 +84.516129032 9.677419355 50.347695757 +84.516129032 10.000000000 50.347695757 +87.096774194 0.000000000 27.327538681 +87.096774194 0.322580645 27.327538681 +87.096774194 0.645161290 27.327538681 +87.096774194 0.967741935 27.327538681 +87.096774194 1.290322581 27.327538681 +87.096774194 1.612903226 27.327538681 +87.096774194 1.935483871 27.327538681 +87.096774194 2.258064516 27.444875519 +87.096774194 2.580645161 27.913519181 +87.096774194 2.903225806 28.712818142 +87.096774194 3.225806452 29.799451045 +87.096774194 3.548387097 31.123478051 +87.096774194 3.870967742 32.637941952 +87.096774194 4.193548387 34.307806798 +87.096774194 4.516129032 36.117385824 +87.096774194 4.838709677 38.076430208 +87.096774194 5.161290323 40.197185747 +87.096774194 5.483870968 42.286978613 +87.096774194 5.806451613 44.195359935 +87.096774194 6.129032258 45.851672154 +87.096774194 6.451612903 47.228403784 +87.096774194 6.774193548 48.323052721 +87.096774194 7.096774194 49.144986345 +87.096774194 7.419354839 49.707005179 +87.096774194 7.741935484 50.020392983 +87.096774194 8.064516129 50.097042021 +87.096774194 8.387096774 50.097042021 +87.096774194 8.709677419 50.097042021 +87.096774194 9.032258065 50.097042021 +87.096774194 9.354838710 50.097042021 +87.096774194 9.677419355 50.097042021 +87.096774194 10.000000000 50.097042021 +89.677419355 0.000000000 27.180531506 +89.677419355 0.322580645 27.180531506 +89.677419355 0.645161290 27.180531506 +89.677419355 0.967741935 27.180531506 +89.677419355 1.290322581 27.180531506 +89.677419355 1.612903226 27.180531506 +89.677419355 1.935483871 27.180531506 +89.677419355 2.258064516 27.298244964 +89.677419355 2.580645161 27.768379952 +89.677419355 2.903225806 28.570174667 +89.677419355 3.225806452 29.660103341 +89.677419355 3.548387097 30.987993911 +89.677419355 3.870967742 32.506670827 +89.677419355 4.193548387 34.180910067 +89.677419355 4.516129032 35.994914976 +89.677419355 4.838709677 37.958317674 +89.677419355 5.161290323 40.083428161 +89.677419355 5.483870968 42.178243163 +89.677419355 5.806451613 44.091241528 +89.677419355 6.129032258 45.751120568 +89.677419355 6.451612903 47.130246045 +89.677419355 6.774193548 48.226280081 +89.677419355 7.096774194 49.048873010 +89.677419355 7.419354839 49.611120353 +89.677419355 7.741935484 49.924547621 +89.677419355 8.064516129 50.001196081 +89.677419355 8.387096774 50.001196081 +89.677419355 8.709677419 50.001196081 +89.677419355 9.032258065 50.001196081 +89.677419355 9.354838710 50.001196081 +89.677419355 9.677419355 50.001196081 +89.677419355 10.000000000 50.001196081 +92.258064516 0.000000000 27.178685975 +92.258064516 0.322580645 27.178685975 +92.258064516 0.645161290 27.178685975 +92.258064516 0.967741935 27.178685975 +92.258064516 1.290322581 27.178685975 +92.258064516 1.612903226 27.178685975 +92.258064516 1.935483871 27.178685975 +92.258064516 2.258064516 27.296404171 +92.258064516 2.580645161 27.766557921 +92.258064516 2.903225806 28.568384038 +92.258064516 3.225806452 29.658354183 +92.258064516 3.548387097 30.986293382 +92.258064516 3.870967742 32.505023360 +92.258064516 4.193548387 34.179317922 +92.258064516 4.516129032 35.993378883 +92.258064516 4.838709677 37.956837060 +92.258064516 5.161290323 40.082003316 +92.258064516 5.483870968 42.176882360 +92.258064516 5.806451613 44.089939459 +92.258064516 6.129032258 45.749863871 +92.258064516 6.451612903 47.129019871 +92.258064516 6.774193548 48.225071677 +92.258064516 7.096774194 49.047673187 +92.258064516 7.419354839 49.609923621 +92.258064516 7.741935484 49.923351514 +92.258064516 8.064516129 50.000000000 +92.258064516 8.387096774 50.000000000 +92.258064516 8.709677419 50.000000000 +92.258064516 9.032258065 50.000000000 +92.258064516 9.354838710 50.000000000 +92.258064516 9.677419355 50.000000000 +92.258064516 10.000000000 50.000000000 +94.838709677 0.000000000 27.178685975 +94.838709677 0.322580645 27.178685975 +94.838709677 0.645161290 27.178685975 +94.838709677 0.967741935 27.178685975 +94.838709677 1.290322581 27.178685975 +94.838709677 1.612903226 27.178685975 +94.838709677 1.935483871 27.178685975 +94.838709677 2.258064516 27.296404171 +94.838709677 2.580645161 27.766557921 +94.838709677 2.903225806 28.568384038 +94.838709677 3.225806452 29.658354183 +94.838709677 3.548387097 30.986293382 +94.838709677 3.870967742 32.505023360 +94.838709677 4.193548387 34.179317922 +94.838709677 4.516129032 35.993378883 +94.838709677 4.838709677 37.956837060 +94.838709677 5.161290323 40.082003316 +94.838709677 5.483870968 42.176882360 +94.838709677 5.806451613 44.089939459 +94.838709677 6.129032258 45.749863871 +94.838709677 6.451612903 47.129019871 +94.838709677 6.774193548 48.225071677 +94.838709677 7.096774194 49.047673187 +94.838709677 7.419354839 49.609923621 +94.838709677 7.741935484 49.923351514 +94.838709677 8.064516129 50.000000000 +94.838709677 8.387096774 50.000000000 +94.838709677 8.709677419 50.000000000 +94.838709677 9.032258065 50.000000000 +94.838709677 9.354838710 50.000000000 +94.838709677 9.677419355 50.000000000 +94.838709677 10.000000000 50.000000000 +97.419354839 0.000000000 27.178685975 +97.419354839 0.322580645 27.178685975 +97.419354839 0.645161290 27.178685975 +97.419354839 0.967741935 27.178685975 +97.419354839 1.290322581 27.178685975 +97.419354839 1.612903226 27.178685975 +97.419354839 1.935483871 27.178685975 +97.419354839 2.258064516 27.296404171 +97.419354839 2.580645161 27.766557921 +97.419354839 2.903225806 28.568384038 +97.419354839 3.225806452 29.658354183 +97.419354839 3.548387097 30.986293382 +97.419354839 3.870967742 32.505023360 +97.419354839 4.193548387 34.179317922 +97.419354839 4.516129032 35.993378883 +97.419354839 4.838709677 37.956837060 +97.419354839 5.161290323 40.082003316 +97.419354839 5.483870968 42.176882360 +97.419354839 5.806451613 44.089939459 +97.419354839 6.129032258 45.749863871 +97.419354839 6.451612903 47.129019871 +97.419354839 6.774193548 48.225071677 +97.419354839 7.096774194 49.047673187 +97.419354839 7.419354839 49.609923621 +97.419354839 7.741935484 49.923351514 +97.419354839 8.064516129 50.000000000 +97.419354839 8.387096774 50.000000000 +97.419354839 8.709677419 50.000000000 +97.419354839 9.032258065 50.000000000 +97.419354839 9.354838710 50.000000000 +97.419354839 9.677419355 50.000000000 +97.419354839 10.000000000 50.000000000 +100.000000000 0.000000000 27.178685975 +100.000000000 0.322580645 27.178685975 +100.000000000 0.645161290 27.178685975 +100.000000000 0.967741935 27.178685975 +100.000000000 1.290322581 27.178685975 +100.000000000 1.612903226 27.178685975 +100.000000000 1.935483871 27.178685975 +100.000000000 2.258064516 27.296404171 +100.000000000 2.580645161 27.766557921 +100.000000000 2.903225806 28.568384038 +100.000000000 3.225806452 29.658354183 +100.000000000 3.548387097 30.986293382 +100.000000000 3.870967742 32.505023360 +100.000000000 4.193548387 34.179317922 +100.000000000 4.516129032 35.993378883 +100.000000000 4.838709677 37.956837060 +100.000000000 5.161290323 40.082003316 +100.000000000 5.483870968 42.176882360 +100.000000000 5.806451613 44.089939459 +100.000000000 6.129032258 45.749863871 +100.000000000 6.451612903 47.129019871 +100.000000000 6.774193548 48.225071677 +100.000000000 7.096774194 49.047673187 +100.000000000 7.419354839 49.609923621 +100.000000000 7.741935484 49.923351514 +100.000000000 8.064516129 50.000000000 +100.000000000 8.387096774 50.000000000 +100.000000000 8.709677419 50.000000000 +100.000000000 9.032258065 50.000000000 +100.000000000 9.354838710 50.000000000 +100.000000000 9.677419355 50.000000000 +100.000000000 10.000000000 50.000000000 diff --git a/examples/mamdani/octave/investment_portfolio.fll b/examples/mamdani/octave/investment_portfolio.fll new file mode 100644 index 0000000..628fdef --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.fll @@ -0,0 +1,34 @@ +Engine: investment_portfolio +InputVariable: Age + enabled: true + range: 20.000 100.000 + lock-range: false + term: Young ZShape 30.000 90.000 + term: Old SShape 30.000 90.000 +InputVariable: RiskTolerance + enabled: true + range: 0.000 10.000 + lock-range: false + term: Low ZShape 2.000 8.000 + term: High SShape 2.000 8.000 +OutputVariable: PercentageInStocks + enabled: true + range: 0.000 100.000 + lock-range: false + aggregation: EinsteinSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: AboutFifteen Gaussian 15.000 10.000 + term: AboutFifty Gaussian 50.000 10.000 + term: AboutEightyFive Gaussian 85.000 10.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: EinsteinSum + implication: EinsteinProduct + activation: General + rule: if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive + rule: if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen + rule: if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500 + rule: if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500
\ No newline at end of file diff --git a/examples/mamdani/octave/investment_portfolio.java b/examples/mamdani/octave/investment_portfolio.java new file mode 100644 index 0000000..9dff687 --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.java @@ -0,0 +1,73 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class investment_portfolio{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("investment_portfolio"); +engine.setDescription(""); + +InputVariable Age = new InputVariable(); +Age.setName("Age"); +Age.setDescription(""); +Age.setEnabled(true); +Age.setRange(20.000, 100.000); +Age.setLockValueInRange(false); +Age.addTerm(new ZShape("Young", 30.000, 90.000)); +Age.addTerm(new SShape("Old", 30.000, 90.000)); +engine.addInputVariable(Age); + +InputVariable RiskTolerance = new InputVariable(); +RiskTolerance.setName("RiskTolerance"); +RiskTolerance.setDescription(""); +RiskTolerance.setEnabled(true); +RiskTolerance.setRange(0.000, 10.000); +RiskTolerance.setLockValueInRange(false); +RiskTolerance.addTerm(new ZShape("Low", 2.000, 8.000)); +RiskTolerance.addTerm(new SShape("High", 2.000, 8.000)); +engine.addInputVariable(RiskTolerance); + +OutputVariable PercentageInStocks = new OutputVariable(); +PercentageInStocks.setName("PercentageInStocks"); +PercentageInStocks.setDescription(""); +PercentageInStocks.setEnabled(true); +PercentageInStocks.setRange(0.000, 100.000); +PercentageInStocks.setLockValueInRange(false); +PercentageInStocks.setAggregation(new EinsteinSum()); +PercentageInStocks.setDefuzzifier(new Centroid(200)); +PercentageInStocks.setDefaultValue(Double.NaN); +PercentageInStocks.setLockPreviousValue(false); +PercentageInStocks.addTerm(new Gaussian("AboutFifteen", 15.000, 10.000)); +PercentageInStocks.addTerm(new Gaussian("AboutFifty", 50.000, 10.000)); +PercentageInStocks.addTerm(new Gaussian("AboutEightyFive", 85.000, 10.000)); +engine.addOutputVariable(PercentageInStocks); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new EinsteinProduct()); +ruleBlock.setDisjunction(new EinsteinSum()); +ruleBlock.setImplication(new EinsteinProduct()); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive", engine)); +ruleBlock.addRule(Rule.parse("if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen", engine)); +ruleBlock.addRule(Rule.parse("if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500", engine)); +ruleBlock.addRule(Rule.parse("if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/octave/investment_portfolio.pdf b/examples/mamdani/octave/investment_portfolio.pdf Binary files differnew file mode 100644 index 0000000..c9c897e --- /dev/null +++ b/examples/mamdani/octave/investment_portfolio.pdf diff --git a/examples/mamdani/octave/mamdani_tip_calculator.R b/examples/mamdani/octave/mamdani_tip_calculator.R new file mode 100644 index 0000000..81eabe2 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.R @@ -0,0 +1,90 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "mamdani_tip_calculator" +engine.fll = "Engine: mamdani_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: AboutTenPercent Gaussian 10.000 2.000 + term: AboutFifteenPercent Gaussian 15.000 2.000 + term: AboutTwentyPercent Gaussian 20.000 2.000 +OutputVariable: CheckPlusTip + enabled: true + range: 1.000 1.300 + lock-range: false + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: PlusAboutTenPercent Gaussian 1.100 0.020 + term: PlusAboutFifteenPercent Gaussian 1.150 0.020 + term: PlusAboutTwentyPercent Gaussian 1.200 0.020 +RuleBlock: + enabled: true + conjunction: AlgebraicProduct + disjunction: Maximum + implication: Minimum + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent" + +engine.fldFile = "mamdani_tip_calculator.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=Tip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=Tip), color="black") + + ggtitle("(FoodQuality, Service) = Tip") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=Tip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=Tip), color="black") + + ggtitle("(Service, FoodQuality) = Tip") + +engine.plot.i1i2_o2 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=CheckPlusTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=CheckPlusTip), color="black") + + ggtitle("(FoodQuality, Service) = CheckPlusTip") + +engine.plot.i2i1_o2 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=CheckPlusTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=CheckPlusTip), color="black") + + ggtitle("(Service, FoodQuality) = CheckPlusTip") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, engine.plot.i1i2_o2, engine.plot.i2i1_o2, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/mamdani/octave/mamdani_tip_calculator.cpp b/examples/mamdani/octave/mamdani_tip_calculator.cpp new file mode 100644 index 0000000..86d6464 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.cpp @@ -0,0 +1,77 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("mamdani_tip_calculator"); +engine->setDescription(""); + +InputVariable* FoodQuality = new InputVariable; +FoodQuality->setName("FoodQuality"); +FoodQuality->setDescription(""); +FoodQuality->setEnabled(true); +FoodQuality->setRange(1.000, 10.000); +FoodQuality->setLockValueInRange(false); +FoodQuality->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(FoodQuality); + +InputVariable* Service = new InputVariable; +Service->setName("Service"); +Service->setDescription(""); +Service->setEnabled(true); +Service->setRange(1.000, 10.000); +Service->setLockValueInRange(false); +Service->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(Service); + +OutputVariable* Tip = new OutputVariable; +Tip->setName("Tip"); +Tip->setDescription(""); +Tip->setEnabled(true); +Tip->setRange(0.000, 30.000); +Tip->setLockValueInRange(false); +Tip->setAggregation(new AlgebraicSum); +Tip->setDefuzzifier(new Centroid(200)); +Tip->setDefaultValue(fl::nan); +Tip->setLockPreviousValue(false); +Tip->addTerm(new Gaussian("AboutTenPercent", 10.000, 2.000)); +Tip->addTerm(new Gaussian("AboutFifteenPercent", 15.000, 2.000)); +Tip->addTerm(new Gaussian("AboutTwentyPercent", 20.000, 2.000)); +engine->addOutputVariable(Tip); + +OutputVariable* CheckPlusTip = new OutputVariable; +CheckPlusTip->setName("CheckPlusTip"); +CheckPlusTip->setDescription(""); +CheckPlusTip->setEnabled(true); +CheckPlusTip->setRange(1.000, 1.300); +CheckPlusTip->setLockValueInRange(false); +CheckPlusTip->setAggregation(new AlgebraicSum); +CheckPlusTip->setDefuzzifier(new Centroid(200)); +CheckPlusTip->setDefaultValue(fl::nan); +CheckPlusTip->setLockPreviousValue(false); +CheckPlusTip->addTerm(new Gaussian("PlusAboutTenPercent", 1.100, 0.020)); +CheckPlusTip->addTerm(new Gaussian("PlusAboutFifteenPercent", 1.150, 0.020)); +CheckPlusTip->addTerm(new Gaussian("PlusAboutTwentyPercent", 1.200, 0.020)); +engine->addOutputVariable(CheckPlusTip); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new AlgebraicProduct); +ruleBlock->setDisjunction(new Maximum); +ruleBlock->setImplication(new Minimum); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/mamdani/octave/mamdani_tip_calculator.fcl b/examples/mamdani/octave/mamdani_tip_calculator.fcl new file mode 100644 index 0000000..0265bc2 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.fcl @@ -0,0 +1,57 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK mamdani_tip_calculator + +VAR_INPUT + FoodQuality: REAL; + Service: REAL; +END_VAR + +VAR_OUTPUT + Tip: REAL; + CheckPlusTip: REAL; +END_VAR + +FUZZIFY FoodQuality + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +FUZZIFY Service + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +DEFUZZIFY Tip + RANGE := (0.000 .. 30.000); + TERM AboutTenPercent := Gaussian 10.000 2.000; + TERM AboutFifteenPercent := Gaussian 15.000 2.000; + TERM AboutTwentyPercent := Gaussian 20.000 2.000; + METHOD : COG; + ACCU : ASUM; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY CheckPlusTip + RANGE := (1.000 .. 1.300); + TERM PlusAboutTenPercent := Gaussian 1.100 0.020; + TERM PlusAboutFifteenPercent := Gaussian 1.150 0.020; + TERM PlusAboutTwentyPercent := Gaussian 1.200 0.020; + METHOD : COG; + ACCU : ASUM; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : PROD; + OR : MAX; + ACT : MIN; + RULE 1 : if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent + RULE 2 : if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + RULE 3 : if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + RULE 4 : if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/mamdani/octave/mamdani_tip_calculator.fis b/examples/mamdani/octave/mamdani_tip_calculator.fis new file mode 100644 index 0000000..13cd802 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.fis @@ -0,0 +1,50 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='mamdani_tip_calculator' +Type='mamdani' +Version=6.0 +NumInputs=2 +NumOutputs=2 +NumRules=4 +AndMethod='prod' +OrMethod='max' +ImpMethod='min' +AggMethod='probor' +DefuzzMethod='centroid' + +[Input1] +Name='FoodQuality' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Input2] +Name='Service' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Output1] +Name='Tip' +Range=[0.000 30.000] +NumMFs=3 +MF1='AboutTenPercent':'gaussmf',[2.000 10.000] +MF2='AboutFifteenPercent':'gaussmf',[2.000 15.000] +MF3='AboutTwentyPercent':'gaussmf',[2.000 20.000] + +[Output2] +Name='CheckPlusTip' +Range=[1.000 1.300] +NumMFs=3 +MF1='PlusAboutTenPercent':'gaussmf',[0.020 1.100] +MF2='PlusAboutFifteenPercent':'gaussmf',[0.020 1.150] +MF3='PlusAboutTwentyPercent':'gaussmf',[0.020 1.200] + +[Rules] +1.000 1.000 , 1.000 1.000 (1.000) : 1 +1.000 2.000 , 2.000 2.000 (1.000) : 1 +2.000 1.000 , 2.000 2.000 (1.000) : 1 +2.000 2.000 , 3.000 3.000 (1.000) : 1 diff --git a/examples/mamdani/octave/mamdani_tip_calculator.fld b/examples/mamdani/octave/mamdani_tip_calculator.fld new file mode 100644 index 0000000..9d87eab --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.fld @@ -0,0 +1,1025 @@ +FoodQuality Service Tip CheckPlusTip +1.000000000 1.000000000 10.000002957 1.100000030 +1.000000000 1.290322581 10.000002957 1.100000030 +1.000000000 1.580645161 10.000002957 1.100000030 +1.000000000 1.870967742 10.000002957 1.100000030 +1.000000000 2.161290323 10.000002957 1.100000030 +1.000000000 2.451612903 10.000002957 1.100000030 +1.000000000 2.741935484 10.000002957 1.100000030 +1.000000000 3.032258065 10.103612040 1.101036120 +1.000000000 3.322580645 10.708467388 1.107084674 +1.000000000 3.612903226 11.133945555 1.111339456 +1.000000000 3.903225806 11.479248807 1.114792488 +1.000000000 4.193548387 11.778370516 1.117783705 +1.000000000 4.483870968 12.050104922 1.120501049 +1.000000000 4.774193548 12.305762763 1.123057628 +1.000000000 5.064516129 12.555175445 1.125551754 +1.000000000 5.354838710 12.806659860 1.128066599 +1.000000000 5.645161290 13.068093230 1.130680932 +1.000000000 5.935483871 13.350561957 1.133505620 +1.000000000 6.225806452 13.666570669 1.136665707 +1.000000000 6.516129032 14.042124914 1.140421249 +1.000000000 6.806451613 14.524928709 1.145249287 +1.000000000 7.096774194 15.000000000 1.150000000 +1.000000000 7.387096774 15.000000000 1.150000000 +1.000000000 7.677419355 15.000000000 1.150000000 +1.000000000 7.967741935 15.000000000 1.150000000 +1.000000000 8.258064516 15.000000000 1.150000000 +1.000000000 8.548387097 15.000000000 1.150000000 +1.000000000 8.838709677 15.000000000 1.150000000 +1.000000000 9.129032258 15.000000000 1.150000000 +1.000000000 9.419354839 15.000000000 1.150000000 +1.000000000 9.709677419 15.000000000 1.150000000 +1.000000000 10.000000000 15.000000000 1.150000000 +1.290322581 1.000000000 10.000002957 1.100000030 +1.290322581 1.290322581 10.000002957 1.100000030 +1.290322581 1.580645161 10.000002957 1.100000030 +1.290322581 1.870967742 10.000002957 1.100000030 +1.290322581 2.161290323 10.000002957 1.100000030 +1.290322581 2.451612903 10.000002957 1.100000030 +1.290322581 2.741935484 10.000002957 1.100000030 +1.290322581 3.032258065 10.103612040 1.101036120 +1.290322581 3.322580645 10.708467388 1.107084674 +1.290322581 3.612903226 11.133945555 1.111339456 +1.290322581 3.903225806 11.479248807 1.114792488 +1.290322581 4.193548387 11.778370516 1.117783705 +1.290322581 4.483870968 12.050104922 1.120501049 +1.290322581 4.774193548 12.305762763 1.123057628 +1.290322581 5.064516129 12.555175445 1.125551754 +1.290322581 5.354838710 12.806659860 1.128066599 +1.290322581 5.645161290 13.068093230 1.130680932 +1.290322581 5.935483871 13.350561957 1.133505620 +1.290322581 6.225806452 13.666570669 1.136665707 +1.290322581 6.516129032 14.042124914 1.140421249 +1.290322581 6.806451613 14.524928709 1.145249287 +1.290322581 7.096774194 15.000000000 1.150000000 +1.290322581 7.387096774 15.000000000 1.150000000 +1.290322581 7.677419355 15.000000000 1.150000000 +1.290322581 7.967741935 15.000000000 1.150000000 +1.290322581 8.258064516 15.000000000 1.150000000 +1.290322581 8.548387097 15.000000000 1.150000000 +1.290322581 8.838709677 15.000000000 1.150000000 +1.290322581 9.129032258 15.000000000 1.150000000 +1.290322581 9.419354839 15.000000000 1.150000000 +1.290322581 9.709677419 15.000000000 1.150000000 +1.290322581 10.000000000 15.000000000 1.150000000 +1.580645161 1.000000000 10.000002957 1.100000030 +1.580645161 1.290322581 10.000002957 1.100000030 +1.580645161 1.580645161 10.000002957 1.100000030 +1.580645161 1.870967742 10.000002957 1.100000030 +1.580645161 2.161290323 10.000002957 1.100000030 +1.580645161 2.451612903 10.000002957 1.100000030 +1.580645161 2.741935484 10.000002957 1.100000030 +1.580645161 3.032258065 10.103612040 1.101036120 +1.580645161 3.322580645 10.708467388 1.107084674 +1.580645161 3.612903226 11.133945555 1.111339456 +1.580645161 3.903225806 11.479248807 1.114792488 +1.580645161 4.193548387 11.778370516 1.117783705 +1.580645161 4.483870968 12.050104922 1.120501049 +1.580645161 4.774193548 12.305762763 1.123057628 +1.580645161 5.064516129 12.555175445 1.125551754 +1.580645161 5.354838710 12.806659860 1.128066599 +1.580645161 5.645161290 13.068093230 1.130680932 +1.580645161 5.935483871 13.350561957 1.133505620 +1.580645161 6.225806452 13.666570669 1.136665707 +1.580645161 6.516129032 14.042124914 1.140421249 +1.580645161 6.806451613 14.524928709 1.145249287 +1.580645161 7.096774194 15.000000000 1.150000000 +1.580645161 7.387096774 15.000000000 1.150000000 +1.580645161 7.677419355 15.000000000 1.150000000 +1.580645161 7.967741935 15.000000000 1.150000000 +1.580645161 8.258064516 15.000000000 1.150000000 +1.580645161 8.548387097 15.000000000 1.150000000 +1.580645161 8.838709677 15.000000000 1.150000000 +1.580645161 9.129032258 15.000000000 1.150000000 +1.580645161 9.419354839 15.000000000 1.150000000 +1.580645161 9.709677419 15.000000000 1.150000000 +1.580645161 10.000000000 15.000000000 1.150000000 +1.870967742 1.000000000 10.000002957 1.100000030 +1.870967742 1.290322581 10.000002957 1.100000030 +1.870967742 1.580645161 10.000002957 1.100000030 +1.870967742 1.870967742 10.000002957 1.100000030 +1.870967742 2.161290323 10.000002957 1.100000030 +1.870967742 2.451612903 10.000002957 1.100000030 +1.870967742 2.741935484 10.000002957 1.100000030 +1.870967742 3.032258065 10.103612040 1.101036120 +1.870967742 3.322580645 10.708467388 1.107084674 +1.870967742 3.612903226 11.133945555 1.111339456 +1.870967742 3.903225806 11.479248807 1.114792488 +1.870967742 4.193548387 11.778370516 1.117783705 +1.870967742 4.483870968 12.050104922 1.120501049 +1.870967742 4.774193548 12.305762763 1.123057628 +1.870967742 5.064516129 12.555175445 1.125551754 +1.870967742 5.354838710 12.806659860 1.128066599 +1.870967742 5.645161290 13.068093230 1.130680932 +1.870967742 5.935483871 13.350561957 1.133505620 +1.870967742 6.225806452 13.666570669 1.136665707 +1.870967742 6.516129032 14.042124914 1.140421249 +1.870967742 6.806451613 14.524928709 1.145249287 +1.870967742 7.096774194 15.000000000 1.150000000 +1.870967742 7.387096774 15.000000000 1.150000000 +1.870967742 7.677419355 15.000000000 1.150000000 +1.870967742 7.967741935 15.000000000 1.150000000 +1.870967742 8.258064516 15.000000000 1.150000000 +1.870967742 8.548387097 15.000000000 1.150000000 +1.870967742 8.838709677 15.000000000 1.150000000 +1.870967742 9.129032258 15.000000000 1.150000000 +1.870967742 9.419354839 15.000000000 1.150000000 +1.870967742 9.709677419 15.000000000 1.150000000 +1.870967742 10.000000000 15.000000000 1.150000000 +2.161290323 1.000000000 10.000002957 1.100000030 +2.161290323 1.290322581 10.000002957 1.100000030 +2.161290323 1.580645161 10.000002957 1.100000030 +2.161290323 1.870967742 10.000002957 1.100000030 +2.161290323 2.161290323 10.000002957 1.100000030 +2.161290323 2.451612903 10.000002957 1.100000030 +2.161290323 2.741935484 10.000002957 1.100000030 +2.161290323 3.032258065 10.103612040 1.101036120 +2.161290323 3.322580645 10.708467388 1.107084674 +2.161290323 3.612903226 11.133945555 1.111339456 +2.161290323 3.903225806 11.479248807 1.114792488 +2.161290323 4.193548387 11.778370516 1.117783705 +2.161290323 4.483870968 12.050104922 1.120501049 +2.161290323 4.774193548 12.305762763 1.123057628 +2.161290323 5.064516129 12.555175445 1.125551754 +2.161290323 5.354838710 12.806659860 1.128066599 +2.161290323 5.645161290 13.068093230 1.130680932 +2.161290323 5.935483871 13.350561957 1.133505620 +2.161290323 6.225806452 13.666570669 1.136665707 +2.161290323 6.516129032 14.042124914 1.140421249 +2.161290323 6.806451613 14.524928709 1.145249287 +2.161290323 7.096774194 15.000000000 1.150000000 +2.161290323 7.387096774 15.000000000 1.150000000 +2.161290323 7.677419355 15.000000000 1.150000000 +2.161290323 7.967741935 15.000000000 1.150000000 +2.161290323 8.258064516 15.000000000 1.150000000 +2.161290323 8.548387097 15.000000000 1.150000000 +2.161290323 8.838709677 15.000000000 1.150000000 +2.161290323 9.129032258 15.000000000 1.150000000 +2.161290323 9.419354839 15.000000000 1.150000000 +2.161290323 9.709677419 15.000000000 1.150000000 +2.161290323 10.000000000 15.000000000 1.150000000 +2.451612903 1.000000000 10.000002957 1.100000030 +2.451612903 1.290322581 10.000002957 1.100000030 +2.451612903 1.580645161 10.000002957 1.100000030 +2.451612903 1.870967742 10.000002957 1.100000030 +2.451612903 2.161290323 10.000002957 1.100000030 +2.451612903 2.451612903 10.000002957 1.100000030 +2.451612903 2.741935484 10.000002957 1.100000030 +2.451612903 3.032258065 10.103612040 1.101036120 +2.451612903 3.322580645 10.708467388 1.107084674 +2.451612903 3.612903226 11.133945555 1.111339456 +2.451612903 3.903225806 11.479248807 1.114792488 +2.451612903 4.193548387 11.778370516 1.117783705 +2.451612903 4.483870968 12.050104922 1.120501049 +2.451612903 4.774193548 12.305762763 1.123057628 +2.451612903 5.064516129 12.555175445 1.125551754 +2.451612903 5.354838710 12.806659860 1.128066599 +2.451612903 5.645161290 13.068093230 1.130680932 +2.451612903 5.935483871 13.350561957 1.133505620 +2.451612903 6.225806452 13.666570669 1.136665707 +2.451612903 6.516129032 14.042124914 1.140421249 +2.451612903 6.806451613 14.524928709 1.145249287 +2.451612903 7.096774194 15.000000000 1.150000000 +2.451612903 7.387096774 15.000000000 1.150000000 +2.451612903 7.677419355 15.000000000 1.150000000 +2.451612903 7.967741935 15.000000000 1.150000000 +2.451612903 8.258064516 15.000000000 1.150000000 +2.451612903 8.548387097 15.000000000 1.150000000 +2.451612903 8.838709677 15.000000000 1.150000000 +2.451612903 9.129032258 15.000000000 1.150000000 +2.451612903 9.419354839 15.000000000 1.150000000 +2.451612903 9.709677419 15.000000000 1.150000000 +2.451612903 10.000000000 15.000000000 1.150000000 +2.741935484 1.000000000 10.000002957 1.100000030 +2.741935484 1.290322581 10.000002957 1.100000030 +2.741935484 1.580645161 10.000002957 1.100000030 +2.741935484 1.870967742 10.000002957 1.100000030 +2.741935484 2.161290323 10.000002957 1.100000030 +2.741935484 2.451612903 10.000002957 1.100000030 +2.741935484 2.741935484 10.000002957 1.100000030 +2.741935484 3.032258065 10.103612040 1.101036120 +2.741935484 3.322580645 10.708467388 1.107084674 +2.741935484 3.612903226 11.133945555 1.111339456 +2.741935484 3.903225806 11.479248807 1.114792488 +2.741935484 4.193548387 11.778370516 1.117783705 +2.741935484 4.483870968 12.050104922 1.120501049 +2.741935484 4.774193548 12.305762763 1.123057628 +2.741935484 5.064516129 12.555175445 1.125551754 +2.741935484 5.354838710 12.806659860 1.128066599 +2.741935484 5.645161290 13.068093230 1.130680932 +2.741935484 5.935483871 13.350561957 1.133505620 +2.741935484 6.225806452 13.666570669 1.136665707 +2.741935484 6.516129032 14.042124914 1.140421249 +2.741935484 6.806451613 14.524928709 1.145249287 +2.741935484 7.096774194 15.000000000 1.150000000 +2.741935484 7.387096774 15.000000000 1.150000000 +2.741935484 7.677419355 15.000000000 1.150000000 +2.741935484 7.967741935 15.000000000 1.150000000 +2.741935484 8.258064516 15.000000000 1.150000000 +2.741935484 8.548387097 15.000000000 1.150000000 +2.741935484 8.838709677 15.000000000 1.150000000 +2.741935484 9.129032258 15.000000000 1.150000000 +2.741935484 9.419354839 15.000000000 1.150000000 +2.741935484 9.709677419 15.000000000 1.150000000 +2.741935484 10.000000000 15.000000000 1.150000000 +3.032258065 1.000000000 10.103612040 1.101036120 +3.032258065 1.290322581 10.103612040 1.101036120 +3.032258065 1.580645161 10.103612040 1.101036120 +3.032258065 1.870967742 10.103612040 1.101036120 +3.032258065 2.161290323 10.103612040 1.101036120 +3.032258065 2.451612903 10.103612040 1.101036120 +3.032258065 2.741935484 10.103612040 1.101036120 +3.032258065 3.032258065 10.204358113 1.102043581 +3.032258065 3.322580645 10.796018218 1.107960182 +3.032258065 3.612903226 11.215358735 1.112153587 +3.032258065 3.903225806 11.557846462 1.115578465 +3.032258065 4.193548387 11.855790361 1.118557904 +3.032258065 4.483870968 12.127240434 1.121272404 +3.032258065 4.774193548 12.384052580 1.123840526 +3.032258065 5.064516129 12.634997421 1.126349974 +3.032258065 5.354838710 12.888585631 1.128885856 +3.032258065 5.645161290 13.153230669 1.131532307 +3.032258065 5.935483871 13.438880990 1.134388810 +3.032258065 6.225806452 13.759265462 1.137592655 +3.032258065 6.516129032 14.139344845 1.141393448 +3.032258065 6.806451613 14.626746497 1.146267465 +3.032258065 7.096774194 15.103574890 1.151035749 +3.032258065 7.387096774 15.103574890 1.151035749 +3.032258065 7.677419355 15.103574890 1.151035749 +3.032258065 7.967741935 15.103574890 1.151035749 +3.032258065 8.258064516 15.103574890 1.151035749 +3.032258065 8.548387097 15.103574890 1.151035749 +3.032258065 8.838709677 15.103574890 1.151035749 +3.032258065 9.129032258 15.103574890 1.151035749 +3.032258065 9.419354839 15.103574890 1.151035749 +3.032258065 9.709677419 15.103574890 1.151035749 +3.032258065 10.000000000 15.103574890 1.151035749 +3.322580645 1.000000000 10.708467388 1.107084674 +3.322580645 1.290322581 10.708467388 1.107084674 +3.322580645 1.580645161 10.708467388 1.107084674 +3.322580645 1.870967742 10.708467388 1.107084674 +3.322580645 2.161290323 10.708467388 1.107084674 +3.322580645 2.451612903 10.708467388 1.107084674 +3.322580645 2.741935484 10.708467388 1.107084674 +3.322580645 3.032258065 10.796018218 1.107960182 +3.322580645 3.322580645 11.322661747 1.113226617 +3.322580645 3.612903226 11.712913158 1.117129132 +3.322580645 3.903225806 12.043415217 1.120434152 +3.322580645 4.193548387 12.339709404 1.123397094 +3.322580645 4.483870968 12.615733153 1.126157332 +3.322580645 4.774193548 12.881223868 1.128812239 +3.322580645 5.064516129 13.144835022 1.131448350 +3.322580645 5.354838710 13.414082467 1.134140825 +3.322580645 5.645161290 13.696138923 1.136961389 +3.322580645 5.935483871 14.000777693 1.140007777 +3.322580645 6.225806452 14.342258539 1.143422585 +3.322580645 6.516129032 14.739964250 1.147399642 +3.322580645 6.806451613 15.239164015 1.152391640 +3.322580645 7.096774194 15.708449495 1.157084495 +3.322580645 7.387096774 15.708449495 1.157084495 +3.322580645 7.677419355 15.708449495 1.157084495 +3.322580645 7.967741935 15.708449495 1.157084495 +3.322580645 8.258064516 15.708449495 1.157084495 +3.322580645 8.548387097 15.708449495 1.157084495 +3.322580645 8.838709677 15.708449495 1.157084495 +3.322580645 9.129032258 15.708449495 1.157084495 +3.322580645 9.419354839 15.708449495 1.157084495 +3.322580645 9.709677419 15.708449495 1.157084495 +3.322580645 10.000000000 15.708449495 1.157084495 +3.612903226 1.000000000 11.133945555 1.111339456 +3.612903226 1.290322581 11.133945555 1.111339456 +3.612903226 1.580645161 11.133945555 1.111339456 +3.612903226 1.870967742 11.133945555 1.111339456 +3.612903226 2.161290323 11.133945555 1.111339456 +3.612903226 2.451612903 11.133945555 1.111339456 +3.612903226 2.741935484 11.133945555 1.111339456 +3.612903226 3.032258065 11.215358735 1.112153587 +3.612903226 3.322580645 11.712913158 1.117129132 +3.612903226 3.612903226 12.090486886 1.120904869 +3.612903226 3.903225806 12.417951094 1.124179511 +3.612903226 4.193548387 12.717020386 1.127170204 +3.612903226 4.483870968 12.999111631 1.129991116 +3.612903226 4.774193548 13.273780609 1.132737806 +3.612903226 5.064516129 13.547717972 1.135477180 +3.612903226 5.354838710 13.827512227 1.138275122 +3.612903226 5.645161290 14.120187657 1.141201877 +3.612903226 5.935483871 14.435371678 1.144353717 +3.612903226 6.225806452 14.784914127 1.147849141 +3.612903226 6.516129032 15.187004870 1.151870049 +3.612903226 6.806451613 15.681548005 1.156815480 +3.612903226 7.096774194 16.133823742 1.161338237 +3.612903226 7.387096774 16.133823742 1.161338237 +3.612903226 7.677419355 16.133823742 1.161338237 +3.612903226 7.967741935 16.133823742 1.161338237 +3.612903226 8.258064516 16.133823742 1.161338237 +3.612903226 8.548387097 16.133823742 1.161338237 +3.612903226 8.838709677 16.133823742 1.161338237 +3.612903226 9.129032258 16.133823742 1.161338237 +3.612903226 9.419354839 16.133823742 1.161338237 +3.612903226 9.709677419 16.133823742 1.161338237 +3.612903226 10.000000000 16.133823742 1.161338237 +3.903225806 1.000000000 11.479248807 1.114792488 +3.903225806 1.290322581 11.479248807 1.114792488 +3.903225806 1.580645161 11.479248807 1.114792488 +3.903225806 1.870967742 11.479248807 1.114792488 +3.903225806 2.161290323 11.479248807 1.114792488 +3.903225806 2.451612903 11.479248807 1.114792488 +3.903225806 2.741935484 11.479248807 1.114792488 +3.903225806 3.032258065 11.557846462 1.115578465 +3.903225806 3.322580645 12.043415217 1.120434152 +3.903225806 3.612903226 12.417951094 1.124179511 +3.903225806 3.903225806 12.746299057 1.127462991 +3.903225806 4.193548387 13.049696353 1.130496964 +3.903225806 4.483870968 13.337970486 1.133379705 +3.903225806 4.774193548 13.620159587 1.136201596 +3.903225806 5.064516129 13.901946604 1.139019466 +3.903225806 5.354838710 14.188883155 1.141888832 +3.903225806 5.645161290 14.489540684 1.144895407 +3.903225806 5.935483871 14.809822020 1.148098220 +3.903225806 6.225806452 15.160748839 1.151607488 +3.903225806 6.516129032 15.560871420 1.155608714 +3.903225806 6.806451613 16.043900181 1.160439002 +3.903225806 7.096774194 16.479227686 1.164792277 +3.903225806 7.387096774 16.479227686 1.164792277 +3.903225806 7.677419355 16.479227686 1.164792277 +3.903225806 7.967741935 16.479227686 1.164792277 +3.903225806 8.258064516 16.479227686 1.164792277 +3.903225806 8.548387097 16.479227686 1.164792277 +3.903225806 8.838709677 16.479227686 1.164792277 +3.903225806 9.129032258 16.479227686 1.164792277 +3.903225806 9.419354839 16.479227686 1.164792277 +3.903225806 9.709677419 16.479227686 1.164792277 +3.903225806 10.000000000 16.479227686 1.164792277 +4.193548387 1.000000000 11.778370516 1.117783705 +4.193548387 1.290322581 11.778370516 1.117783705 +4.193548387 1.580645161 11.778370516 1.117783705 +4.193548387 1.870967742 11.778370516 1.117783705 +4.193548387 2.161290323 11.778370516 1.117783705 +4.193548387 2.451612903 11.778370516 1.117783705 +4.193548387 2.741935484 11.778370516 1.117783705 +4.193548387 3.032258065 11.855790361 1.118557904 +4.193548387 3.322580645 12.339709404 1.123397094 +4.193548387 3.612903226 12.717020386 1.127170204 +4.193548387 3.903225806 13.049696353 1.130496964 +4.193548387 4.193548387 13.357895418 1.133578954 +4.193548387 4.483870968 13.652146644 1.136521466 +4.193548387 4.774193548 13.940357897 1.139403579 +4.193548387 5.064516129 14.228197117 1.142281971 +4.193548387 5.354838710 14.520452601 1.145204526 +4.193548387 5.645161290 14.824425958 1.148244260 +4.193548387 5.935483871 15.146110946 1.151461109 +4.193548387 6.225806452 15.495840162 1.154958402 +4.193548387 6.516129032 15.889898831 1.158898988 +4.193548387 6.806451613 16.360710958 1.163607110 +4.193548387 7.096774194 16.778452741 1.167784527 +4.193548387 7.387096774 16.778452741 1.167784527 +4.193548387 7.677419355 16.778452741 1.167784527 +4.193548387 7.967741935 16.778452741 1.167784527 +4.193548387 8.258064516 16.778452741 1.167784527 +4.193548387 8.548387097 16.778452741 1.167784527 +4.193548387 8.838709677 16.778452741 1.167784527 +4.193548387 9.129032258 16.778452741 1.167784527 +4.193548387 9.419354839 16.778452741 1.167784527 +4.193548387 9.709677419 16.778452741 1.167784527 +4.193548387 10.000000000 16.778452741 1.167784527 +4.483870968 1.000000000 12.050104922 1.120501049 +4.483870968 1.290322581 12.050104922 1.120501049 +4.483870968 1.580645161 12.050104922 1.120501049 +4.483870968 1.870967742 12.050104922 1.120501049 +4.483870968 2.161290323 12.050104922 1.120501049 +4.483870968 2.451612903 12.050104922 1.120501049 +4.483870968 2.741935484 12.050104922 1.120501049 +4.483870968 3.032258065 12.127240434 1.121272404 +4.483870968 3.322580645 12.615733153 1.126157332 +4.483870968 3.612903226 12.999111631 1.129991116 +4.483870968 3.903225806 13.337970486 1.133379705 +4.483870968 4.193548387 13.652146644 1.136521466 +4.483870968 4.483870968 13.951679758 1.139516798 +4.483870968 4.774193548 14.245365454 1.142453655 +4.483870968 5.064516129 14.537425993 1.145374260 +4.483870968 5.354838710 14.832538034 1.148325380 +4.483870968 5.645161290 15.137036426 1.151370364 +4.483870968 5.935483871 15.457098960 1.154570990 +4.483870968 6.225806452 15.803334671 1.158033347 +4.483870968 6.516129032 16.189645887 1.161896459 +4.483870968 6.806451613 16.646502949 1.166465029 +4.483870968 7.096774194 17.050023823 1.170500238 +4.483870968 7.387096774 17.050023823 1.170500238 +4.483870968 7.677419355 17.050023823 1.170500238 +4.483870968 7.967741935 17.050023823 1.170500238 +4.483870968 8.258064516 17.050023823 1.170500238 +4.483870968 8.548387097 17.050023823 1.170500238 +4.483870968 8.838709677 17.050023823 1.170500238 +4.483870968 9.129032258 17.050023823 1.170500238 +4.483870968 9.419354839 17.050023823 1.170500238 +4.483870968 9.709677419 17.050023823 1.170500238 +4.483870968 10.000000000 17.050023823 1.170500238 +4.774193548 1.000000000 12.305762763 1.123057628 +4.774193548 1.290322581 12.305762763 1.123057628 +4.774193548 1.580645161 12.305762763 1.123057628 +4.774193548 1.870967742 12.305762763 1.123057628 +4.774193548 2.161290323 12.305762763 1.123057628 +4.774193548 2.451612903 12.305762763 1.123057628 +4.774193548 2.741935484 12.305762763 1.123057628 +4.774193548 3.032258065 12.384052580 1.123840526 +4.774193548 3.322580645 12.881223868 1.128812239 +4.774193548 3.612903226 13.273780609 1.132737806 +4.774193548 3.903225806 13.620159587 1.136201596 +4.774193548 4.193548387 13.940357897 1.139403579 +4.774193548 4.483870968 14.245365454 1.142453655 +4.774193548 4.774193548 14.542253555 1.145422536 +4.774193548 5.064516129 14.836186297 1.148361863 +4.774193548 5.354838710 15.132216948 1.151322169 +4.774193548 5.645161290 15.435976637 1.154359766 +4.774193548 5.935483871 15.753650335 1.157536503 +4.774193548 6.225806452 16.094398574 1.160943986 +4.774193548 6.516129032 16.472016458 1.164720165 +4.774193548 6.806451613 16.915328759 1.169153288 +4.774193548 7.096774194 17.305719073 1.173057191 +4.774193548 7.387096774 17.305719073 1.173057191 +4.774193548 7.677419355 17.305719073 1.173057191 +4.774193548 7.967741935 17.305719073 1.173057191 +4.774193548 8.258064516 17.305719073 1.173057191 +4.774193548 8.548387097 17.305719073 1.173057191 +4.774193548 8.838709677 17.305719073 1.173057191 +4.774193548 9.129032258 17.305719073 1.173057191 +4.774193548 9.419354839 17.305719073 1.173057191 +4.774193548 9.709677419 17.305719073 1.173057191 +4.774193548 10.000000000 17.305719073 1.173057191 +5.064516129 1.000000000 12.555175445 1.125551754 +5.064516129 1.290322581 12.555175445 1.125551754 +5.064516129 1.580645161 12.555175445 1.125551754 +5.064516129 1.870967742 12.555175445 1.125551754 +5.064516129 2.161290323 12.555175445 1.125551754 +5.064516129 2.451612903 12.555175445 1.125551754 +5.064516129 2.741935484 12.555175445 1.125551754 +5.064516129 3.032258065 12.634997421 1.126349974 +5.064516129 3.322580645 13.144835022 1.131448350 +5.064516129 3.612903226 13.547717972 1.135477180 +5.064516129 3.903225806 13.901946604 1.139019466 +5.064516129 4.193548387 14.228197117 1.142281971 +5.064516129 4.483870968 14.537425993 1.145374260 +5.064516129 4.774193548 14.836186297 1.148361863 +5.064516129 5.064516129 15.130822202 1.151308222 +5.064516129 5.354838710 15.426134812 1.154261348 +5.064516129 5.645161290 15.727608429 1.157276084 +5.064516129 5.935483871 16.040918075 1.160409181 +5.064516129 6.225806452 16.374971626 1.163749716 +5.064516129 6.516129032 16.743479696 1.167434797 +5.064516129 6.806451613 17.175031887 1.171750319 +5.064516129 7.096774194 17.555546435 1.175555464 +5.064516129 7.387096774 17.555546435 1.175555464 +5.064516129 7.677419355 17.555546435 1.175555464 +5.064516129 7.967741935 17.555546435 1.175555464 +5.064516129 8.258064516 17.555546435 1.175555464 +5.064516129 8.548387097 17.555546435 1.175555464 +5.064516129 8.838709677 17.555546435 1.175555464 +5.064516129 9.129032258 17.555546435 1.175555464 +5.064516129 9.419354839 17.555546435 1.175555464 +5.064516129 9.709677419 17.555546435 1.175555464 +5.064516129 10.000000000 17.555546435 1.175555464 +5.354838710 1.000000000 12.806659860 1.128066599 +5.354838710 1.290322581 12.806659860 1.128066599 +5.354838710 1.580645161 12.806659860 1.128066599 +5.354838710 1.870967742 12.806659860 1.128066599 +5.354838710 2.161290323 12.806659860 1.128066599 +5.354838710 2.451612903 12.806659860 1.128066599 +5.354838710 2.741935484 12.806659860 1.128066599 +5.354838710 3.032258065 12.888585631 1.128885856 +5.354838710 3.322580645 13.414082467 1.134140825 +5.354838710 3.612903226 13.827512227 1.138275122 +5.354838710 3.903225806 14.188883155 1.141888832 +5.354838710 4.193548387 14.520452601 1.145204526 +5.354838710 4.483870968 14.832538034 1.148325380 +5.354838710 4.774193548 15.132216948 1.151322169 +5.354838710 5.064516129 15.426134812 1.154261348 +5.354838710 5.354838710 15.719361905 1.157193619 +5.354838710 5.645161290 16.017791161 1.160177912 +5.354838710 5.935483871 16.325903819 1.163259038 +5.354838710 6.225806452 16.653358486 1.166533585 +5.354838710 6.516129032 17.013348713 1.170133487 +5.354838710 6.806451613 17.434097089 1.174340971 +5.354838710 7.096774194 17.806398651 1.178063987 +5.354838710 7.387096774 17.806398651 1.178063987 +5.354838710 7.677419355 17.806398651 1.178063987 +5.354838710 7.967741935 17.806398651 1.178063987 +5.354838710 8.258064516 17.806398651 1.178063987 +5.354838710 8.548387097 17.806398651 1.178063987 +5.354838710 8.838709677 17.806398651 1.178063987 +5.354838710 9.129032258 17.806398651 1.178063987 +5.354838710 9.419354839 17.806398651 1.178063987 +5.354838710 9.709677419 17.806398651 1.178063987 +5.354838710 10.000000000 17.806398651 1.178063987 +5.645161290 1.000000000 13.068093230 1.130680932 +5.645161290 1.290322581 13.068093230 1.130680932 +5.645161290 1.580645161 13.068093230 1.130680932 +5.645161290 1.870967742 13.068093230 1.130680932 +5.645161290 2.161290323 13.068093230 1.130680932 +5.645161290 2.451612903 13.068093230 1.130680932 +5.645161290 2.741935484 13.068093230 1.130680932 +5.645161290 3.032258065 13.153230669 1.131532307 +5.645161290 3.322580645 13.696138923 1.136961389 +5.645161290 3.612903226 14.120187657 1.141201877 +5.645161290 3.903225806 14.489540684 1.144895407 +5.645161290 4.193548387 14.824425958 1.148244260 +5.645161290 4.483870968 15.137036426 1.151370364 +5.645161290 4.774193548 15.435976637 1.154359766 +5.645161290 5.064516129 15.727608429 1.157276084 +5.645161290 5.354838710 16.017791161 1.160177912 +5.645161290 5.645161290 16.311598605 1.163115986 +5.645161290 5.935483871 16.613732570 1.166137326 +5.645161290 6.225806452 16.933994986 1.169339950 +5.645161290 6.516129032 17.286819066 1.172868191 +5.645161290 6.806451613 17.700020869 1.177000209 +5.645161290 7.096774194 18.068098179 1.180680982 +5.645161290 7.387096774 18.068098179 1.180680982 +5.645161290 7.677419355 18.068098179 1.180680982 +5.645161290 7.967741935 18.068098179 1.180680982 +5.645161290 8.258064516 18.068098179 1.180680982 +5.645161290 8.548387097 18.068098179 1.180680982 +5.645161290 8.838709677 18.068098179 1.180680982 +5.645161290 9.129032258 18.068098179 1.180680982 +5.645161290 9.419354839 18.068098179 1.180680982 +5.645161290 9.709677419 18.068098179 1.180680982 +5.645161290 10.000000000 18.068098179 1.180680982 +5.935483871 1.000000000 13.350561957 1.133505620 +5.935483871 1.290322581 13.350561957 1.133505620 +5.935483871 1.580645161 13.350561957 1.133505620 +5.935483871 1.870967742 13.350561957 1.133505620 +5.935483871 2.161290323 13.350561957 1.133505620 +5.935483871 2.451612903 13.350561957 1.133505620 +5.935483871 2.741935484 13.350561957 1.133505620 +5.935483871 3.032258065 13.438880990 1.134388810 +5.935483871 3.322580645 14.000777693 1.140007777 +5.935483871 3.612903226 14.435371678 1.144353717 +5.935483871 3.903225806 14.809822020 1.148098220 +5.935483871 4.193548387 15.146110946 1.151461109 +5.935483871 4.483870968 15.457098960 1.154570990 +5.935483871 4.774193548 15.753650335 1.157536503 +5.935483871 5.064516129 16.040918075 1.160409181 +5.935483871 5.354838710 16.325903819 1.163259038 +5.935483871 5.645161290 16.613732570 1.166137326 +5.935483871 5.935483871 16.911019483 1.169110195 +5.935483871 6.225806452 17.225563024 1.172255630 +5.935483871 6.516129032 17.572635415 1.175726354 +5.935483871 6.806451613 17.982106473 1.179821065 +5.935483871 7.096774194 18.349962605 1.183499626 +5.935483871 7.387096774 18.349962605 1.183499626 +5.935483871 7.677419355 18.349962605 1.183499626 +5.935483871 7.967741935 18.349962605 1.183499626 +5.935483871 8.258064516 18.349962605 1.183499626 +5.935483871 8.548387097 18.349962605 1.183499626 +5.935483871 8.838709677 18.349962605 1.183499626 +5.935483871 9.129032258 18.349962605 1.183499626 +5.935483871 9.419354839 18.349962605 1.183499626 +5.935483871 9.709677419 18.349962605 1.183499626 +5.935483871 10.000000000 18.349962605 1.183499626 +6.225806452 1.000000000 13.666570669 1.136665707 +6.225806452 1.290322581 13.666570669 1.136665707 +6.225806452 1.580645161 13.666570669 1.136665707 +6.225806452 1.870967742 13.666570669 1.136665707 +6.225806452 2.161290323 13.666570669 1.136665707 +6.225806452 2.451612903 13.666570669 1.136665707 +6.225806452 2.741935484 13.666570669 1.136665707 +6.225806452 3.032258065 13.759265462 1.137592655 +6.225806452 3.322580645 14.342258539 1.143422585 +6.225806452 3.612903226 14.784914127 1.147849141 +6.225806452 3.903225806 15.160748839 1.151607488 +6.225806452 4.193548387 15.495840162 1.154958402 +6.225806452 4.483870968 15.803334671 1.158033347 +6.225806452 4.774193548 16.094398574 1.160943986 +6.225806452 5.064516129 16.374971626 1.163749716 +6.225806452 5.354838710 16.653358486 1.166533585 +6.225806452 5.645161290 16.933994986 1.169339950 +6.225806452 5.935483871 17.225563024 1.172255630 +6.225806452 6.225806452 17.536694601 1.175366946 +6.225806452 6.516129032 17.882140340 1.178821403 +6.225806452 6.806451613 18.292111531 1.182921115 +6.225806452 7.096774194 18.667017714 1.186670177 +6.225806452 7.387096774 18.667017714 1.186670177 +6.225806452 7.677419355 18.667017714 1.186670177 +6.225806452 7.967741935 18.667017714 1.186670177 +6.225806452 8.258064516 18.667017714 1.186670177 +6.225806452 8.548387097 18.667017714 1.186670177 +6.225806452 8.838709677 18.667017714 1.186670177 +6.225806452 9.129032258 18.667017714 1.186670177 +6.225806452 9.419354839 18.667017714 1.186670177 +6.225806452 9.709677419 18.667017714 1.186670177 +6.225806452 10.000000000 18.667017714 1.186670177 +6.516129032 1.000000000 14.042124914 1.140421249 +6.516129032 1.290322581 14.042124914 1.140421249 +6.516129032 1.580645161 14.042124914 1.140421249 +6.516129032 1.870967742 14.042124914 1.140421249 +6.516129032 2.161290323 14.042124914 1.140421249 +6.516129032 2.451612903 14.042124914 1.140421249 +6.516129032 2.741935484 14.042124914 1.140421249 +6.516129032 3.032258065 14.139344845 1.141393448 +6.516129032 3.322580645 14.739964250 1.147399642 +6.516129032 3.612903226 15.187004870 1.151870049 +6.516129032 3.903225806 15.560871420 1.155608714 +6.516129032 4.193548387 15.889898831 1.158898988 +6.516129032 4.483870968 16.189645887 1.161896459 +6.516129032 4.774193548 16.472016458 1.164720165 +6.516129032 5.064516129 16.743479696 1.167434797 +6.516129032 5.354838710 17.013348713 1.170133487 +6.516129032 5.645161290 17.286819066 1.172868191 +6.516129032 5.935483871 17.572635415 1.175726354 +6.516129032 6.225806452 17.882140340 1.178821403 +6.516129032 6.516129032 18.229995875 1.182299959 +6.516129032 6.806451613 18.651088969 1.186510890 +6.516129032 7.096774194 19.041899081 1.190418991 +6.516129032 7.387096774 19.041899081 1.190418991 +6.516129032 7.677419355 19.041899081 1.190418991 +6.516129032 7.967741935 19.041899081 1.190418991 +6.516129032 8.258064516 19.041899081 1.190418991 +6.516129032 8.548387097 19.041899081 1.190418991 +6.516129032 8.838709677 19.041899081 1.190418991 +6.516129032 9.129032258 19.041899081 1.190418991 +6.516129032 9.419354839 19.041899081 1.190418991 +6.516129032 9.709677419 19.041899081 1.190418991 +6.516129032 10.000000000 19.041899081 1.190418991 +6.806451613 1.000000000 14.524928709 1.145249287 +6.806451613 1.290322581 14.524928709 1.145249287 +6.806451613 1.580645161 14.524928709 1.145249287 +6.806451613 1.870967742 14.524928709 1.145249287 +6.806451613 2.161290323 14.524928709 1.145249287 +6.806451613 2.451612903 14.524928709 1.145249287 +6.806451613 2.741935484 14.524928709 1.145249287 +6.806451613 3.032258065 14.626746497 1.146267465 +6.806451613 3.322580645 15.239164015 1.152391640 +6.806451613 3.612903226 15.681548005 1.156815480 +6.806451613 3.903225806 16.043900181 1.160439002 +6.806451613 4.193548387 16.360710958 1.163607110 +6.806451613 4.483870968 16.646502949 1.166465029 +6.806451613 4.774193548 16.915328759 1.169153288 +6.806451613 5.064516129 17.175031887 1.171750319 +6.806451613 5.354838710 17.434097089 1.174340971 +6.806451613 5.645161290 17.700020869 1.177000209 +6.806451613 5.935483871 17.982106473 1.179821065 +6.806451613 6.225806452 18.292111531 1.182921115 +6.806451613 6.516129032 18.651088969 1.186510890 +6.806451613 6.806451613 19.098880252 1.190988803 +6.806451613 7.096774194 19.524964154 1.195249642 +6.806451613 7.387096774 19.524964154 1.195249642 +6.806451613 7.677419355 19.524964154 1.195249642 +6.806451613 7.967741935 19.524964154 1.195249642 +6.806451613 8.258064516 19.524964154 1.195249642 +6.806451613 8.548387097 19.524964154 1.195249642 +6.806451613 8.838709677 19.524964154 1.195249642 +6.806451613 9.129032258 19.524964154 1.195249642 +6.806451613 9.419354839 19.524964154 1.195249642 +6.806451613 9.709677419 19.524964154 1.195249642 +6.806451613 10.000000000 19.524964154 1.195249642 +7.096774194 1.000000000 15.000000000 1.150000000 +7.096774194 1.290322581 15.000000000 1.150000000 +7.096774194 1.580645161 15.000000000 1.150000000 +7.096774194 1.870967742 15.000000000 1.150000000 +7.096774194 2.161290323 15.000000000 1.150000000 +7.096774194 2.451612903 15.000000000 1.150000000 +7.096774194 2.741935484 15.000000000 1.150000000 +7.096774194 3.032258065 15.103574890 1.151035749 +7.096774194 3.322580645 15.708449495 1.157084495 +7.096774194 3.612903226 16.133823742 1.161338237 +7.096774194 3.903225806 16.479227686 1.164792277 +7.096774194 4.193548387 16.778452741 1.167784527 +7.096774194 4.483870968 17.050023823 1.170500238 +7.096774194 4.774193548 17.305719073 1.173057191 +7.096774194 5.064516129 17.555546435 1.175555464 +7.096774194 5.354838710 17.806398651 1.178063987 +7.096774194 5.645161290 18.068098179 1.180680982 +7.096774194 5.935483871 18.349962605 1.183499626 +7.096774194 6.225806452 18.667017714 1.186670177 +7.096774194 6.516129032 19.041899081 1.190418991 +7.096774194 6.806451613 19.524964154 1.195249642 +7.096774194 7.096774194 19.999997043 1.199999970 +7.096774194 7.387096774 19.999997043 1.199999970 +7.096774194 7.677419355 19.999997043 1.199999970 +7.096774194 7.967741935 19.999997043 1.199999970 +7.096774194 8.258064516 19.999997043 1.199999970 +7.096774194 8.548387097 19.999997043 1.199999970 +7.096774194 8.838709677 19.999997043 1.199999970 +7.096774194 9.129032258 19.999997043 1.199999970 +7.096774194 9.419354839 19.999997043 1.199999970 +7.096774194 9.709677419 19.999997043 1.199999970 +7.096774194 10.000000000 19.999997043 1.199999970 +7.387096774 1.000000000 15.000000000 1.150000000 +7.387096774 1.290322581 15.000000000 1.150000000 +7.387096774 1.580645161 15.000000000 1.150000000 +7.387096774 1.870967742 15.000000000 1.150000000 +7.387096774 2.161290323 15.000000000 1.150000000 +7.387096774 2.451612903 15.000000000 1.150000000 +7.387096774 2.741935484 15.000000000 1.150000000 +7.387096774 3.032258065 15.103574890 1.151035749 +7.387096774 3.322580645 15.708449495 1.157084495 +7.387096774 3.612903226 16.133823742 1.161338237 +7.387096774 3.903225806 16.479227686 1.164792277 +7.387096774 4.193548387 16.778452741 1.167784527 +7.387096774 4.483870968 17.050023823 1.170500238 +7.387096774 4.774193548 17.305719073 1.173057191 +7.387096774 5.064516129 17.555546435 1.175555464 +7.387096774 5.354838710 17.806398651 1.178063987 +7.387096774 5.645161290 18.068098179 1.180680982 +7.387096774 5.935483871 18.349962605 1.183499626 +7.387096774 6.225806452 18.667017714 1.186670177 +7.387096774 6.516129032 19.041899081 1.190418991 +7.387096774 6.806451613 19.524964154 1.195249642 +7.387096774 7.096774194 19.999997043 1.199999970 +7.387096774 7.387096774 19.999997043 1.199999970 +7.387096774 7.677419355 19.999997043 1.199999970 +7.387096774 7.967741935 19.999997043 1.199999970 +7.387096774 8.258064516 19.999997043 1.199999970 +7.387096774 8.548387097 19.999997043 1.199999970 +7.387096774 8.838709677 19.999997043 1.199999970 +7.387096774 9.129032258 19.999997043 1.199999970 +7.387096774 9.419354839 19.999997043 1.199999970 +7.387096774 9.709677419 19.999997043 1.199999970 +7.387096774 10.000000000 19.999997043 1.199999970 +7.677419355 1.000000000 15.000000000 1.150000000 +7.677419355 1.290322581 15.000000000 1.150000000 +7.677419355 1.580645161 15.000000000 1.150000000 +7.677419355 1.870967742 15.000000000 1.150000000 +7.677419355 2.161290323 15.000000000 1.150000000 +7.677419355 2.451612903 15.000000000 1.150000000 +7.677419355 2.741935484 15.000000000 1.150000000 +7.677419355 3.032258065 15.103574890 1.151035749 +7.677419355 3.322580645 15.708449495 1.157084495 +7.677419355 3.612903226 16.133823742 1.161338237 +7.677419355 3.903225806 16.479227686 1.164792277 +7.677419355 4.193548387 16.778452741 1.167784527 +7.677419355 4.483870968 17.050023823 1.170500238 +7.677419355 4.774193548 17.305719073 1.173057191 +7.677419355 5.064516129 17.555546435 1.175555464 +7.677419355 5.354838710 17.806398651 1.178063987 +7.677419355 5.645161290 18.068098179 1.180680982 +7.677419355 5.935483871 18.349962605 1.183499626 +7.677419355 6.225806452 18.667017714 1.186670177 +7.677419355 6.516129032 19.041899081 1.190418991 +7.677419355 6.806451613 19.524964154 1.195249642 +7.677419355 7.096774194 19.999997043 1.199999970 +7.677419355 7.387096774 19.999997043 1.199999970 +7.677419355 7.677419355 19.999997043 1.199999970 +7.677419355 7.967741935 19.999997043 1.199999970 +7.677419355 8.258064516 19.999997043 1.199999970 +7.677419355 8.548387097 19.999997043 1.199999970 +7.677419355 8.838709677 19.999997043 1.199999970 +7.677419355 9.129032258 19.999997043 1.199999970 +7.677419355 9.419354839 19.999997043 1.199999970 +7.677419355 9.709677419 19.999997043 1.199999970 +7.677419355 10.000000000 19.999997043 1.199999970 +7.967741935 1.000000000 15.000000000 1.150000000 +7.967741935 1.290322581 15.000000000 1.150000000 +7.967741935 1.580645161 15.000000000 1.150000000 +7.967741935 1.870967742 15.000000000 1.150000000 +7.967741935 2.161290323 15.000000000 1.150000000 +7.967741935 2.451612903 15.000000000 1.150000000 +7.967741935 2.741935484 15.000000000 1.150000000 +7.967741935 3.032258065 15.103574890 1.151035749 +7.967741935 3.322580645 15.708449495 1.157084495 +7.967741935 3.612903226 16.133823742 1.161338237 +7.967741935 3.903225806 16.479227686 1.164792277 +7.967741935 4.193548387 16.778452741 1.167784527 +7.967741935 4.483870968 17.050023823 1.170500238 +7.967741935 4.774193548 17.305719073 1.173057191 +7.967741935 5.064516129 17.555546435 1.175555464 +7.967741935 5.354838710 17.806398651 1.178063987 +7.967741935 5.645161290 18.068098179 1.180680982 +7.967741935 5.935483871 18.349962605 1.183499626 +7.967741935 6.225806452 18.667017714 1.186670177 +7.967741935 6.516129032 19.041899081 1.190418991 +7.967741935 6.806451613 19.524964154 1.195249642 +7.967741935 7.096774194 19.999997043 1.199999970 +7.967741935 7.387096774 19.999997043 1.199999970 +7.967741935 7.677419355 19.999997043 1.199999970 +7.967741935 7.967741935 19.999997043 1.199999970 +7.967741935 8.258064516 19.999997043 1.199999970 +7.967741935 8.548387097 19.999997043 1.199999970 +7.967741935 8.838709677 19.999997043 1.199999970 +7.967741935 9.129032258 19.999997043 1.199999970 +7.967741935 9.419354839 19.999997043 1.199999970 +7.967741935 9.709677419 19.999997043 1.199999970 +7.967741935 10.000000000 19.999997043 1.199999970 +8.258064516 1.000000000 15.000000000 1.150000000 +8.258064516 1.290322581 15.000000000 1.150000000 +8.258064516 1.580645161 15.000000000 1.150000000 +8.258064516 1.870967742 15.000000000 1.150000000 +8.258064516 2.161290323 15.000000000 1.150000000 +8.258064516 2.451612903 15.000000000 1.150000000 +8.258064516 2.741935484 15.000000000 1.150000000 +8.258064516 3.032258065 15.103574890 1.151035749 +8.258064516 3.322580645 15.708449495 1.157084495 +8.258064516 3.612903226 16.133823742 1.161338237 +8.258064516 3.903225806 16.479227686 1.164792277 +8.258064516 4.193548387 16.778452741 1.167784527 +8.258064516 4.483870968 17.050023823 1.170500238 +8.258064516 4.774193548 17.305719073 1.173057191 +8.258064516 5.064516129 17.555546435 1.175555464 +8.258064516 5.354838710 17.806398651 1.178063987 +8.258064516 5.645161290 18.068098179 1.180680982 +8.258064516 5.935483871 18.349962605 1.183499626 +8.258064516 6.225806452 18.667017714 1.186670177 +8.258064516 6.516129032 19.041899081 1.190418991 +8.258064516 6.806451613 19.524964154 1.195249642 +8.258064516 7.096774194 19.999997043 1.199999970 +8.258064516 7.387096774 19.999997043 1.199999970 +8.258064516 7.677419355 19.999997043 1.199999970 +8.258064516 7.967741935 19.999997043 1.199999970 +8.258064516 8.258064516 19.999997043 1.199999970 +8.258064516 8.548387097 19.999997043 1.199999970 +8.258064516 8.838709677 19.999997043 1.199999970 +8.258064516 9.129032258 19.999997043 1.199999970 +8.258064516 9.419354839 19.999997043 1.199999970 +8.258064516 9.709677419 19.999997043 1.199999970 +8.258064516 10.000000000 19.999997043 1.199999970 +8.548387097 1.000000000 15.000000000 1.150000000 +8.548387097 1.290322581 15.000000000 1.150000000 +8.548387097 1.580645161 15.000000000 1.150000000 +8.548387097 1.870967742 15.000000000 1.150000000 +8.548387097 2.161290323 15.000000000 1.150000000 +8.548387097 2.451612903 15.000000000 1.150000000 +8.548387097 2.741935484 15.000000000 1.150000000 +8.548387097 3.032258065 15.103574890 1.151035749 +8.548387097 3.322580645 15.708449495 1.157084495 +8.548387097 3.612903226 16.133823742 1.161338237 +8.548387097 3.903225806 16.479227686 1.164792277 +8.548387097 4.193548387 16.778452741 1.167784527 +8.548387097 4.483870968 17.050023823 1.170500238 +8.548387097 4.774193548 17.305719073 1.173057191 +8.548387097 5.064516129 17.555546435 1.175555464 +8.548387097 5.354838710 17.806398651 1.178063987 +8.548387097 5.645161290 18.068098179 1.180680982 +8.548387097 5.935483871 18.349962605 1.183499626 +8.548387097 6.225806452 18.667017714 1.186670177 +8.548387097 6.516129032 19.041899081 1.190418991 +8.548387097 6.806451613 19.524964154 1.195249642 +8.548387097 7.096774194 19.999997043 1.199999970 +8.548387097 7.387096774 19.999997043 1.199999970 +8.548387097 7.677419355 19.999997043 1.199999970 +8.548387097 7.967741935 19.999997043 1.199999970 +8.548387097 8.258064516 19.999997043 1.199999970 +8.548387097 8.548387097 19.999997043 1.199999970 +8.548387097 8.838709677 19.999997043 1.199999970 +8.548387097 9.129032258 19.999997043 1.199999970 +8.548387097 9.419354839 19.999997043 1.199999970 +8.548387097 9.709677419 19.999997043 1.199999970 +8.548387097 10.000000000 19.999997043 1.199999970 +8.838709677 1.000000000 15.000000000 1.150000000 +8.838709677 1.290322581 15.000000000 1.150000000 +8.838709677 1.580645161 15.000000000 1.150000000 +8.838709677 1.870967742 15.000000000 1.150000000 +8.838709677 2.161290323 15.000000000 1.150000000 +8.838709677 2.451612903 15.000000000 1.150000000 +8.838709677 2.741935484 15.000000000 1.150000000 +8.838709677 3.032258065 15.103574890 1.151035749 +8.838709677 3.322580645 15.708449495 1.157084495 +8.838709677 3.612903226 16.133823742 1.161338237 +8.838709677 3.903225806 16.479227686 1.164792277 +8.838709677 4.193548387 16.778452741 1.167784527 +8.838709677 4.483870968 17.050023823 1.170500238 +8.838709677 4.774193548 17.305719073 1.173057191 +8.838709677 5.064516129 17.555546435 1.175555464 +8.838709677 5.354838710 17.806398651 1.178063987 +8.838709677 5.645161290 18.068098179 1.180680982 +8.838709677 5.935483871 18.349962605 1.183499626 +8.838709677 6.225806452 18.667017714 1.186670177 +8.838709677 6.516129032 19.041899081 1.190418991 +8.838709677 6.806451613 19.524964154 1.195249642 +8.838709677 7.096774194 19.999997043 1.199999970 +8.838709677 7.387096774 19.999997043 1.199999970 +8.838709677 7.677419355 19.999997043 1.199999970 +8.838709677 7.967741935 19.999997043 1.199999970 +8.838709677 8.258064516 19.999997043 1.199999970 +8.838709677 8.548387097 19.999997043 1.199999970 +8.838709677 8.838709677 19.999997043 1.199999970 +8.838709677 9.129032258 19.999997043 1.199999970 +8.838709677 9.419354839 19.999997043 1.199999970 +8.838709677 9.709677419 19.999997043 1.199999970 +8.838709677 10.000000000 19.999997043 1.199999970 +9.129032258 1.000000000 15.000000000 1.150000000 +9.129032258 1.290322581 15.000000000 1.150000000 +9.129032258 1.580645161 15.000000000 1.150000000 +9.129032258 1.870967742 15.000000000 1.150000000 +9.129032258 2.161290323 15.000000000 1.150000000 +9.129032258 2.451612903 15.000000000 1.150000000 +9.129032258 2.741935484 15.000000000 1.150000000 +9.129032258 3.032258065 15.103574890 1.151035749 +9.129032258 3.322580645 15.708449495 1.157084495 +9.129032258 3.612903226 16.133823742 1.161338237 +9.129032258 3.903225806 16.479227686 1.164792277 +9.129032258 4.193548387 16.778452741 1.167784527 +9.129032258 4.483870968 17.050023823 1.170500238 +9.129032258 4.774193548 17.305719073 1.173057191 +9.129032258 5.064516129 17.555546435 1.175555464 +9.129032258 5.354838710 17.806398651 1.178063987 +9.129032258 5.645161290 18.068098179 1.180680982 +9.129032258 5.935483871 18.349962605 1.183499626 +9.129032258 6.225806452 18.667017714 1.186670177 +9.129032258 6.516129032 19.041899081 1.190418991 +9.129032258 6.806451613 19.524964154 1.195249642 +9.129032258 7.096774194 19.999997043 1.199999970 +9.129032258 7.387096774 19.999997043 1.199999970 +9.129032258 7.677419355 19.999997043 1.199999970 +9.129032258 7.967741935 19.999997043 1.199999970 +9.129032258 8.258064516 19.999997043 1.199999970 +9.129032258 8.548387097 19.999997043 1.199999970 +9.129032258 8.838709677 19.999997043 1.199999970 +9.129032258 9.129032258 19.999997043 1.199999970 +9.129032258 9.419354839 19.999997043 1.199999970 +9.129032258 9.709677419 19.999997043 1.199999970 +9.129032258 10.000000000 19.999997043 1.199999970 +9.419354839 1.000000000 15.000000000 1.150000000 +9.419354839 1.290322581 15.000000000 1.150000000 +9.419354839 1.580645161 15.000000000 1.150000000 +9.419354839 1.870967742 15.000000000 1.150000000 +9.419354839 2.161290323 15.000000000 1.150000000 +9.419354839 2.451612903 15.000000000 1.150000000 +9.419354839 2.741935484 15.000000000 1.150000000 +9.419354839 3.032258065 15.103574890 1.151035749 +9.419354839 3.322580645 15.708449495 1.157084495 +9.419354839 3.612903226 16.133823742 1.161338237 +9.419354839 3.903225806 16.479227686 1.164792277 +9.419354839 4.193548387 16.778452741 1.167784527 +9.419354839 4.483870968 17.050023823 1.170500238 +9.419354839 4.774193548 17.305719073 1.173057191 +9.419354839 5.064516129 17.555546435 1.175555464 +9.419354839 5.354838710 17.806398651 1.178063987 +9.419354839 5.645161290 18.068098179 1.180680982 +9.419354839 5.935483871 18.349962605 1.183499626 +9.419354839 6.225806452 18.667017714 1.186670177 +9.419354839 6.516129032 19.041899081 1.190418991 +9.419354839 6.806451613 19.524964154 1.195249642 +9.419354839 7.096774194 19.999997043 1.199999970 +9.419354839 7.387096774 19.999997043 1.199999970 +9.419354839 7.677419355 19.999997043 1.199999970 +9.419354839 7.967741935 19.999997043 1.199999970 +9.419354839 8.258064516 19.999997043 1.199999970 +9.419354839 8.548387097 19.999997043 1.199999970 +9.419354839 8.838709677 19.999997043 1.199999970 +9.419354839 9.129032258 19.999997043 1.199999970 +9.419354839 9.419354839 19.999997043 1.199999970 +9.419354839 9.709677419 19.999997043 1.199999970 +9.419354839 10.000000000 19.999997043 1.199999970 +9.709677419 1.000000000 15.000000000 1.150000000 +9.709677419 1.290322581 15.000000000 1.150000000 +9.709677419 1.580645161 15.000000000 1.150000000 +9.709677419 1.870967742 15.000000000 1.150000000 +9.709677419 2.161290323 15.000000000 1.150000000 +9.709677419 2.451612903 15.000000000 1.150000000 +9.709677419 2.741935484 15.000000000 1.150000000 +9.709677419 3.032258065 15.103574890 1.151035749 +9.709677419 3.322580645 15.708449495 1.157084495 +9.709677419 3.612903226 16.133823742 1.161338237 +9.709677419 3.903225806 16.479227686 1.164792277 +9.709677419 4.193548387 16.778452741 1.167784527 +9.709677419 4.483870968 17.050023823 1.170500238 +9.709677419 4.774193548 17.305719073 1.173057191 +9.709677419 5.064516129 17.555546435 1.175555464 +9.709677419 5.354838710 17.806398651 1.178063987 +9.709677419 5.645161290 18.068098179 1.180680982 +9.709677419 5.935483871 18.349962605 1.183499626 +9.709677419 6.225806452 18.667017714 1.186670177 +9.709677419 6.516129032 19.041899081 1.190418991 +9.709677419 6.806451613 19.524964154 1.195249642 +9.709677419 7.096774194 19.999997043 1.199999970 +9.709677419 7.387096774 19.999997043 1.199999970 +9.709677419 7.677419355 19.999997043 1.199999970 +9.709677419 7.967741935 19.999997043 1.199999970 +9.709677419 8.258064516 19.999997043 1.199999970 +9.709677419 8.548387097 19.999997043 1.199999970 +9.709677419 8.838709677 19.999997043 1.199999970 +9.709677419 9.129032258 19.999997043 1.199999970 +9.709677419 9.419354839 19.999997043 1.199999970 +9.709677419 9.709677419 19.999997043 1.199999970 +9.709677419 10.000000000 19.999997043 1.199999970 +10.000000000 1.000000000 15.000000000 1.150000000 +10.000000000 1.290322581 15.000000000 1.150000000 +10.000000000 1.580645161 15.000000000 1.150000000 +10.000000000 1.870967742 15.000000000 1.150000000 +10.000000000 2.161290323 15.000000000 1.150000000 +10.000000000 2.451612903 15.000000000 1.150000000 +10.000000000 2.741935484 15.000000000 1.150000000 +10.000000000 3.032258065 15.103574890 1.151035749 +10.000000000 3.322580645 15.708449495 1.157084495 +10.000000000 3.612903226 16.133823742 1.161338237 +10.000000000 3.903225806 16.479227686 1.164792277 +10.000000000 4.193548387 16.778452741 1.167784527 +10.000000000 4.483870968 17.050023823 1.170500238 +10.000000000 4.774193548 17.305719073 1.173057191 +10.000000000 5.064516129 17.555546435 1.175555464 +10.000000000 5.354838710 17.806398651 1.178063987 +10.000000000 5.645161290 18.068098179 1.180680982 +10.000000000 5.935483871 18.349962605 1.183499626 +10.000000000 6.225806452 18.667017714 1.186670177 +10.000000000 6.516129032 19.041899081 1.190418991 +10.000000000 6.806451613 19.524964154 1.195249642 +10.000000000 7.096774194 19.999997043 1.199999970 +10.000000000 7.387096774 19.999997043 1.199999970 +10.000000000 7.677419355 19.999997043 1.199999970 +10.000000000 7.967741935 19.999997043 1.199999970 +10.000000000 8.258064516 19.999997043 1.199999970 +10.000000000 8.548387097 19.999997043 1.199999970 +10.000000000 8.838709677 19.999997043 1.199999970 +10.000000000 9.129032258 19.999997043 1.199999970 +10.000000000 9.419354839 19.999997043 1.199999970 +10.000000000 9.709677419 19.999997043 1.199999970 +10.000000000 10.000000000 19.999997043 1.199999970 diff --git a/examples/mamdani/octave/mamdani_tip_calculator.fll b/examples/mamdani/octave/mamdani_tip_calculator.fll new file mode 100644 index 0000000..516d870 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.fll @@ -0,0 +1,45 @@ +Engine: mamdani_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 0.000 30.000 + lock-range: false + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: AboutTenPercent Gaussian 10.000 2.000 + term: AboutFifteenPercent Gaussian 15.000 2.000 + term: AboutTwentyPercent Gaussian 20.000 2.000 +OutputVariable: CheckPlusTip + enabled: true + range: 1.000 1.300 + lock-range: false + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + term: PlusAboutTenPercent Gaussian 1.100 0.020 + term: PlusAboutFifteenPercent Gaussian 1.150 0.020 + term: PlusAboutTwentyPercent Gaussian 1.200 0.020 +RuleBlock: + enabled: true + conjunction: AlgebraicProduct + disjunction: Maximum + implication: Minimum + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent
\ No newline at end of file diff --git a/examples/mamdani/octave/mamdani_tip_calculator.java b/examples/mamdani/octave/mamdani_tip_calculator.java new file mode 100644 index 0000000..faea466 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.java @@ -0,0 +1,88 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class mamdani_tip_calculator{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("mamdani_tip_calculator"); +engine.setDescription(""); + +InputVariable FoodQuality = new InputVariable(); +FoodQuality.setName("FoodQuality"); +FoodQuality.setDescription(""); +FoodQuality.setEnabled(true); +FoodQuality.setRange(1.000, 10.000); +FoodQuality.setLockValueInRange(false); +FoodQuality.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(FoodQuality); + +InputVariable Service = new InputVariable(); +Service.setName("Service"); +Service.setDescription(""); +Service.setEnabled(true); +Service.setRange(1.000, 10.000); +Service.setLockValueInRange(false); +Service.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(Service); + +OutputVariable Tip = new OutputVariable(); +Tip.setName("Tip"); +Tip.setDescription(""); +Tip.setEnabled(true); +Tip.setRange(0.000, 30.000); +Tip.setLockValueInRange(false); +Tip.setAggregation(new AlgebraicSum()); +Tip.setDefuzzifier(new Centroid(200)); +Tip.setDefaultValue(Double.NaN); +Tip.setLockPreviousValue(false); +Tip.addTerm(new Gaussian("AboutTenPercent", 10.000, 2.000)); +Tip.addTerm(new Gaussian("AboutFifteenPercent", 15.000, 2.000)); +Tip.addTerm(new Gaussian("AboutTwentyPercent", 20.000, 2.000)); +engine.addOutputVariable(Tip); + +OutputVariable CheckPlusTip = new OutputVariable(); +CheckPlusTip.setName("CheckPlusTip"); +CheckPlusTip.setDescription(""); +CheckPlusTip.setEnabled(true); +CheckPlusTip.setRange(1.000, 1.300); +CheckPlusTip.setLockValueInRange(false); +CheckPlusTip.setAggregation(new AlgebraicSum()); +CheckPlusTip.setDefuzzifier(new Centroid(200)); +CheckPlusTip.setDefaultValue(Double.NaN); +CheckPlusTip.setLockPreviousValue(false); +CheckPlusTip.addTerm(new Gaussian("PlusAboutTenPercent", 1.100, 0.020)); +CheckPlusTip.addTerm(new Gaussian("PlusAboutFifteenPercent", 1.150, 0.020)); +CheckPlusTip.addTerm(new Gaussian("PlusAboutTwentyPercent", 1.200, 0.020)); +engine.addOutputVariable(CheckPlusTip); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new AlgebraicProduct()); +ruleBlock.setDisjunction(new Maximum()); +ruleBlock.setImplication(new Minimum()); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/mamdani/octave/mamdani_tip_calculator.pdf b/examples/mamdani/octave/mamdani_tip_calculator.pdf Binary files differnew file mode 100644 index 0000000..d62a142 --- /dev/null +++ b/examples/mamdani/octave/mamdani_tip_calculator.pdf diff --git a/examples/original/mamdani/AllTerms.fis b/examples/original/mamdani/AllTerms.fis new file mode 100644 index 0000000..04a36f1 --- /dev/null +++ b/examples/original/mamdani/AllTerms.fis @@ -0,0 +1,84 @@ +[System] +Name='qtfuzzylite' +Type='mamdani' +NumInputs=1 +NumOutputs=1 +NumRules=16 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='AllInputTerms' +Range=[0.000 6.500] +NumMFs=20 +MF1='A':'sigmf',[-20.000 0.500] +MF2='B':'zmf',[0.000 1.000] +MF3='C':'rampmf',[1.000 0.000] +MF4='D':'trimf',[0.500 1.000 1.500] +MF5='E':'trapmf',[1.000 1.250 1.750 2.000] +MF6='F':'concavemf',[0.850 0.250] +MF7='G':'rectmf',[1.750 2.250] +MF8='H':'discretemf',[2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000] +MF9='I':'gaussmf',[0.200 3.000] +MF10='J':'cosinemf',[3.250 0.650] +MF11='K':'gauss2mf',[0.100 3.500 0.300 3.300] +MF12='L':'spikemf',[3.640 1.040] +MF13='M':'gbellmf',[0.250 3.000 4.000] +MF14='N':'pimf',[4.000 4.500 4.500 5.000] +MF15='O':'concavemf',[5.650 6.250] +MF16='P':'dsigmf',[10.000 4.750 30.000 5.250] +MF17='Q':'psigmf',[20.000 5.250 -10.000 5.750] +MF18='R':'rampmf',[5.500 6.500] +MF19='S':'smf',[5.500 6.500] +MF20='T':'sigmf',[20.000 6.000] + +[Output1] +Name='AllOutputTerms' +Range=[0.000 6.500] +NumMFs=16 +MF1='A':'sigmf',[-20.000 0.500] +MF2='B':'zmf',[0.000 1.000] +MF3='C':'rampmf',[1.000 0.000] +MF4='D':'trimf',[0.500 1.000 1.500] +MF5='E':'trapmf',[1.000 1.250 1.750 2.000] +MF6='F':'concavemf',[0.850 0.250] +MF7='G':'rectmf',[1.750 2.250] +MF8='H':'discretemf',[2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000] +MF9='I':'gaussmf',[0.200 3.000] +MF10='J':'cosinemf',[3.250 0.650] +MF11='K':'gauss2mf',[0.100 3.500 0.300 3.300] +MF12='L':'spikemf',[3.640 1.040] +MF13='M':'gbellmf',[0.250 3.000 4.000] +MF14='N':'pimf',[4.000 4.500 4.500 5.000] +MF15='O':'concavemf',[5.650 6.250] +MF16='P':'dsigmf',[10.000 4.750 30.000 5.250] +MF17='Q':'psigmf',[20.000 5.250 -10.000 5.750] +MF18='R':'rampmf',[5.500 6.500] +MF19='S':'smf',[5.500 6.500] +MF20='T':'sigmf',[20.000 6.000] + + +[Rules] +1.000 , 20.000 (1.000) : 1 +2.000 , 19.000 (1.000) : 1 +3.000 , 18.000 (1.000) : 1 +4.000 , 17.000 (1.000) : 1 +5.000 , 16.000 (1.000) : 1 +6.000 , 15.000 (1.000) : 1 +7.000 , 14.000 (1.000) : 1 +8.000 , 13.000 (1.000) : 1 +9.000 , 12.000 (1.000) : 1 +10.000 , 11.000 (1.000) : 1 +11.000 , 10.000 (1.000) : 1 +12.000 , 9.000 (1.000) : 1 +13.000 , 8.000 (1.000) : 1 +14.000 , 7.000 (1.000) : 1 +15.000 , 6.000 (1.000) : 1 +16.000 , 5.000 (1.000) : 1 +17.000 , 4.000 (1.000) : 1 +18.000 , 3.000 (1.000) : 1 +19.000 , 2.000 (1.000) : 1 +20.000 , 1.000 (1.000) : 1 diff --git a/examples/original/mamdani/AllTerms.fll b/examples/original/mamdani/AllTerms.fll new file mode 100644 index 0000000..bed89c8 --- /dev/null +++ b/examples/original/mamdani/AllTerms.fll @@ -0,0 +1,78 @@ +Engine: AllTerms +InputVariable: AllInputTerms + enabled: true + range: 0.000 6.500 + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +OutputVariable: AllOutputTerms + enabled: true + range: 0.000 6.500 + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: A Sigmoid 0.500 -20.000 + term: B ZShape 0.000 1.000 + term: C Ramp 1.000 0.000 + term: D Triangle 0.500 1.000 1.500 + term: E Trapezoid 1.000 1.250 1.750 2.000 + term: F Concave 0.850 0.250 + term: G Rectangle 1.750 2.250 + term: H Discrete 2.000 0.000 2.250 1.000 2.500 0.500 2.750 1.000 3.000 0.000 + term: I Gaussian 3.000 0.200 + term: J Cosine 3.250 0.650 + term: K GaussianProduct 3.500 0.100 3.300 0.300 + term: L Spike 3.640 1.040 + term: M Bell 4.000 0.250 3.000 + term: N PiShape 4.000 4.500 4.500 5.000 + term: O Concave 5.650 6.250 + term: P SigmoidDifference 4.750 10.000 30.000 5.250 + term: Q SigmoidProduct 5.250 20.000 -10.000 5.750 + term: R Ramp 5.500 6.500 + term: S SShape 5.500 6.500 + term: T Sigmoid 6.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if AllInputTerms is A then AllOutputTerms is T + rule: if AllInputTerms is B then AllOutputTerms is S + rule: if AllInputTerms is C then AllOutputTerms is R + rule: if AllInputTerms is D then AllOutputTerms is Q + rule: if AllInputTerms is E then AllOutputTerms is P + rule: if AllInputTerms is F then AllOutputTerms is O + rule: if AllInputTerms is G then AllOutputTerms is N + rule: if AllInputTerms is H then AllOutputTerms is M + rule: if AllInputTerms is I then AllOutputTerms is L + rule: if AllInputTerms is J then AllOutputTerms is K + rule: if AllInputTerms is K then AllOutputTerms is J + rule: if AllInputTerms is L then AllOutputTerms is I + rule: if AllInputTerms is M then AllOutputTerms is H + rule: if AllInputTerms is N then AllOutputTerms is G + rule: if AllInputTerms is O then AllOutputTerms is F + rule: if AllInputTerms is P then AllOutputTerms is E + rule: if AllInputTerms is Q then AllOutputTerms is D + rule: if AllInputTerms is R then AllOutputTerms is C + rule: if AllInputTerms is S then AllOutputTerms is B + rule: if AllInputTerms is T then AllOutputTerms is A diff --git a/examples/original/mamdani/Laundry.fll b/examples/original/mamdani/Laundry.fll new file mode 100644 index 0000000..36e67d5 --- /dev/null +++ b/examples/original/mamdani/Laundry.fll @@ -0,0 +1,44 @@ +Engine: Laundry +InputVariable: Load + enabled: true + range: 0.000 6.000 + term: small Discrete 0.000 1.000 1.000 1.000 2.000 0.800 5.000 0.000 + term: normal Discrete 3.000 0.000 4.000 1.000 6.000 0.000 +InputVariable: Dirt + enabled: true + range: 0.000 6.000 + term: low Discrete 0.000 1.000 2.000 0.800 5.000 0.000 + term: high Discrete 1.000 0.000 2.000 0.200 4.000 0.800 6.000 1.000 +OutputVariable: Detergent + enabled: true + range: 0.000 80.000 + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + lock-range: false + term: less_than_usual Discrete 10.000 0.000 40.000 1.000 50.000 0.000 + term: usual Discrete 40.000 0.000 50.000 1.000 60.000 1.000 80.000 0.000 + term: more_than_usual Discrete 50.000 0.000 80.000 1.000 +OutputVariable: Cycle + enabled: true + range: 0.000 20.000 + aggregation: Maximum + defuzzifier: MeanOfMaximum 500 + default: nan + lock-previous: false + lock-range: false + term: short Discrete 0.000 1.000 10.000 1.000 20.000 0.000 + term: long Discrete 10.000 0.000 20.000 1.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: Maximum + implication: Minimum + activation: General + rule: if Load is small and Dirt is not high then Detergent is less_than_usual + rule: if Load is small and Dirt is high then Detergent is usual + rule: if Load is normal and Dirt is low then Detergent is less_than_usual + rule: if Load is normal and Dirt is high then Detergent is more_than_usual + rule: if Detergent is usual or Detergent is less_than_usual then Cycle is short + rule: if Detergent is more_than_usual then Cycle is long diff --git a/examples/original/mamdani/SimpleDimmer.fis b/examples/original/mamdani/SimpleDimmer.fis new file mode 100644 index 0000000..d3d229a --- /dev/null +++ b/examples/original/mamdani/SimpleDimmer.fis @@ -0,0 +1,39 @@ +[System] +Name='simple-dimmer' +Type='mamdani' +Version=3.0 +NumInputs=1 +NumOutputs=1 +NumRules=3 +AndMethod='' +OrMethod='' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='centroid' + +[Input1] +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + + +[Output1] +Name='Power' +Range=[0.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=3 +MF1='LOW':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='HIGH':'trimf',[0.500 0.750 1.000] + + +[Rules] +1 , 3 (1) : 1 +2 , 2 (1) : 1 +3 , 1 (1) : 1 + diff --git a/examples/original/mamdani/SimpleDimmer.fll b/examples/original/mamdani/SimpleDimmer.fll new file mode 100644 index 0000000..ab91b72 --- /dev/null +++ b/examples/original/mamdani/SimpleDimmer.fll @@ -0,0 +1,27 @@ +Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW diff --git a/examples/original/mamdani/SimpleDimmerInverse.fll b/examples/original/mamdani/SimpleDimmerInverse.fll new file mode 100644 index 0000000..3cd7a4a --- /dev/null +++ b/examples/original/mamdani/SimpleDimmerInverse.fll @@ -0,0 +1,41 @@ +Engine: SimpleDimmerInverse +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + aggregation: Maximum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: LOW Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: HIGH Triangle 0.500 0.750 1.000 +OutputVariable: InversePower + enabled: true + range: 0.000 1.000 + aggregation: Maximum + defuzzifier: Centroid 500 + default: nan + lock-previous: false + lock-range: false + term: LOW Cosine 0.200 0.500 + term: MEDIUM Cosine 0.500 0.500 + term: HIGH Cosine 0.800 0.500 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: Minimum + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW + rule: if Power is LOW then InversePower is HIGH + rule: if Power is MEDIUM then InversePower is MEDIUM + rule: if Power is HIGH then InversePower is LOW diff --git a/examples/original/mamdani/octave/COPYING b/examples/original/mamdani/octave/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/examples/original/mamdani/octave/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/examples/original/mamdani/octave/DESCRIPTION b/examples/original/mamdani/octave/DESCRIPTION new file mode 100644 index 0000000..35df57d --- /dev/null +++ b/examples/original/mamdani/octave/DESCRIPTION @@ -0,0 +1,12 @@ +Name: fuzzy-logic-toolkit +Version: 0.4.2 +Date: 2012-10-02 +Author: L. Markowsky <lmarkov@users.sourceforge.net> +Maintainer: L. Markowsky <lmarkov@users.sourceforge.net> +Title: Octave Fuzzy Logic Toolkit +Description: A mostly MATLAB-compatible fuzzy logic toolkit for Octave. +Depends: octave (>= 3.2.4) +Autoload: no +License: GPLv3+ +Url: http://octave.sf.net + http://sf.net/projects/octave-fuzzy diff --git a/examples/original/mamdani/octave/investment_portfolio.fis b/examples/original/mamdani/octave/investment_portfolio.fis new file mode 100644 index 0000000..49a01fd --- /dev/null +++ b/examples/original/mamdani/octave/investment_portfolio.fis @@ -0,0 +1,64 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: investment_portfolio.fis +## Last-Modified: 28 Aug 2012 + +[System] +Name='Investment-Portfolio' +Type='mamdani' +Version=2.0 +NumInputs=2 +NumOutputs=1 +NumRules=4 +AndMethod='einstein_product' +OrMethod='einstein_sum' +ImpMethod='einstein_product' +AggMethod='einstein_sum' +DefuzzMethod='centroid' + +[Input1] +Name='Age' +Range=[20 100] +NumMFs=2 +MF1='Young':'zmf',[30 90] +MF2='Old':'smf',[30 90] + +[Input2] +Name='Risk-Tolerance' +Range=[0 10] +NumMFs=2 +MF1='Low':'zmf',[2 8] +MF2='High':'smf',[2 8] + +[Output1] +Name='Percentage-In-Stocks' +Range=[0 100] +NumMFs=3 +MF1='About-Fifteen':'gaussmf',[10 15] +MF2='About-Fifty':'gaussmf',[10 50] +MF3='About-Eighty-Five':'gaussmf',[10 85] + +[Rules] +1 2, 3 (1) : 2 +2 1, 1 (1) : 2 +-2.3 -1.3, 2 (0.5) : 1 +-1.3 -2.3, 2 (0.5) : 1 diff --git a/examples/original/mamdani/octave/investment_portfolio.fll b/examples/original/mamdani/octave/investment_portfolio.fll new file mode 100644 index 0000000..a383512 --- /dev/null +++ b/examples/original/mamdani/octave/investment_portfolio.fll @@ -0,0 +1,32 @@ +Engine: investment_portfolio +InputVariable: Age + enabled: true + range: 20.000 100.000 + term: Young ZShape 30.000 90.000 + term: Old SShape 30.000 90.000 +InputVariable: RiskTolerance + enabled: true + range: 0.000 10.000 + term: Low ZShape 2.000 8.000 + term: High SShape 2.000 8.000 +OutputVariable: PercentageInStocks + enabled: true + range: 0.000 100.000 + aggregation: EinsteinSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: AboutFifteen Gaussian 15.000 10.000 + term: AboutFifty Gaussian 50.000 10.000 + term: AboutEightyFive Gaussian 85.000 10.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: EinsteinSum + implication: EinsteinProduct + activation: General + rule: if Age is Young or RiskTolerance is High then PercentageInStocks is AboutEightyFive + rule: if Age is Old or RiskTolerance is Low then PercentageInStocks is AboutFifteen + rule: if Age is not extremely Old and RiskTolerance is not extremely Low then PercentageInStocks is AboutFifty with 0.500 + rule: if Age is not extremely Young and RiskTolerance is not extremely High then PercentageInStocks is AboutFifty with 0.500 diff --git a/examples/original/mamdani/octave/mamdani_tip_calculator.fis b/examples/original/mamdani/octave/mamdani_tip_calculator.fis new file mode 100644 index 0000000..7029c58 --- /dev/null +++ b/examples/original/mamdani/octave/mamdani_tip_calculator.fis @@ -0,0 +1,72 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: mamdani_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + +[System] +Name='Mamdani-Tip-Calculator' +Type='mamdani' +Version=2.0 +NumInputs=2 +NumOutputs=2 +NumRules=4 +AndMethod='prod' +OrMethod='max' +ImpMethod='min' +AggMethod='sum' +DefuzzMethod='centroid' + +[Input1] +Name='Food-Quality' +Range=[1 10] +NumMFs=2 +MF1='Bad':'trapmf',[0 1 3 7] +MF2='Good':'trapmf',[3 7 10 11] + +[Input2] +Name='Service' +Range=[1 10] +NumMFs=2 +MF1='Bad':'trapmf',[0 1 3 7] +MF2='Good':'trapmf',[3 7 10 11] + +[Output1] +Name='Tip' +Range=[0 30] +NumMFs=3 +MF1='About-Ten-Percent':'gaussmf',[2 10] +MF2='About-Fifteen-Percent':'gaussmf',[2 15] +MF3='About-Twenty-Percent':'gaussmf',[2 20] + +[Output2] +Name='Check-Plus-Tip' +Range=[1 1.3] +NumMFs=3 +MF1='Plus-About-Ten-Percent':'gaussmf',[0.02 1.10] +MF2='Plus-About-Fifteen-Percent':'gaussmf',[0.02 1.15] +MF3='Plus-About-Twenty-Percent':'gaussmf',[0.02 1.20] + +[Rules] +1 1, 1 1 (1) : 1 +1 2, 2 2 (1) : 1 +2 1, 2 2 (1) : 1 +2 2, 3 3 (1) : 1 diff --git a/examples/original/mamdani/octave/mamdani_tip_calculator.fll b/examples/original/mamdani/octave/mamdani_tip_calculator.fll new file mode 100644 index 0000000..15a94b9 --- /dev/null +++ b/examples/original/mamdani/octave/mamdani_tip_calculator.fll @@ -0,0 +1,43 @@ +Engine: mamdani_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 0.000 30.000 + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: AboutTenPercent Gaussian 10.000 2.000 + term: AboutFifteenPercent Gaussian 15.000 2.000 + term: AboutTwentyPercent Gaussian 20.000 2.000 +OutputVariable: CheckPlusTip + enabled: true + range: 1.000 1.300 + aggregation: AlgebraicSum + defuzzifier: Centroid 200 + default: nan + lock-previous: false + lock-range: false + term: PlusAboutTenPercent Gaussian 1.100 0.020 + term: PlusAboutFifteenPercent Gaussian 1.150 0.020 + term: PlusAboutTwentyPercent Gaussian 1.200 0.020 +RuleBlock: + enabled: true + conjunction: AlgebraicProduct + disjunction: Maximum + implication: Minimum + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is AboutTenPercent and CheckPlusTip is PlusAboutTenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is AboutFifteenPercent and CheckPlusTip is PlusAboutFifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is AboutTwentyPercent and CheckPlusTip is PlusAboutTwentyPercent diff --git a/examples/original/takagi-sugeno/SimpleDimmer.fis b/examples/original/takagi-sugeno/SimpleDimmer.fis new file mode 100644 index 0000000..bb4e638 --- /dev/null +++ b/examples/original/takagi-sugeno/SimpleDimmer.fis @@ -0,0 +1,41 @@ +[System] +Name='simple-dimmer' +Type='sugeno' +Version=4.0 +NumInputs=1 +NumOutputs=1 +NumRules=3 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='sum' +DefuzzMethod='wtaver' + +[Input1] +Enabled=1 +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + + +[Output1] +Enabled=1 +Name='Power' +Range=[0.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=3 +MF1='LOW':'constant',[0.250] +MF2='MEDIUM':'constant',[0.500] +MF3='HIGH':'constant',[0.750] + + +[Rules] +1.000 , 3.000 (1) : 1 +2.000 , 2.000 (1) : 1 +3.000 , 1.000 (1) : 1 + diff --git a/examples/original/takagi-sugeno/SimpleDimmer.fll b/examples/original/takagi-sugeno/SimpleDimmer.fll new file mode 100644 index 0000000..dc46ec8 --- /dev/null +++ b/examples/original/takagi-sugeno/SimpleDimmer.fll @@ -0,0 +1,27 @@ +Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: LOW Constant 0.250 + term: MEDIUM Constant 0.500 + term: HIGH Constant 0.750 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW diff --git a/examples/original/takagi-sugeno/approximation.fis b/examples/original/takagi-sugeno/approximation.fis new file mode 100644 index 0000000..3627ccf --- /dev/null +++ b/examples/original/takagi-sugeno/approximation.fis @@ -0,0 +1,80 @@ +[System] +Name='approximation of sin(x)/x' +Type='sugeno' +Version=4.0 +NumInputs=1 +NumOutputs=3 +NumRules=10 +AndMethod='' +OrMethod='' +ImpMethod='prod' +AggMethod='sum' +DefuzzMethod='wtaver' + +[Input1] +Enabled=1 +Name='inputX' +Range=[0.000 10.000] +NumMFs=9 +MF1='NEAR_1':'trimf',[0.000 1.000 2.000] +MF2='NEAR_2':'trimf',[1.000 2.000 3.000] +MF3='NEAR_3':'trimf',[2.000 3.000 4.000] +MF4='NEAR_4':'trimf',[3.000 4.000 5.000] +MF5='NEAR_5':'trimf',[4.000 5.000 6.000] +MF6='NEAR_6':'trimf',[5.000 6.000 7.000] +MF7='NEAR_7':'trimf',[6.000 7.000 8.000] +MF8='NEAR_8':'trimf',[7.000 8.000 9.000] +MF9='NEAR_9':'trimf',[8.000 9.000 10.000] + + +[Output1] +Enabled=1 +Name='outputFx' +Range=[-1.000 1.000] +Default=nan +LockPrevious=1 +LockRange=0 +NumMFs=9 +MF1='f1':'constant',[0.840] +MF2='f2':'constant',[0.450] +MF3='f3':'constant',[0.040] +MF4='f4':'constant',[-0.180] +MF5='f5':'constant',[-0.190] +MF6='f6':'constant',[-0.040] +MF7='f7':'constant',[0.090] +MF8='f8':'constant',[0.120] +MF9='f9':'constant',[0.040] + +[Output2] +Enabled=1 +Name='trueFx' +Range=[-1.000 1.000] +Default=nan +LockPrevious=1 +LockRange=0 +NumMFs=1 +MF1='fx':'function',[sin ( inputX ) /inputX] + +[Output3] +Enabled=1 +Name='diffFx' +Range=[-1.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=1 +MF1='diff':'function',[fabs ( outputFx-trueFx )] + + +[Rules] +1.000 , 1.000 0.000 0.000 (1.000) : 1 +2.000 , 2.000 0.000 0.000 (1.000) : 1 +3.000 , 3.000 0.000 0.000 (1.000) : 1 +4.000 , 4.000 0.000 0.000 (1.000) : 1 +5.000 , 5.000 0.000 0.000 (1.000) : 1 +6.000 , 6.000 0.000 0.000 (1.000) : 1 +7.000 , 7.000 0.000 0.000 (1.000) : 1 +8.000 , 8.000 0.000 0.000 (1.000) : 1 +9.000 , 9.000 0.000 0.000 (1.000) : 1 +0.990 , 0.000 1.000 1.000 (1.000) : 1 + diff --git a/examples/original/takagi-sugeno/approximation.fll b/examples/original/takagi-sugeno/approximation.fll new file mode 100644 index 0000000..63964dc --- /dev/null +++ b/examples/original/takagi-sugeno/approximation.fll @@ -0,0 +1,64 @@ +Engine: approximation +InputVariable: inputX + enabled: true + range: 0.000 10.000 + term: NEAR_1 Triangle 0.000 1.000 2.000 + term: NEAR_2 Triangle 1.000 2.000 3.000 + term: NEAR_3 Triangle 2.000 3.000 4.000 + term: NEAR_4 Triangle 3.000 4.000 5.000 + term: NEAR_5 Triangle 4.000 5.000 6.000 + term: NEAR_6 Triangle 5.000 6.000 7.000 + term: NEAR_7 Triangle 6.000 7.000 8.000 + term: NEAR_8 Triangle 7.000 8.000 9.000 + term: NEAR_9 Triangle 8.000 9.000 10.000 +OutputVariable: outputFx + enabled: true + range: -1.000 1.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: true + lock-range: false + term: f1 Constant 0.840 + term: f2 Constant 0.450 + term: f3 Constant 0.040 + term: f4 Constant -0.180 + term: f5 Constant -0.190 + term: f6 Constant -0.040 + term: f7 Constant 0.090 + term: f8 Constant 0.120 + term: f9 Constant 0.040 +OutputVariable: trueFx + enabled: true + range: -1.000 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: true + lock-range: false + term: fx Function sin(inputX)/inputX +OutputVariable: diffFx + enabled: true + range: -1.000 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: false + lock-range: false + term: diff Function fabs(outputFx-trueFx) +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if inputX is NEAR_1 then outputFx is f1 + rule: if inputX is NEAR_2 then outputFx is f2 + rule: if inputX is NEAR_3 then outputFx is f3 + rule: if inputX is NEAR_4 then outputFx is f4 + rule: if inputX is NEAR_5 then outputFx is f5 + rule: if inputX is NEAR_6 then outputFx is f6 + rule: if inputX is NEAR_7 then outputFx is f7 + rule: if inputX is NEAR_8 then outputFx is f8 + rule: if inputX is NEAR_9 then outputFx is f9 + rule: if inputX is any then trueFx is fx and diffFx is diff diff --git a/examples/original/takagi-sugeno/octave/COPYING b/examples/original/takagi-sugeno/octave/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/examples/original/takagi-sugeno/octave/DESCRIPTION b/examples/original/takagi-sugeno/octave/DESCRIPTION new file mode 100644 index 0000000..35df57d --- /dev/null +++ b/examples/original/takagi-sugeno/octave/DESCRIPTION @@ -0,0 +1,12 @@ +Name: fuzzy-logic-toolkit +Version: 0.4.2 +Date: 2012-10-02 +Author: L. Markowsky <lmarkov@users.sourceforge.net> +Maintainer: L. Markowsky <lmarkov@users.sourceforge.net> +Title: Octave Fuzzy Logic Toolkit +Description: A mostly MATLAB-compatible fuzzy logic toolkit for Octave. +Depends: octave (>= 3.2.4) +Autoload: no +License: GPLv3+ +Url: http://octave.sf.net + http://sf.net/projects/octave-fuzzy diff --git a/examples/original/takagi-sugeno/octave/cubic_approximator.fis b/examples/original/takagi-sugeno/octave/cubic_approximator.fis new file mode 100644 index 0000000..49bf5b1 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/cubic_approximator.fis @@ -0,0 +1,81 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: cubic_approximator.fis +## Last-Modified: 28 Aug 2012 + +[System] +Name='Cubic-Approximator' +Type='sugeno' +Version=2.0 +NumInputs=1 +NumOutputs=1 +NumRules=11 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='sum' +DefuzzMethod='wtaver' + +[Input1] +Name='X' +Range=[-5 5] +NumMFs=11 +MF1 = 'About-Neg-Five':'trimf', [-6 -5 -4] +MF2 = 'About-Neg-Four':'trimf', [-5 -4 -3] +MF3 = 'About-Neg-Three':'trimf', [-4 -3 -2] +MF4 = 'About-Neg-Two':'trimf', [-3 -2 -1] +MF5 = 'About-Neg-One':'trimf', [-2 -1 0] +MF6 = 'About-Zero':'trimf', [-1 0 1] +MF7 = 'About-One':'trimf', [0 1 2] +MF8 = 'About-Two':'trimf', [1 2 3] +MF9 = 'About-Three':'trimf', [2 3 4] +MF10 = 'About-Four':'trimf', [3 4 5] +MF11 = 'About-Five':'trimf', [4 5 6] + +[Output1] +Name='Approx-X-Cubed' +Range=[-5 5] +NumMFs=11 +MF1 = 'Tangent-at-Neg-Five':'linear', [75 250] +MF2 = 'Tangent-at-Neg-Four':'linear', [48 128] +MF3 = 'Tangent-at-Neg-Three':'linear', [27 54] +MF4 = 'Tangent-at-Neg-Two':'linear', [12 16] +MF5 = 'Tangent-at-Neg-One':'linear', [3 2] +MF6 = 'Tangent-at-Zero':'linear', [0 0] +MF7 = 'Tangent-at-One':'linear', [3 -2] +MF8 = 'Tangent-at-Two':'linear', [12 -16] +MF9 = 'Tangent-at-Three':'linear', [27 -54] +MF10 = 'Tangent-at-Four':'linear', [48 -128] +MF11 = 'Tangent-at-Five':'linear', [75 -250] + +[Rules] +1, 1 (1) : 1 +2, 2 (1) : 1 +3, 3 (1) : 1 +4, 4 (1) : 1 +5, 5 (1) : 1 +6, 6 (1) : 1 +7, 7 (1) : 1 +8, 8 (1) : 1 +9, 9 (1) : 1 +10, 10 (1) : 1 +11, 11 (1) : 1 diff --git a/examples/original/takagi-sugeno/octave/cubic_approximator.fll b/examples/original/takagi-sugeno/octave/cubic_approximator.fll new file mode 100644 index 0000000..7d2c157 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/cubic_approximator.fll @@ -0,0 +1,51 @@ +Engine: cubic_approximator +InputVariable: X + enabled: true + range: -5.000 5.000 + term: AboutNegFive Triangle -6.000 -5.000 -4.000 + term: AboutNegFour Triangle -5.000 -4.000 -3.000 + term: AboutNegThree Triangle -4.000 -3.000 -2.000 + term: AboutNegTwo Triangle -3.000 -2.000 -1.000 + term: AboutNegOne Triangle -2.000 -1.000 0.000 + term: AboutZero Triangle -1.000 0.000 1.000 + term: AboutOne Triangle 0.000 1.000 2.000 + term: AboutTwo Triangle 1.000 2.000 3.000 + term: AboutThree Triangle 2.000 3.000 4.000 + term: AboutFour Triangle 3.000 4.000 5.000 + term: AboutFive Triangle 4.000 5.000 6.000 +OutputVariable: ApproxXCubed + enabled: true + range: -5.000 5.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: TangentatNegFive Linear 75.000 250.000 + term: TangentatNegFour Linear 48.000 128.000 + term: TangentatNegThree Linear 27.000 54.000 + term: TangentatNegTwo Linear 12.000 16.000 + term: TangentatNegOne Linear 3.000 2.000 + term: TangentatZero Linear 0.000 0.000 + term: TangentatOne Linear 3.000 -2.000 + term: TangentatTwo Linear 12.000 -16.000 + term: TangentatThree Linear 27.000 -54.000 + term: TangentatFour Linear 48.000 -128.000 + term: TangentatFive Linear 75.000 -250.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is AboutNegFive then ApproxXCubed is TangentatNegFive + rule: if X is AboutNegFour then ApproxXCubed is TangentatNegFour + rule: if X is AboutNegThree then ApproxXCubed is TangentatNegThree + rule: if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo + rule: if X is AboutNegOne then ApproxXCubed is TangentatNegOne + rule: if X is AboutZero then ApproxXCubed is TangentatZero + rule: if X is AboutOne then ApproxXCubed is TangentatOne + rule: if X is AboutTwo then ApproxXCubed is TangentatTwo + rule: if X is AboutThree then ApproxXCubed is TangentatThree + rule: if X is AboutFour then ApproxXCubed is TangentatFour + rule: if X is AboutFive then ApproxXCubed is TangentatFive diff --git a/examples/original/takagi-sugeno/octave/heart_disease_risk.fis b/examples/original/takagi-sugeno/octave/heart_disease_risk.fis new file mode 100644 index 0000000..e0e18e0 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/heart_disease_risk.fis @@ -0,0 +1,90 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: heart_disease_risk.fis +## Last-Modified: 28 Aug 2012 + +## Heart Disease Risk FIS + +[System] + + Name = 'Heart-Disease-Risk' + Type = 'sugeno' + Version = 2.0 + NumInputs = 2 + NumOutputs = 1 + NumRules = 15 + AndMethod = 'min' + OrMethod = 'max' + ImpMethod = 'prod' + AggMethod = 'sum' + DefuzzMethod = 'wtaver' + +[Input1] + + Name = 'LDL-Level' + Range = [0 300] + NumMFs = 5 + MF1 = 'Low' : 'trapmf', [-1 0 90 110] + MF2 = 'Low-Borderline' : 'trapmf', [90 110 120 140] + MF3 = 'Borderline' : 'trapmf', [120 140 150 170] + MF4 = 'High-Borderline' : 'trapmf', [150 170 180 200] + MF5 = 'High' : 'trapmf', [180 200 300 301] + +[Input2] + + Name = 'HDL-Level' + Range = [0 100] + NumMFs = 3 + + MF1 = 'Low-HDL' : 'trapmf', [-1 0 35 45] + MF2 = 'Moderate-HDL' : 'trapmf', [35 45 55 65] + MF3 = 'High-HDL' : 'trapmf', [55 65 100 101] + +[Output1] + + Name = 'Heart-Disease-Risk' + Range = [0 10] + NumMFs = 5 + + MF1 = 'No-Risk' : 'constant', [0] + MF2 = 'Low-Risk' : 'constant', [2.5] + MF3 = 'Medium-Risk' : 'constant', [5] + MF4 = 'High-Risk' : 'constant', [7.5] + MF5 = 'Extreme-Risk' : 'constant', [10] + +[Rules] + + 1 1, 3 (1) : 1 + 1 2, 2 (1) : 1 + 1 3, 1 (1) : 1 + 2 1, 3 (1) : 1 + 2 2, 2 (1) : 1 + 2 3, 2 (1) : 1 + 3 1, 4 (1) : 1 + 3 2, 3 (1) : 1 + 3 3, 2 (1) : 1 + 4 1, 4 (1) : 1 + 4 2, 4 (1) : 1 + 4 3, 3 (1) : 1 + 5 1, 5 (1) : 1 + 5 2, 4 (1) : 1 + 5 3, 3 (1) : 1 diff --git a/examples/original/takagi-sugeno/octave/heart_disease_risk.fll b/examples/original/takagi-sugeno/octave/heart_disease_risk.fll new file mode 100644 index 0000000..4c60466 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/heart_disease_risk.fll @@ -0,0 +1,49 @@ +Engine: heart_disease_risk +InputVariable: LDLLevel + enabled: true + range: 0.000 300.000 + term: Low Trapezoid -1.000 0.000 90.000 110.000 + term: LowBorderline Trapezoid 90.000 110.000 120.000 140.000 + term: Borderline Trapezoid 120.000 140.000 150.000 170.000 + term: HighBorderline Trapezoid 150.000 170.000 180.000 200.000 + term: High Trapezoid 180.000 200.000 300.000 301.000 +InputVariable: HDLLevel + enabled: true + range: 0.000 100.000 + term: LowHDL Trapezoid -1.000 0.000 35.000 45.000 + term: ModerateHDL Trapezoid 35.000 45.000 55.000 65.000 + term: HighHDL Trapezoid 55.000 65.000 100.000 101.000 +OutputVariable: HeartDiseaseRisk + enabled: true + range: 0.000 10.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: NoRisk Constant 0.000 + term: LowRisk Constant 2.500 + term: MediumRisk Constant 5.000 + term: HighRisk Constant 7.500 + term: ExtremeRisk Constant 10.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk + rule: if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk + rule: if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk diff --git a/examples/original/takagi-sugeno/octave/linear_tip_calculator.fis b/examples/original/takagi-sugeno/octave/linear_tip_calculator.fis new file mode 100644 index 0000000..f387ce1 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/linear_tip_calculator.fis @@ -0,0 +1,64 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: linear_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + +[System] +Name='Linear-Tip-Calculator' +Type='sugeno' +Version=2.0 +NumInputs=2 +NumOutputs=1 +NumRules=4 +AndMethod='min' +OrMethod='max' +ImpMethod='prod' +AggMethod='sum' +DefuzzMethod='wtaver' + +[Input1] +Name='Food-Quality' +Range=[1 10] +NumMFs=2 +MF1='Bad':'trapmf',[0 1 3 7] +MF2='Good':'trapmf',[3 7 10 11] + +[Input2] +Name='Service' +Range=[1 10] +NumMFs=2 +MF1='Bad':'trapmf',[0 1 3 7] +MF2='Good':'trapmf',[3 7 10 11] + +[Output1] +Name='Tip' +Range=[10 20] +NumMFs=3 +MF1='Ten-Percent':'linear',[0 0 10] +MF2='Fifteen-Percent':'linear',[0 0 15] +MF3='Twenty-Percent':'linear',[0 0 20] + +[Rules] +1 1, 1 (1) : 1 +1 2, 2 (1) : 1 +2 1, 2 (1) : 1 +2 2, 3 (1) : 1 diff --git a/examples/original/takagi-sugeno/octave/linear_tip_calculator.fll b/examples/original/takagi-sugeno/octave/linear_tip_calculator.fll new file mode 100644 index 0000000..3b99fc9 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/linear_tip_calculator.fll @@ -0,0 +1,32 @@ +Engine: linear_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 10.000 20.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: TenPercent Linear 0.000 0.000 10.000 + term: FifteenPercent Linear 0.000 0.000 15.000 + term: TwentyPercent Linear 0.000 0.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is TenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is TwentyPercent diff --git a/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fis b/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fis new file mode 100644 index 0000000..78786df --- /dev/null +++ b/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fis @@ -0,0 +1,98 @@ +## Copyright (C) 2011-2012 L. Markowsky <lmarkov@users.sourceforge.net> +## +## This file is part of the fuzzy-logic-toolkit. +## +## The fuzzy-logic-toolkit is free software; you can redistribute it +## and/or modify it under the terms of the GNU General Public License +## as published by the Free Software Foundation; either version 3 of +## the License, or (at your option) any later version. +## +## The fuzzy-logic-toolkit is distributed in the hope that it will be +## useful, but WITHOUT ANY WARRANTY; without even the implied warranty +## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with the fuzzy-logic-toolkit; see the file COPYING. If not, +## see <http://www.gnu.org/licenses/>. + +## Author: L. Markowsky +## Keywords: fuzzy-logic-toolkit fis +## Directory: fuzzy-logic-toolkit/inst/ +## Filename: sugeno_tip_calculator.fis +## Last-Modified: 28 Aug 2012 + +% Sugeno Tip Calculator + +% Computes cheap, average, and generous tips +% given food quality and service ratings. + +[System] + +Name = 'Sugeno-Tip-Calculator' +Type = 'sugeno' +Version = 1.0 +NumInputs = 2 +NumOutputs = 3 +NumRules = 10 +AndMethod = 'einstein_product' +OrMethod = 'einstein_sum' +ImpMethod = 'prod' +AggMethod = 'sum' +DefuzzMethod = 'wtaver' + +[Input1] + +Name = 'Food-Quality' +Range = [1 10] +NumMFs = 2 +MF1 = 'Bad' : 'trapmf', [0 1 3 7] +MF2 = 'Good' : 'trapmf', [3 7 10 11] + +[Input2] + +Name = 'Service' +Range = [1 10] +NumMFs = 2 +MF1 = 'Bad' : 'trapmf', [0 1 3 7] +MF2 = 'Good' : 'trapmf', [3 7 10 11] + +[Output1] + +Name = 'Cheap-Tip' +Range = [5 25] +NumMFs = 3 +MF1 = 'Low' : 'constant', [10] +MF2 = 'Medium' : 'constant', [15] +MF3 = 'High' : 'constant', [20] + +[Output2] + +Name = 'Average-Tip' +Range = [5 25] +NumMFs = 3 +MF1 = 'Low' : 'constant', [10] +MF2 = 'Medium' : 'constant', [15] +MF3 = 'High' : 'constant', [20] + +[Output3] + +Name = 'Generous-Tip' +Range = [5 25] +NumMFs = 3 +MF1 = 'Low' : 'constant', [10] +MF2 = 'Medium' : 'constant', [15] +MF3 = 'High' : 'constant', [20] + +[Rules] + + 1.30 1.30, 1.30 1.20 1.00 (1) : 1 + 2.00 1.30, 1.00 1.00 2.00 (1) : 1 + 2.20 1.20, 1.00 2.00 3.00 (1) : 1 + 1.00 1.00, 1.00 1.00 2.00 (1) : 1 + 2.00 1.00, 1.00 2.00 3.00 (1) : 1 + 2.30 1.00, 1.00 2.00 3.20 (1) : 1 + 1.00 2.00, 1.00 2.00 3.00 (1) : 1 + 2.00 2.00, 2.00 2.00 3.20 (1) : 1 + 1.20 2.20, 1.00 2.00 3.00 (1) : 1 + 2.40 2.40, 3.00 3.20 3.30 (1) : 1 diff --git a/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fll b/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fll new file mode 100644 index 0000000..19c5875 --- /dev/null +++ b/examples/original/takagi-sugeno/octave/sugeno_tip_calculator.fll @@ -0,0 +1,60 @@ +Engine: sugeno_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: CheapTip + enabled: true + range: 5.000 25.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: AverageTip + enabled: true + range: 5.000 25.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: GenerousTip + enabled: true + range: 5.000 25.000 + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + lock-range: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: none + implication: none + activation: General + rule: if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low + rule: if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High diff --git a/examples/original/tsukamoto/tsukamoto.fis b/examples/original/tsukamoto/tsukamoto.fis new file mode 100644 index 0000000..711e427 --- /dev/null +++ b/examples/original/tsukamoto/tsukamoto.fis @@ -0,0 +1,65 @@ +[System] +Name='' +Type='sugeno' +Version=4.0 +NumInputs=1 +NumOutputs=3 +NumRules=3 +AndMethod='' +OrMethod='' +ImpMethod='prod' +AggMethod='sum' +DefuzzMethod='wtaver' + +[Input1] +Enabled=1 +Name='X' +Range=[-10.000 10.000] +NumMFs=3 +MF1='small':'gbellmf',[5.000 3.000 -10.000] +MF2='medium':'gbellmf',[5.000 3.000 0.000] +MF3='large':'gbellmf',[5.000 3.000 10.000] + + +[Output1] +Enabled=1 +Name='A' +Range=[0.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=3 +MF1='a1':'rampmf',[0.000 0.250] +MF2='a2':'rampmf',[0.600 0.400] +MF3='a3':'rampmf',[0.700 1.000] + +[Output2] +Enabled=1 +Name='B' +Range=[0.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=3 +MF1='b1':'sigmf',[30.000 0.130] +MF2='b2':'sigmf',[-30.000 0.500] +MF3='b3':'sigmf',[30.000 0.830] + +[Output3] +Enabled=1 +Name='C' +Range=[0.000 1.000] +Default=nan +LockPrevious=0 +LockRange=0 +NumMFs=3 +MF1='c1':'smf',[0.000 0.250] +MF2='c2':'zmf',[0.300 0.600] +MF3='c3':'smf',[0.700 1.000] + + +[Rules] +1.0 , 1.0 1.0 1.0 (1) : 1 +2.0 , 2.0 2.0 2.0 (1) : 1 +3.0 , 3.0 3.0 3.0 (1) : 1 + diff --git a/examples/original/tsukamoto/tsukamoto.fll b/examples/original/tsukamoto/tsukamoto.fll new file mode 100644 index 0000000..b8acf99 --- /dev/null +++ b/examples/original/tsukamoto/tsukamoto.fll @@ -0,0 +1,60 @@ +Engine: tsukamoto +InputVariable: X + enabled: true + range: -10.000 10.000 + term: small Bell -10.000 5.000 3.000 + term: medium Bell 0.000 5.000 3.000 + term: large Bell 10.000 5.000 3.000 +OutputVariable: Ramps + enabled: true + range: 0.000 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: false + lock-range: false + term: b Ramp 0.600 0.400 + term: a Ramp 0.000 0.250 + term: c Ramp 0.700 1.000 +OutputVariable: Sigmoids + enabled: true + range: 0.020 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: false + lock-range: false + term: b Sigmoid 0.500 -30.000 + term: a Sigmoid 0.130 30.000 + term: c Sigmoid 0.830 30.000 +OutputVariable: ZSShapes + enabled: true + range: 0.000 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: false + lock-range: false + term: b ZShape 0.300 0.600 + term: a SShape 0.000 0.250 + term: c SShape 0.700 1.000 +OutputVariable: Concaves + enabled: true + range: 0.000 1.000 + aggregation: none + defuzzifier: WeightedAverage + default: nan + lock-previous: false + lock-range: false + term: b Concave 0.500 0.400 + term: a Concave 0.240 0.250 + term: c Concave 0.900 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a + rule: if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b + rule: if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c diff --git a/examples/takagi-sugeno/ObstacleAvoidance.R b/examples/takagi-sugeno/ObstacleAvoidance.R new file mode 100644 index 0000000..eb96813 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.R @@ -0,0 +1,57 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "ObstacleAvoidance" +engine.fll = "Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left" + +engine.fldFile = "ObstacleAvoidance.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("obstacle vs tsSteer") + +engine.plot.o1_i1 = ggplot(engine.df, aes(obstacle, tsSteer)) + + geom_line(aes(color=tsSteer), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("tsSteer vs obstacle") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/ObstacleAvoidance.cpp b/examples/takagi-sugeno/ObstacleAvoidance.cpp new file mode 100644 index 0000000..32d6ba9 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.cpp @@ -0,0 +1,49 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("ObstacleAvoidance"); +engine->setDescription(""); + +InputVariable* obstacle = new InputVariable; +obstacle->setName("obstacle"); +obstacle->setDescription(""); +obstacle->setEnabled(true); +obstacle->setRange(0.000, 1.000); +obstacle->setLockValueInRange(false); +obstacle->addTerm(new Ramp("left", 1.000, 0.000)); +obstacle->addTerm(new Ramp("right", 0.000, 1.000)); +engine->addInputVariable(obstacle); + +OutputVariable* tsSteer = new OutputVariable; +tsSteer->setName("tsSteer"); +tsSteer->setDescription(""); +tsSteer->setEnabled(true); +tsSteer->setRange(0.000, 1.000); +tsSteer->setLockValueInRange(false); +tsSteer->setAggregation(new Maximum); +tsSteer->setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer->setDefaultValue(fl::nan); +tsSteer->setLockPreviousValue(false); +tsSteer->addTerm(new Constant("left", 0.333)); +tsSteer->addTerm(new Constant("right", 0.666)); +engine->addOutputVariable(tsSteer); + +RuleBlock* takagiSugeno = new RuleBlock; +takagiSugeno->setName("takagiSugeno"); +takagiSugeno->setDescription(""); +takagiSugeno->setEnabled(true); +takagiSugeno->setConjunction(fl::null); +takagiSugeno->setDisjunction(fl::null); +takagiSugeno->setImplication(fl::null); +takagiSugeno->setActivation(new General); +takagiSugeno->addRule(Rule::parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno->addRule(Rule::parse("if obstacle is right then tsSteer is left", engine)); +engine->addRuleBlock(takagiSugeno); + + +} diff --git a/examples/takagi-sugeno/ObstacleAvoidance.fcl b/examples/takagi-sugeno/ObstacleAvoidance.fcl new file mode 100644 index 0000000..fc4348b --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.fcl @@ -0,0 +1,33 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK ObstacleAvoidance + +VAR_INPUT + obstacle: REAL; +END_VAR + +VAR_OUTPUT + tsSteer: REAL; +END_VAR + +FUZZIFY obstacle + RANGE := (0.000 .. 1.000); + TERM left := Ramp 1.000 0.000; + TERM right := Ramp 0.000 1.000; +END_FUZZIFY + +DEFUZZIFY tsSteer + RANGE := (0.000 .. 1.000); + TERM left := 0.333; + TERM right := 0.666; + METHOD : COGS; + ACCU : MAX; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK takagiSugeno + RULE 1 : if obstacle is left then tsSteer is right + RULE 2 : if obstacle is right then tsSteer is left +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/ObstacleAvoidance.fis b/examples/takagi-sugeno/ObstacleAvoidance.fis new file mode 100644 index 0000000..16c5791 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.fis @@ -0,0 +1,32 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='ObstacleAvoidance' +Type='sugeno' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=2 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='obstacle' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'rampmf',[1.000 0.000] +MF2='right':'rampmf',[0.000 1.000] + +[Output1] +Name='tsSteer' +Range=[0.000 1.000] +NumMFs=2 +MF1='left':'constant',[0.333] +MF2='right':'constant',[0.666] + +[Rules] +1.000 , 2.000 (1.000) : 1 +2.000 , 1.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/ObstacleAvoidance.fld b/examples/takagi-sugeno/ObstacleAvoidance.fld new file mode 100644 index 0000000..00467f3 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.fld @@ -0,0 +1,1025 @@ +obstacle tsSteer +0.000000000 0.666000000 +0.000977517 0.665674487 +0.001955034 0.665348974 +0.002932551 0.665023460 +0.003910068 0.664697947 +0.004887586 0.664372434 +0.005865103 0.664046921 +0.006842620 0.663721408 +0.007820137 0.663395894 +0.008797654 0.663070381 +0.009775171 0.662744868 +0.010752688 0.662419355 +0.011730205 0.662093842 +0.012707722 0.661768328 +0.013685239 0.661442815 +0.014662757 0.661117302 +0.015640274 0.660791789 +0.016617791 0.660466276 +0.017595308 0.660140762 +0.018572825 0.659815249 +0.019550342 0.659489736 +0.020527859 0.659164223 +0.021505376 0.658838710 +0.022482893 0.658513196 +0.023460411 0.658187683 +0.024437928 0.657862170 +0.025415445 0.657536657 +0.026392962 0.657211144 +0.027370479 0.656885630 +0.028347996 0.656560117 +0.029325513 0.656234604 +0.030303030 0.655909091 +0.031280547 0.655583578 +0.032258065 0.655258065 +0.033235582 0.654932551 +0.034213099 0.654607038 +0.035190616 0.654281525 +0.036168133 0.653956012 +0.037145650 0.653630499 +0.038123167 0.653304985 +0.039100684 0.652979472 +0.040078201 0.652653959 +0.041055718 0.652328446 +0.042033236 0.652002933 +0.043010753 0.651677419 +0.043988270 0.651351906 +0.044965787 0.651026393 +0.045943304 0.650700880 +0.046920821 0.650375367 +0.047898338 0.650049853 +0.048875855 0.649724340 +0.049853372 0.649398827 +0.050830890 0.649073314 +0.051808407 0.648747801 +0.052785924 0.648422287 +0.053763441 0.648096774 +0.054740958 0.647771261 +0.055718475 0.647445748 +0.056695992 0.647120235 +0.057673509 0.646794721 +0.058651026 0.646469208 +0.059628543 0.646143695 +0.060606061 0.645818182 +0.061583578 0.645492669 +0.062561095 0.645167155 +0.063538612 0.644841642 +0.064516129 0.644516129 +0.065493646 0.644190616 +0.066471163 0.643865103 +0.067448680 0.643539589 +0.068426197 0.643214076 +0.069403715 0.642888563 +0.070381232 0.642563050 +0.071358749 0.642237537 +0.072336266 0.641912023 +0.073313783 0.641586510 +0.074291300 0.641260997 +0.075268817 0.640935484 +0.076246334 0.640609971 +0.077223851 0.640284457 +0.078201369 0.639958944 +0.079178886 0.639633431 +0.080156403 0.639307918 +0.081133920 0.638982405 +0.082111437 0.638656891 +0.083088954 0.638331378 +0.084066471 0.638005865 +0.085043988 0.637680352 +0.086021505 0.637354839 +0.086999022 0.637029326 +0.087976540 0.636703812 +0.088954057 0.636378299 +0.089931574 0.636052786 +0.090909091 0.635727273 +0.091886608 0.635401760 +0.092864125 0.635076246 +0.093841642 0.634750733 +0.094819159 0.634425220 +0.095796676 0.634099707 +0.096774194 0.633774194 +0.097751711 0.633448680 +0.098729228 0.633123167 +0.099706745 0.632797654 +0.100684262 0.632472141 +0.101661779 0.632146628 +0.102639296 0.631821114 +0.103616813 0.631495601 +0.104594330 0.631170088 +0.105571848 0.630844575 +0.106549365 0.630519062 +0.107526882 0.630193548 +0.108504399 0.629868035 +0.109481916 0.629542522 +0.110459433 0.629217009 +0.111436950 0.628891496 +0.112414467 0.628565982 +0.113391984 0.628240469 +0.114369501 0.627914956 +0.115347019 0.627589443 +0.116324536 0.627263930 +0.117302053 0.626938416 +0.118279570 0.626612903 +0.119257087 0.626287390 +0.120234604 0.625961877 +0.121212121 0.625636364 +0.122189638 0.625310850 +0.123167155 0.624985337 +0.124144673 0.624659824 +0.125122190 0.624334311 +0.126099707 0.624008798 +0.127077224 0.623683284 +0.128054741 0.623357771 +0.129032258 0.623032258 +0.130009775 0.622706745 +0.130987292 0.622381232 +0.131964809 0.622055718 +0.132942326 0.621730205 +0.133919844 0.621404692 +0.134897361 0.621079179 +0.135874878 0.620753666 +0.136852395 0.620428152 +0.137829912 0.620102639 +0.138807429 0.619777126 +0.139784946 0.619451613 +0.140762463 0.619126100 +0.141739980 0.618800587 +0.142717498 0.618475073 +0.143695015 0.618149560 +0.144672532 0.617824047 +0.145650049 0.617498534 +0.146627566 0.617173021 +0.147605083 0.616847507 +0.148582600 0.616521994 +0.149560117 0.616196481 +0.150537634 0.615870968 +0.151515152 0.615545455 +0.152492669 0.615219941 +0.153470186 0.614894428 +0.154447703 0.614568915 +0.155425220 0.614243402 +0.156402737 0.613917889 +0.157380254 0.613592375 +0.158357771 0.613266862 +0.159335288 0.612941349 +0.160312805 0.612615836 +0.161290323 0.612290323 +0.162267840 0.611964809 +0.163245357 0.611639296 +0.164222874 0.611313783 +0.165200391 0.610988270 +0.166177908 0.610662757 +0.167155425 0.610337243 +0.168132942 0.610011730 +0.169110459 0.609686217 +0.170087977 0.609360704 +0.171065494 0.609035191 +0.172043011 0.608709677 +0.173020528 0.608384164 +0.173998045 0.608058651 +0.174975562 0.607733138 +0.175953079 0.607407625 +0.176930596 0.607082111 +0.177908113 0.606756598 +0.178885630 0.606431085 +0.179863148 0.606105572 +0.180840665 0.605780059 +0.181818182 0.605454545 +0.182795699 0.605129032 +0.183773216 0.604803519 +0.184750733 0.604478006 +0.185728250 0.604152493 +0.186705767 0.603826979 +0.187683284 0.603501466 +0.188660802 0.603175953 +0.189638319 0.602850440 +0.190615836 0.602524927 +0.191593353 0.602199413 +0.192570870 0.601873900 +0.193548387 0.601548387 +0.194525904 0.601222874 +0.195503421 0.600897361 +0.196480938 0.600571848 +0.197458456 0.600246334 +0.198435973 0.599920821 +0.199413490 0.599595308 +0.200391007 0.599269795 +0.201368524 0.598944282 +0.202346041 0.598618768 +0.203323558 0.598293255 +0.204301075 0.597967742 +0.205278592 0.597642229 +0.206256109 0.597316716 +0.207233627 0.596991202 +0.208211144 0.596665689 +0.209188661 0.596340176 +0.210166178 0.596014663 +0.211143695 0.595689150 +0.212121212 0.595363636 +0.213098729 0.595038123 +0.214076246 0.594712610 +0.215053763 0.594387097 +0.216031281 0.594061584 +0.217008798 0.593736070 +0.217986315 0.593410557 +0.218963832 0.593085044 +0.219941349 0.592759531 +0.220918866 0.592434018 +0.221896383 0.592108504 +0.222873900 0.591782991 +0.223851417 0.591457478 +0.224828935 0.591131965 +0.225806452 0.590806452 +0.226783969 0.590480938 +0.227761486 0.590155425 +0.228739003 0.589829912 +0.229716520 0.589504399 +0.230694037 0.589178886 +0.231671554 0.588853372 +0.232649071 0.588527859 +0.233626588 0.588202346 +0.234604106 0.587876833 +0.235581623 0.587551320 +0.236559140 0.587225806 +0.237536657 0.586900293 +0.238514174 0.586574780 +0.239491691 0.586249267 +0.240469208 0.585923754 +0.241446725 0.585598240 +0.242424242 0.585272727 +0.243401760 0.584947214 +0.244379277 0.584621701 +0.245356794 0.584296188 +0.246334311 0.583970674 +0.247311828 0.583645161 +0.248289345 0.583319648 +0.249266862 0.582994135 +0.250244379 0.582668622 +0.251221896 0.582343109 +0.252199413 0.582017595 +0.253176931 0.581692082 +0.254154448 0.581366569 +0.255131965 0.581041056 +0.256109482 0.580715543 +0.257086999 0.580390029 +0.258064516 0.580064516 +0.259042033 0.579739003 +0.260019550 0.579413490 +0.260997067 0.579087977 +0.261974585 0.578762463 +0.262952102 0.578436950 +0.263929619 0.578111437 +0.264907136 0.577785924 +0.265884653 0.577460411 +0.266862170 0.577134897 +0.267839687 0.576809384 +0.268817204 0.576483871 +0.269794721 0.576158358 +0.270772239 0.575832845 +0.271749756 0.575507331 +0.272727273 0.575181818 +0.273704790 0.574856305 +0.274682307 0.574530792 +0.275659824 0.574205279 +0.276637341 0.573879765 +0.277614858 0.573554252 +0.278592375 0.573228739 +0.279569892 0.572903226 +0.280547410 0.572577713 +0.281524927 0.572252199 +0.282502444 0.571926686 +0.283479961 0.571601173 +0.284457478 0.571275660 +0.285434995 0.570950147 +0.286412512 0.570624633 +0.287390029 0.570299120 +0.288367546 0.569973607 +0.289345064 0.569648094 +0.290322581 0.569322581 +0.291300098 0.568997067 +0.292277615 0.568671554 +0.293255132 0.568346041 +0.294232649 0.568020528 +0.295210166 0.567695015 +0.296187683 0.567369501 +0.297165200 0.567043988 +0.298142717 0.566718475 +0.299120235 0.566392962 +0.300097752 0.566067449 +0.301075269 0.565741935 +0.302052786 0.565416422 +0.303030303 0.565090909 +0.304007820 0.564765396 +0.304985337 0.564439883 +0.305962854 0.564114370 +0.306940371 0.563788856 +0.307917889 0.563463343 +0.308895406 0.563137830 +0.309872923 0.562812317 +0.310850440 0.562486804 +0.311827957 0.562161290 +0.312805474 0.561835777 +0.313782991 0.561510264 +0.314760508 0.561184751 +0.315738025 0.560859238 +0.316715543 0.560533724 +0.317693060 0.560208211 +0.318670577 0.559882698 +0.319648094 0.559557185 +0.320625611 0.559231672 +0.321603128 0.558906158 +0.322580645 0.558580645 +0.323558162 0.558255132 +0.324535679 0.557929619 +0.325513196 0.557604106 +0.326490714 0.557278592 +0.327468231 0.556953079 +0.328445748 0.556627566 +0.329423265 0.556302053 +0.330400782 0.555976540 +0.331378299 0.555651026 +0.332355816 0.555325513 +0.333333333 0.555000000 +0.334310850 0.554674487 +0.335288368 0.554348974 +0.336265885 0.554023460 +0.337243402 0.553697947 +0.338220919 0.553372434 +0.339198436 0.553046921 +0.340175953 0.552721408 +0.341153470 0.552395894 +0.342130987 0.552070381 +0.343108504 0.551744868 +0.344086022 0.551419355 +0.345063539 0.551093842 +0.346041056 0.550768328 +0.347018573 0.550442815 +0.347996090 0.550117302 +0.348973607 0.549791789 +0.349951124 0.549466276 +0.350928641 0.549140762 +0.351906158 0.548815249 +0.352883675 0.548489736 +0.353861193 0.548164223 +0.354838710 0.547838710 +0.355816227 0.547513196 +0.356793744 0.547187683 +0.357771261 0.546862170 +0.358748778 0.546536657 +0.359726295 0.546211144 +0.360703812 0.545885630 +0.361681329 0.545560117 +0.362658847 0.545234604 +0.363636364 0.544909091 +0.364613881 0.544583578 +0.365591398 0.544258065 +0.366568915 0.543932551 +0.367546432 0.543607038 +0.368523949 0.543281525 +0.369501466 0.542956012 +0.370478983 0.542630499 +0.371456500 0.542304985 +0.372434018 0.541979472 +0.373411535 0.541653959 +0.374389052 0.541328446 +0.375366569 0.541002933 +0.376344086 0.540677419 +0.377321603 0.540351906 +0.378299120 0.540026393 +0.379276637 0.539700880 +0.380254154 0.539375367 +0.381231672 0.539049853 +0.382209189 0.538724340 +0.383186706 0.538398827 +0.384164223 0.538073314 +0.385141740 0.537747801 +0.386119257 0.537422287 +0.387096774 0.537096774 +0.388074291 0.536771261 +0.389051808 0.536445748 +0.390029326 0.536120235 +0.391006843 0.535794721 +0.391984360 0.535469208 +0.392961877 0.535143695 +0.393939394 0.534818182 +0.394916911 0.534492669 +0.395894428 0.534167155 +0.396871945 0.533841642 +0.397849462 0.533516129 +0.398826979 0.533190616 +0.399804497 0.532865103 +0.400782014 0.532539589 +0.401759531 0.532214076 +0.402737048 0.531888563 +0.403714565 0.531563050 +0.404692082 0.531237537 +0.405669599 0.530912023 +0.406647116 0.530586510 +0.407624633 0.530260997 +0.408602151 0.529935484 +0.409579668 0.529609971 +0.410557185 0.529284457 +0.411534702 0.528958944 +0.412512219 0.528633431 +0.413489736 0.528307918 +0.414467253 0.527982405 +0.415444770 0.527656891 +0.416422287 0.527331378 +0.417399804 0.527005865 +0.418377322 0.526680352 +0.419354839 0.526354839 +0.420332356 0.526029326 +0.421309873 0.525703812 +0.422287390 0.525378299 +0.423264907 0.525052786 +0.424242424 0.524727273 +0.425219941 0.524401760 +0.426197458 0.524076246 +0.427174976 0.523750733 +0.428152493 0.523425220 +0.429130010 0.523099707 +0.430107527 0.522774194 +0.431085044 0.522448680 +0.432062561 0.522123167 +0.433040078 0.521797654 +0.434017595 0.521472141 +0.434995112 0.521146628 +0.435972630 0.520821114 +0.436950147 0.520495601 +0.437927664 0.520170088 +0.438905181 0.519844575 +0.439882698 0.519519062 +0.440860215 0.519193548 +0.441837732 0.518868035 +0.442815249 0.518542522 +0.443792766 0.518217009 +0.444770283 0.517891496 +0.445747801 0.517565982 +0.446725318 0.517240469 +0.447702835 0.516914956 +0.448680352 0.516589443 +0.449657869 0.516263930 +0.450635386 0.515938416 +0.451612903 0.515612903 +0.452590420 0.515287390 +0.453567937 0.514961877 +0.454545455 0.514636364 +0.455522972 0.514310850 +0.456500489 0.513985337 +0.457478006 0.513659824 +0.458455523 0.513334311 +0.459433040 0.513008798 +0.460410557 0.512683284 +0.461388074 0.512357771 +0.462365591 0.512032258 +0.463343109 0.511706745 +0.464320626 0.511381232 +0.465298143 0.511055718 +0.466275660 0.510730205 +0.467253177 0.510404692 +0.468230694 0.510079179 +0.469208211 0.509753666 +0.470185728 0.509428152 +0.471163245 0.509102639 +0.472140762 0.508777126 +0.473118280 0.508451613 +0.474095797 0.508126100 +0.475073314 0.507800587 +0.476050831 0.507475073 +0.477028348 0.507149560 +0.478005865 0.506824047 +0.478983382 0.506498534 +0.479960899 0.506173021 +0.480938416 0.505847507 +0.481915934 0.505521994 +0.482893451 0.505196481 +0.483870968 0.504870968 +0.484848485 0.504545455 +0.485826002 0.504219941 +0.486803519 0.503894428 +0.487781036 0.503568915 +0.488758553 0.503243402 +0.489736070 0.502917889 +0.490713587 0.502592375 +0.491691105 0.502266862 +0.492668622 0.501941349 +0.493646139 0.501615836 +0.494623656 0.501290323 +0.495601173 0.500964809 +0.496578690 0.500639296 +0.497556207 0.500313783 +0.498533724 0.499988270 +0.499511241 0.499662757 +0.500488759 0.499337243 +0.501466276 0.499011730 +0.502443793 0.498686217 +0.503421310 0.498360704 +0.504398827 0.498035191 +0.505376344 0.497709677 +0.506353861 0.497384164 +0.507331378 0.497058651 +0.508308895 0.496733138 +0.509286413 0.496407625 +0.510263930 0.496082111 +0.511241447 0.495756598 +0.512218964 0.495431085 +0.513196481 0.495105572 +0.514173998 0.494780059 +0.515151515 0.494454545 +0.516129032 0.494129032 +0.517106549 0.493803519 +0.518084066 0.493478006 +0.519061584 0.493152493 +0.520039101 0.492826979 +0.521016618 0.492501466 +0.521994135 0.492175953 +0.522971652 0.491850440 +0.523949169 0.491524927 +0.524926686 0.491199413 +0.525904203 0.490873900 +0.526881720 0.490548387 +0.527859238 0.490222874 +0.528836755 0.489897361 +0.529814272 0.489571848 +0.530791789 0.489246334 +0.531769306 0.488920821 +0.532746823 0.488595308 +0.533724340 0.488269795 +0.534701857 0.487944282 +0.535679374 0.487618768 +0.536656891 0.487293255 +0.537634409 0.486967742 +0.538611926 0.486642229 +0.539589443 0.486316716 +0.540566960 0.485991202 +0.541544477 0.485665689 +0.542521994 0.485340176 +0.543499511 0.485014663 +0.544477028 0.484689150 +0.545454545 0.484363636 +0.546432063 0.484038123 +0.547409580 0.483712610 +0.548387097 0.483387097 +0.549364614 0.483061584 +0.550342131 0.482736070 +0.551319648 0.482410557 +0.552297165 0.482085044 +0.553274682 0.481759531 +0.554252199 0.481434018 +0.555229717 0.481108504 +0.556207234 0.480782991 +0.557184751 0.480457478 +0.558162268 0.480131965 +0.559139785 0.479806452 +0.560117302 0.479480938 +0.561094819 0.479155425 +0.562072336 0.478829912 +0.563049853 0.478504399 +0.564027370 0.478178886 +0.565004888 0.477853372 +0.565982405 0.477527859 +0.566959922 0.477202346 +0.567937439 0.476876833 +0.568914956 0.476551320 +0.569892473 0.476225806 +0.570869990 0.475900293 +0.571847507 0.475574780 +0.572825024 0.475249267 +0.573802542 0.474923754 +0.574780059 0.474598240 +0.575757576 0.474272727 +0.576735093 0.473947214 +0.577712610 0.473621701 +0.578690127 0.473296188 +0.579667644 0.472970674 +0.580645161 0.472645161 +0.581622678 0.472319648 +0.582600196 0.471994135 +0.583577713 0.471668622 +0.584555230 0.471343109 +0.585532747 0.471017595 +0.586510264 0.470692082 +0.587487781 0.470366569 +0.588465298 0.470041056 +0.589442815 0.469715543 +0.590420332 0.469390029 +0.591397849 0.469064516 +0.592375367 0.468739003 +0.593352884 0.468413490 +0.594330401 0.468087977 +0.595307918 0.467762463 +0.596285435 0.467436950 +0.597262952 0.467111437 +0.598240469 0.466785924 +0.599217986 0.466460411 +0.600195503 0.466134897 +0.601173021 0.465809384 +0.602150538 0.465483871 +0.603128055 0.465158358 +0.604105572 0.464832845 +0.605083089 0.464507331 +0.606060606 0.464181818 +0.607038123 0.463856305 +0.608015640 0.463530792 +0.608993157 0.463205279 +0.609970674 0.462879765 +0.610948192 0.462554252 +0.611925709 0.462228739 +0.612903226 0.461903226 +0.613880743 0.461577713 +0.614858260 0.461252199 +0.615835777 0.460926686 +0.616813294 0.460601173 +0.617790811 0.460275660 +0.618768328 0.459950147 +0.619745846 0.459624633 +0.620723363 0.459299120 +0.621700880 0.458973607 +0.622678397 0.458648094 +0.623655914 0.458322581 +0.624633431 0.457997067 +0.625610948 0.457671554 +0.626588465 0.457346041 +0.627565982 0.457020528 +0.628543500 0.456695015 +0.629521017 0.456369501 +0.630498534 0.456043988 +0.631476051 0.455718475 +0.632453568 0.455392962 +0.633431085 0.455067449 +0.634408602 0.454741935 +0.635386119 0.454416422 +0.636363636 0.454090909 +0.637341153 0.453765396 +0.638318671 0.453439883 +0.639296188 0.453114370 +0.640273705 0.452788856 +0.641251222 0.452463343 +0.642228739 0.452137830 +0.643206256 0.451812317 +0.644183773 0.451486804 +0.645161290 0.451161290 +0.646138807 0.450835777 +0.647116325 0.450510264 +0.648093842 0.450184751 +0.649071359 0.449859238 +0.650048876 0.449533724 +0.651026393 0.449208211 +0.652003910 0.448882698 +0.652981427 0.448557185 +0.653958944 0.448231672 +0.654936461 0.447906158 +0.655913978 0.447580645 +0.656891496 0.447255132 +0.657869013 0.446929619 +0.658846530 0.446604106 +0.659824047 0.446278592 +0.660801564 0.445953079 +0.661779081 0.445627566 +0.662756598 0.445302053 +0.663734115 0.444976540 +0.664711632 0.444651026 +0.665689150 0.444325513 +0.666666667 0.444000000 +0.667644184 0.443674487 +0.668621701 0.443348974 +0.669599218 0.443023460 +0.670576735 0.442697947 +0.671554252 0.442372434 +0.672531769 0.442046921 +0.673509286 0.441721408 +0.674486804 0.441395894 +0.675464321 0.441070381 +0.676441838 0.440744868 +0.677419355 0.440419355 +0.678396872 0.440093842 +0.679374389 0.439768328 +0.680351906 0.439442815 +0.681329423 0.439117302 +0.682306940 0.438791789 +0.683284457 0.438466276 +0.684261975 0.438140762 +0.685239492 0.437815249 +0.686217009 0.437489736 +0.687194526 0.437164223 +0.688172043 0.436838710 +0.689149560 0.436513196 +0.690127077 0.436187683 +0.691104594 0.435862170 +0.692082111 0.435536657 +0.693059629 0.435211144 +0.694037146 0.434885630 +0.695014663 0.434560117 +0.695992180 0.434234604 +0.696969697 0.433909091 +0.697947214 0.433583578 +0.698924731 0.433258065 +0.699902248 0.432932551 +0.700879765 0.432607038 +0.701857283 0.432281525 +0.702834800 0.431956012 +0.703812317 0.431630499 +0.704789834 0.431304985 +0.705767351 0.430979472 +0.706744868 0.430653959 +0.707722385 0.430328446 +0.708699902 0.430002933 +0.709677419 0.429677419 +0.710654936 0.429351906 +0.711632454 0.429026393 +0.712609971 0.428700880 +0.713587488 0.428375367 +0.714565005 0.428049853 +0.715542522 0.427724340 +0.716520039 0.427398827 +0.717497556 0.427073314 +0.718475073 0.426747801 +0.719452590 0.426422287 +0.720430108 0.426096774 +0.721407625 0.425771261 +0.722385142 0.425445748 +0.723362659 0.425120235 +0.724340176 0.424794721 +0.725317693 0.424469208 +0.726295210 0.424143695 +0.727272727 0.423818182 +0.728250244 0.423492669 +0.729227761 0.423167155 +0.730205279 0.422841642 +0.731182796 0.422516129 +0.732160313 0.422190616 +0.733137830 0.421865103 +0.734115347 0.421539589 +0.735092864 0.421214076 +0.736070381 0.420888563 +0.737047898 0.420563050 +0.738025415 0.420237537 +0.739002933 0.419912023 +0.739980450 0.419586510 +0.740957967 0.419260997 +0.741935484 0.418935484 +0.742913001 0.418609971 +0.743890518 0.418284457 +0.744868035 0.417958944 +0.745845552 0.417633431 +0.746823069 0.417307918 +0.747800587 0.416982405 +0.748778104 0.416656891 +0.749755621 0.416331378 +0.750733138 0.416005865 +0.751710655 0.415680352 +0.752688172 0.415354839 +0.753665689 0.415029326 +0.754643206 0.414703812 +0.755620723 0.414378299 +0.756598240 0.414052786 +0.757575758 0.413727273 +0.758553275 0.413401760 +0.759530792 0.413076246 +0.760508309 0.412750733 +0.761485826 0.412425220 +0.762463343 0.412099707 +0.763440860 0.411774194 +0.764418377 0.411448680 +0.765395894 0.411123167 +0.766373412 0.410797654 +0.767350929 0.410472141 +0.768328446 0.410146628 +0.769305963 0.409821114 +0.770283480 0.409495601 +0.771260997 0.409170088 +0.772238514 0.408844575 +0.773216031 0.408519062 +0.774193548 0.408193548 +0.775171065 0.407868035 +0.776148583 0.407542522 +0.777126100 0.407217009 +0.778103617 0.406891496 +0.779081134 0.406565982 +0.780058651 0.406240469 +0.781036168 0.405914956 +0.782013685 0.405589443 +0.782991202 0.405263930 +0.783968719 0.404938416 +0.784946237 0.404612903 +0.785923754 0.404287390 +0.786901271 0.403961877 +0.787878788 0.403636364 +0.788856305 0.403310850 +0.789833822 0.402985337 +0.790811339 0.402659824 +0.791788856 0.402334311 +0.792766373 0.402008798 +0.793743891 0.401683284 +0.794721408 0.401357771 +0.795698925 0.401032258 +0.796676442 0.400706745 +0.797653959 0.400381232 +0.798631476 0.400055718 +0.799608993 0.399730205 +0.800586510 0.399404692 +0.801564027 0.399079179 +0.802541544 0.398753666 +0.803519062 0.398428152 +0.804496579 0.398102639 +0.805474096 0.397777126 +0.806451613 0.397451613 +0.807429130 0.397126100 +0.808406647 0.396800587 +0.809384164 0.396475073 +0.810361681 0.396149560 +0.811339198 0.395824047 +0.812316716 0.395498534 +0.813294233 0.395173021 +0.814271750 0.394847507 +0.815249267 0.394521994 +0.816226784 0.394196481 +0.817204301 0.393870968 +0.818181818 0.393545455 +0.819159335 0.393219941 +0.820136852 0.392894428 +0.821114370 0.392568915 +0.822091887 0.392243402 +0.823069404 0.391917889 +0.824046921 0.391592375 +0.825024438 0.391266862 +0.826001955 0.390941349 +0.826979472 0.390615836 +0.827956989 0.390290323 +0.828934506 0.389964809 +0.829912023 0.389639296 +0.830889541 0.389313783 +0.831867058 0.388988270 +0.832844575 0.388662757 +0.833822092 0.388337243 +0.834799609 0.388011730 +0.835777126 0.387686217 +0.836754643 0.387360704 +0.837732160 0.387035191 +0.838709677 0.386709677 +0.839687195 0.386384164 +0.840664712 0.386058651 +0.841642229 0.385733138 +0.842619746 0.385407625 +0.843597263 0.385082111 +0.844574780 0.384756598 +0.845552297 0.384431085 +0.846529814 0.384105572 +0.847507331 0.383780059 +0.848484848 0.383454545 +0.849462366 0.383129032 +0.850439883 0.382803519 +0.851417400 0.382478006 +0.852394917 0.382152493 +0.853372434 0.381826979 +0.854349951 0.381501466 +0.855327468 0.381175953 +0.856304985 0.380850440 +0.857282502 0.380524927 +0.858260020 0.380199413 +0.859237537 0.379873900 +0.860215054 0.379548387 +0.861192571 0.379222874 +0.862170088 0.378897361 +0.863147605 0.378571848 +0.864125122 0.378246334 +0.865102639 0.377920821 +0.866080156 0.377595308 +0.867057674 0.377269795 +0.868035191 0.376944282 +0.869012708 0.376618768 +0.869990225 0.376293255 +0.870967742 0.375967742 +0.871945259 0.375642229 +0.872922776 0.375316716 +0.873900293 0.374991202 +0.874877810 0.374665689 +0.875855327 0.374340176 +0.876832845 0.374014663 +0.877810362 0.373689150 +0.878787879 0.373363636 +0.879765396 0.373038123 +0.880742913 0.372712610 +0.881720430 0.372387097 +0.882697947 0.372061584 +0.883675464 0.371736070 +0.884652981 0.371410557 +0.885630499 0.371085044 +0.886608016 0.370759531 +0.887585533 0.370434018 +0.888563050 0.370108504 +0.889540567 0.369782991 +0.890518084 0.369457478 +0.891495601 0.369131965 +0.892473118 0.368806452 +0.893450635 0.368480938 +0.894428152 0.368155425 +0.895405670 0.367829912 +0.896383187 0.367504399 +0.897360704 0.367178886 +0.898338221 0.366853372 +0.899315738 0.366527859 +0.900293255 0.366202346 +0.901270772 0.365876833 +0.902248289 0.365551320 +0.903225806 0.365225806 +0.904203324 0.364900293 +0.905180841 0.364574780 +0.906158358 0.364249267 +0.907135875 0.363923754 +0.908113392 0.363598240 +0.909090909 0.363272727 +0.910068426 0.362947214 +0.911045943 0.362621701 +0.912023460 0.362296188 +0.913000978 0.361970674 +0.913978495 0.361645161 +0.914956012 0.361319648 +0.915933529 0.360994135 +0.916911046 0.360668622 +0.917888563 0.360343109 +0.918866080 0.360017595 +0.919843597 0.359692082 +0.920821114 0.359366569 +0.921798631 0.359041056 +0.922776149 0.358715543 +0.923753666 0.358390029 +0.924731183 0.358064516 +0.925708700 0.357739003 +0.926686217 0.357413490 +0.927663734 0.357087977 +0.928641251 0.356762463 +0.929618768 0.356436950 +0.930596285 0.356111437 +0.931573803 0.355785924 +0.932551320 0.355460411 +0.933528837 0.355134897 +0.934506354 0.354809384 +0.935483871 0.354483871 +0.936461388 0.354158358 +0.937438905 0.353832845 +0.938416422 0.353507331 +0.939393939 0.353181818 +0.940371457 0.352856305 +0.941348974 0.352530792 +0.942326491 0.352205279 +0.943304008 0.351879765 +0.944281525 0.351554252 +0.945259042 0.351228739 +0.946236559 0.350903226 +0.947214076 0.350577713 +0.948191593 0.350252199 +0.949169110 0.349926686 +0.950146628 0.349601173 +0.951124145 0.349275660 +0.952101662 0.348950147 +0.953079179 0.348624633 +0.954056696 0.348299120 +0.955034213 0.347973607 +0.956011730 0.347648094 +0.956989247 0.347322581 +0.957966764 0.346997067 +0.958944282 0.346671554 +0.959921799 0.346346041 +0.960899316 0.346020528 +0.961876833 0.345695015 +0.962854350 0.345369501 +0.963831867 0.345043988 +0.964809384 0.344718475 +0.965786901 0.344392962 +0.966764418 0.344067449 +0.967741935 0.343741935 +0.968719453 0.343416422 +0.969696970 0.343090909 +0.970674487 0.342765396 +0.971652004 0.342439883 +0.972629521 0.342114370 +0.973607038 0.341788856 +0.974584555 0.341463343 +0.975562072 0.341137830 +0.976539589 0.340812317 +0.977517107 0.340486804 +0.978494624 0.340161290 +0.979472141 0.339835777 +0.980449658 0.339510264 +0.981427175 0.339184751 +0.982404692 0.338859238 +0.983382209 0.338533724 +0.984359726 0.338208211 +0.985337243 0.337882698 +0.986314761 0.337557185 +0.987292278 0.337231672 +0.988269795 0.336906158 +0.989247312 0.336580645 +0.990224829 0.336255132 +0.991202346 0.335929619 +0.992179863 0.335604106 +0.993157380 0.335278592 +0.994134897 0.334953079 +0.995112414 0.334627566 +0.996089932 0.334302053 +0.997067449 0.333976540 +0.998044966 0.333651026 +0.999022483 0.333325513 +1.000000000 0.333000000 diff --git a/examples/takagi-sugeno/ObstacleAvoidance.fll b/examples/takagi-sugeno/ObstacleAvoidance.fll new file mode 100644 index 0000000..10b53f4 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.fll @@ -0,0 +1,25 @@ +Engine: ObstacleAvoidance +InputVariable: obstacle + enabled: true + range: 0.000 1.000 + lock-range: false + term: left Ramp 1.000 0.000 + term: right Ramp 0.000 1.000 +OutputVariable: tsSteer + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: Maximum + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: left Constant 0.333 + term: right Constant 0.666 +RuleBlock: takagiSugeno + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if obstacle is left then tsSteer is right + rule: if obstacle is right then tsSteer is left
\ No newline at end of file diff --git a/examples/takagi-sugeno/ObstacleAvoidance.java b/examples/takagi-sugeno/ObstacleAvoidance.java new file mode 100644 index 0000000..c7c7f67 --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.java @@ -0,0 +1,60 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class ObstacleAvoidance{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("ObstacleAvoidance"); +engine.setDescription(""); + +InputVariable obstacle = new InputVariable(); +obstacle.setName("obstacle"); +obstacle.setDescription(""); +obstacle.setEnabled(true); +obstacle.setRange(0.000, 1.000); +obstacle.setLockValueInRange(false); +obstacle.addTerm(new Ramp("left", 1.000, 0.000)); +obstacle.addTerm(new Ramp("right", 0.000, 1.000)); +engine.addInputVariable(obstacle); + +OutputVariable tsSteer = new OutputVariable(); +tsSteer.setName("tsSteer"); +tsSteer.setDescription(""); +tsSteer.setEnabled(true); +tsSteer.setRange(0.000, 1.000); +tsSteer.setLockValueInRange(false); +tsSteer.setAggregation(new Maximum()); +tsSteer.setDefuzzifier(new WeightedAverage("Automatic")); +tsSteer.setDefaultValue(Double.NaN); +tsSteer.setLockPreviousValue(false); +tsSteer.addTerm(new Constant("left", 0.333)); +tsSteer.addTerm(new Constant("right", 0.666)); +engine.addOutputVariable(tsSteer); + +RuleBlock takagiSugeno = new RuleBlock(); +takagiSugeno.setName("takagiSugeno"); +takagiSugeno.setDescription(""); +takagiSugeno.setEnabled(true); +takagiSugeno.setConjunction(null); +takagiSugeno.setDisjunction(null); +takagiSugeno.setImplication(null); +takagiSugeno.setActivation(new General()); +takagiSugeno.addRule(Rule.parse("if obstacle is left then tsSteer is right", engine)); +takagiSugeno.addRule(Rule.parse("if obstacle is right then tsSteer is left", engine)); +engine.addRuleBlock(takagiSugeno); + + +} +} diff --git a/examples/takagi-sugeno/ObstacleAvoidance.pdf b/examples/takagi-sugeno/ObstacleAvoidance.pdf Binary files differnew file mode 100644 index 0000000..28d0a7a --- /dev/null +++ b/examples/takagi-sugeno/ObstacleAvoidance.pdf diff --git a/examples/takagi-sugeno/SimpleDimmer.R b/examples/takagi-sugeno/SimpleDimmer.R new file mode 100644 index 0000000..8502922 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.R @@ -0,0 +1,60 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "SimpleDimmer" +engine.fll = "Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: LOW Constant 0.250 + term: MEDIUM Constant 0.500 + term: HIGH Constant 0.750 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW" + +engine.fldFile = "SimpleDimmer.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("Ambient vs Power") + +engine.plot.o1_i1 = ggplot(engine.df, aes(Ambient, Power)) + + geom_line(aes(color=Power), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Power vs Ambient") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/SimpleDimmer.cpp b/examples/takagi-sugeno/SimpleDimmer.cpp new file mode 100644 index 0000000..735096b --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.cpp @@ -0,0 +1,52 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("SimpleDimmer"); +engine->setDescription(""); + +InputVariable* Ambient = new InputVariable; +Ambient->setName("Ambient"); +Ambient->setDescription(""); +Ambient->setEnabled(true); +Ambient->setRange(0.000, 1.000); +Ambient->setLockValueInRange(false); +Ambient->addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient->addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient->addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine->addInputVariable(Ambient); + +OutputVariable* Power = new OutputVariable; +Power->setName("Power"); +Power->setDescription(""); +Power->setEnabled(true); +Power->setRange(0.000, 1.000); +Power->setLockValueInRange(false); +Power->setAggregation(fl::null); +Power->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +Power->setDefaultValue(fl::nan); +Power->setLockPreviousValue(false); +Power->addTerm(new Constant("LOW", 0.250)); +Power->addTerm(new Constant("MEDIUM", 0.500)); +Power->addTerm(new Constant("HIGH", 0.750)); +engine->addOutputVariable(Power); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +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); + + +} diff --git a/examples/takagi-sugeno/SimpleDimmer.fcl b/examples/takagi-sugeno/SimpleDimmer.fcl new file mode 100644 index 0000000..a30f2c9 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.fcl @@ -0,0 +1,35 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK SimpleDimmer + +VAR_INPUT + Ambient: REAL; +END_VAR + +VAR_OUTPUT + Power: REAL; +END_VAR + +FUZZIFY Ambient + RANGE := (0.000 .. 1.000); + TERM DARK := Triangle 0.000 0.250 0.500; + TERM MEDIUM := Triangle 0.250 0.500 0.750; + TERM BRIGHT := Triangle 0.500 0.750 1.000; +END_FUZZIFY + +DEFUZZIFY Power + RANGE := (0.000 .. 1.000); + TERM LOW := 0.250; + TERM MEDIUM := 0.500; + TERM HIGH := 0.750; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + RULE 1 : if Ambient is DARK then Power is HIGH + RULE 2 : if Ambient is MEDIUM then Power is MEDIUM + RULE 3 : if Ambient is BRIGHT then Power is LOW +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/SimpleDimmer.fis b/examples/takagi-sugeno/SimpleDimmer.fis new file mode 100644 index 0000000..3988290 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.fis @@ -0,0 +1,35 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='SimpleDimmer' +Type='sugeno' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=3 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='Ambient' +Range=[0.000 1.000] +NumMFs=3 +MF1='DARK':'trimf',[0.000 0.250 0.500] +MF2='MEDIUM':'trimf',[0.250 0.500 0.750] +MF3='BRIGHT':'trimf',[0.500 0.750 1.000] + +[Output1] +Name='Power' +Range=[0.000 1.000] +NumMFs=3 +MF1='LOW':'constant',[0.250] +MF2='MEDIUM':'constant',[0.500] +MF3='HIGH':'constant',[0.750] + +[Rules] +1.000 , 3.000 (1.000) : 1 +2.000 , 2.000 (1.000) : 1 +3.000 , 1.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/SimpleDimmer.fld b/examples/takagi-sugeno/SimpleDimmer.fld new file mode 100644 index 0000000..9c2d25b --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.fld @@ -0,0 +1,1025 @@ +Ambient Power +0.000000000 nan +0.000977517 0.750000000 +0.001955034 0.750000000 +0.002932551 0.750000000 +0.003910068 0.750000000 +0.004887586 0.750000000 +0.005865103 0.750000000 +0.006842620 0.750000000 +0.007820137 0.750000000 +0.008797654 0.750000000 +0.009775171 0.750000000 +0.010752688 0.750000000 +0.011730205 0.750000000 +0.012707722 0.750000000 +0.013685239 0.750000000 +0.014662757 0.750000000 +0.015640274 0.750000000 +0.016617791 0.750000000 +0.017595308 0.750000000 +0.018572825 0.750000000 +0.019550342 0.750000000 +0.020527859 0.750000000 +0.021505376 0.750000000 +0.022482893 0.750000000 +0.023460411 0.750000000 +0.024437928 0.750000000 +0.025415445 0.750000000 +0.026392962 0.750000000 +0.027370479 0.750000000 +0.028347996 0.750000000 +0.029325513 0.750000000 +0.030303030 0.750000000 +0.031280547 0.750000000 +0.032258065 0.750000000 +0.033235582 0.750000000 +0.034213099 0.750000000 +0.035190616 0.750000000 +0.036168133 0.750000000 +0.037145650 0.750000000 +0.038123167 0.750000000 +0.039100684 0.750000000 +0.040078201 0.750000000 +0.041055718 0.750000000 +0.042033236 0.750000000 +0.043010753 0.750000000 +0.043988270 0.750000000 +0.044965787 0.750000000 +0.045943304 0.750000000 +0.046920821 0.750000000 +0.047898338 0.750000000 +0.048875855 0.750000000 +0.049853372 0.750000000 +0.050830890 0.750000000 +0.051808407 0.750000000 +0.052785924 0.750000000 +0.053763441 0.750000000 +0.054740958 0.750000000 +0.055718475 0.750000000 +0.056695992 0.750000000 +0.057673509 0.750000000 +0.058651026 0.750000000 +0.059628543 0.750000000 +0.060606061 0.750000000 +0.061583578 0.750000000 +0.062561095 0.750000000 +0.063538612 0.750000000 +0.064516129 0.750000000 +0.065493646 0.750000000 +0.066471163 0.750000000 +0.067448680 0.750000000 +0.068426197 0.750000000 +0.069403715 0.750000000 +0.070381232 0.750000000 +0.071358749 0.750000000 +0.072336266 0.750000000 +0.073313783 0.750000000 +0.074291300 0.750000000 +0.075268817 0.750000000 +0.076246334 0.750000000 +0.077223851 0.750000000 +0.078201369 0.750000000 +0.079178886 0.750000000 +0.080156403 0.750000000 +0.081133920 0.750000000 +0.082111437 0.750000000 +0.083088954 0.750000000 +0.084066471 0.750000000 +0.085043988 0.750000000 +0.086021505 0.750000000 +0.086999022 0.750000000 +0.087976540 0.750000000 +0.088954057 0.750000000 +0.089931574 0.750000000 +0.090909091 0.750000000 +0.091886608 0.750000000 +0.092864125 0.750000000 +0.093841642 0.750000000 +0.094819159 0.750000000 +0.095796676 0.750000000 +0.096774194 0.750000000 +0.097751711 0.750000000 +0.098729228 0.750000000 +0.099706745 0.750000000 +0.100684262 0.750000000 +0.101661779 0.750000000 +0.102639296 0.750000000 +0.103616813 0.750000000 +0.104594330 0.750000000 +0.105571848 0.750000000 +0.106549365 0.750000000 +0.107526882 0.750000000 +0.108504399 0.750000000 +0.109481916 0.750000000 +0.110459433 0.750000000 +0.111436950 0.750000000 +0.112414467 0.750000000 +0.113391984 0.750000000 +0.114369501 0.750000000 +0.115347019 0.750000000 +0.116324536 0.750000000 +0.117302053 0.750000000 +0.118279570 0.750000000 +0.119257087 0.750000000 +0.120234604 0.750000000 +0.121212121 0.750000000 +0.122189638 0.750000000 +0.123167155 0.750000000 +0.124144673 0.750000000 +0.125122190 0.750000000 +0.126099707 0.750000000 +0.127077224 0.750000000 +0.128054741 0.750000000 +0.129032258 0.750000000 +0.130009775 0.750000000 +0.130987292 0.750000000 +0.131964809 0.750000000 +0.132942326 0.750000000 +0.133919844 0.750000000 +0.134897361 0.750000000 +0.135874878 0.750000000 +0.136852395 0.750000000 +0.137829912 0.750000000 +0.138807429 0.750000000 +0.139784946 0.750000000 +0.140762463 0.750000000 +0.141739980 0.750000000 +0.142717498 0.750000000 +0.143695015 0.750000000 +0.144672532 0.750000000 +0.145650049 0.750000000 +0.146627566 0.750000000 +0.147605083 0.750000000 +0.148582600 0.750000000 +0.149560117 0.750000000 +0.150537634 0.750000000 +0.151515152 0.750000000 +0.152492669 0.750000000 +0.153470186 0.750000000 +0.154447703 0.750000000 +0.155425220 0.750000000 +0.156402737 0.750000000 +0.157380254 0.750000000 +0.158357771 0.750000000 +0.159335288 0.750000000 +0.160312805 0.750000000 +0.161290323 0.750000000 +0.162267840 0.750000000 +0.163245357 0.750000000 +0.164222874 0.750000000 +0.165200391 0.750000000 +0.166177908 0.750000000 +0.167155425 0.750000000 +0.168132942 0.750000000 +0.169110459 0.750000000 +0.170087977 0.750000000 +0.171065494 0.750000000 +0.172043011 0.750000000 +0.173020528 0.750000000 +0.173998045 0.750000000 +0.174975562 0.750000000 +0.175953079 0.750000000 +0.176930596 0.750000000 +0.177908113 0.750000000 +0.178885630 0.750000000 +0.179863148 0.750000000 +0.180840665 0.750000000 +0.181818182 0.750000000 +0.182795699 0.750000000 +0.183773216 0.750000000 +0.184750733 0.750000000 +0.185728250 0.750000000 +0.186705767 0.750000000 +0.187683284 0.750000000 +0.188660802 0.750000000 +0.189638319 0.750000000 +0.190615836 0.750000000 +0.191593353 0.750000000 +0.192570870 0.750000000 +0.193548387 0.750000000 +0.194525904 0.750000000 +0.195503421 0.750000000 +0.196480938 0.750000000 +0.197458456 0.750000000 +0.198435973 0.750000000 +0.199413490 0.750000000 +0.200391007 0.750000000 +0.201368524 0.750000000 +0.202346041 0.750000000 +0.203323558 0.750000000 +0.204301075 0.750000000 +0.205278592 0.750000000 +0.206256109 0.750000000 +0.207233627 0.750000000 +0.208211144 0.750000000 +0.209188661 0.750000000 +0.210166178 0.750000000 +0.211143695 0.750000000 +0.212121212 0.750000000 +0.213098729 0.750000000 +0.214076246 0.750000000 +0.215053763 0.750000000 +0.216031281 0.750000000 +0.217008798 0.750000000 +0.217986315 0.750000000 +0.218963832 0.750000000 +0.219941349 0.750000000 +0.220918866 0.750000000 +0.221896383 0.750000000 +0.222873900 0.750000000 +0.223851417 0.750000000 +0.224828935 0.750000000 +0.225806452 0.750000000 +0.226783969 0.750000000 +0.227761486 0.750000000 +0.228739003 0.750000000 +0.229716520 0.750000000 +0.230694037 0.750000000 +0.231671554 0.750000000 +0.232649071 0.750000000 +0.233626588 0.750000000 +0.234604106 0.750000000 +0.235581623 0.750000000 +0.236559140 0.750000000 +0.237536657 0.750000000 +0.238514174 0.750000000 +0.239491691 0.750000000 +0.240469208 0.750000000 +0.241446725 0.750000000 +0.242424242 0.750000000 +0.243401760 0.750000000 +0.244379277 0.750000000 +0.245356794 0.750000000 +0.246334311 0.750000000 +0.247311828 0.750000000 +0.248289345 0.750000000 +0.249266862 0.750000000 +0.250244379 0.749755621 +0.251221896 0.748778104 +0.252199413 0.747800587 +0.253176931 0.746823069 +0.254154448 0.745845552 +0.255131965 0.744868035 +0.256109482 0.743890518 +0.257086999 0.742913001 +0.258064516 0.741935484 +0.259042033 0.740957967 +0.260019550 0.739980450 +0.260997067 0.739002933 +0.261974585 0.738025415 +0.262952102 0.737047898 +0.263929619 0.736070381 +0.264907136 0.735092864 +0.265884653 0.734115347 +0.266862170 0.733137830 +0.267839687 0.732160313 +0.268817204 0.731182796 +0.269794721 0.730205279 +0.270772239 0.729227761 +0.271749756 0.728250244 +0.272727273 0.727272727 +0.273704790 0.726295210 +0.274682307 0.725317693 +0.275659824 0.724340176 +0.276637341 0.723362659 +0.277614858 0.722385142 +0.278592375 0.721407625 +0.279569892 0.720430108 +0.280547410 0.719452590 +0.281524927 0.718475073 +0.282502444 0.717497556 +0.283479961 0.716520039 +0.284457478 0.715542522 +0.285434995 0.714565005 +0.286412512 0.713587488 +0.287390029 0.712609971 +0.288367546 0.711632454 +0.289345064 0.710654936 +0.290322581 0.709677419 +0.291300098 0.708699902 +0.292277615 0.707722385 +0.293255132 0.706744868 +0.294232649 0.705767351 +0.295210166 0.704789834 +0.296187683 0.703812317 +0.297165200 0.702834800 +0.298142717 0.701857283 +0.299120235 0.700879765 +0.300097752 0.699902248 +0.301075269 0.698924731 +0.302052786 0.697947214 +0.303030303 0.696969697 +0.304007820 0.695992180 +0.304985337 0.695014663 +0.305962854 0.694037146 +0.306940371 0.693059629 +0.307917889 0.692082111 +0.308895406 0.691104594 +0.309872923 0.690127077 +0.310850440 0.689149560 +0.311827957 0.688172043 +0.312805474 0.687194526 +0.313782991 0.686217009 +0.314760508 0.685239492 +0.315738025 0.684261975 +0.316715543 0.683284457 +0.317693060 0.682306940 +0.318670577 0.681329423 +0.319648094 0.680351906 +0.320625611 0.679374389 +0.321603128 0.678396872 +0.322580645 0.677419355 +0.323558162 0.676441838 +0.324535679 0.675464321 +0.325513196 0.674486804 +0.326490714 0.673509286 +0.327468231 0.672531769 +0.328445748 0.671554252 +0.329423265 0.670576735 +0.330400782 0.669599218 +0.331378299 0.668621701 +0.332355816 0.667644184 +0.333333333 0.666666667 +0.334310850 0.665689150 +0.335288368 0.664711632 +0.336265885 0.663734115 +0.337243402 0.662756598 +0.338220919 0.661779081 +0.339198436 0.660801564 +0.340175953 0.659824047 +0.341153470 0.658846530 +0.342130987 0.657869013 +0.343108504 0.656891496 +0.344086022 0.655913978 +0.345063539 0.654936461 +0.346041056 0.653958944 +0.347018573 0.652981427 +0.347996090 0.652003910 +0.348973607 0.651026393 +0.349951124 0.650048876 +0.350928641 0.649071359 +0.351906158 0.648093842 +0.352883675 0.647116325 +0.353861193 0.646138807 +0.354838710 0.645161290 +0.355816227 0.644183773 +0.356793744 0.643206256 +0.357771261 0.642228739 +0.358748778 0.641251222 +0.359726295 0.640273705 +0.360703812 0.639296188 +0.361681329 0.638318671 +0.362658847 0.637341153 +0.363636364 0.636363636 +0.364613881 0.635386119 +0.365591398 0.634408602 +0.366568915 0.633431085 +0.367546432 0.632453568 +0.368523949 0.631476051 +0.369501466 0.630498534 +0.370478983 0.629521017 +0.371456500 0.628543500 +0.372434018 0.627565982 +0.373411535 0.626588465 +0.374389052 0.625610948 +0.375366569 0.624633431 +0.376344086 0.623655914 +0.377321603 0.622678397 +0.378299120 0.621700880 +0.379276637 0.620723363 +0.380254154 0.619745846 +0.381231672 0.618768328 +0.382209189 0.617790811 +0.383186706 0.616813294 +0.384164223 0.615835777 +0.385141740 0.614858260 +0.386119257 0.613880743 +0.387096774 0.612903226 +0.388074291 0.611925709 +0.389051808 0.610948192 +0.390029326 0.609970674 +0.391006843 0.608993157 +0.391984360 0.608015640 +0.392961877 0.607038123 +0.393939394 0.606060606 +0.394916911 0.605083089 +0.395894428 0.604105572 +0.396871945 0.603128055 +0.397849462 0.602150538 +0.398826979 0.601173021 +0.399804497 0.600195503 +0.400782014 0.599217986 +0.401759531 0.598240469 +0.402737048 0.597262952 +0.403714565 0.596285435 +0.404692082 0.595307918 +0.405669599 0.594330401 +0.406647116 0.593352884 +0.407624633 0.592375367 +0.408602151 0.591397849 +0.409579668 0.590420332 +0.410557185 0.589442815 +0.411534702 0.588465298 +0.412512219 0.587487781 +0.413489736 0.586510264 +0.414467253 0.585532747 +0.415444770 0.584555230 +0.416422287 0.583577713 +0.417399804 0.582600196 +0.418377322 0.581622678 +0.419354839 0.580645161 +0.420332356 0.579667644 +0.421309873 0.578690127 +0.422287390 0.577712610 +0.423264907 0.576735093 +0.424242424 0.575757576 +0.425219941 0.574780059 +0.426197458 0.573802542 +0.427174976 0.572825024 +0.428152493 0.571847507 +0.429130010 0.570869990 +0.430107527 0.569892473 +0.431085044 0.568914956 +0.432062561 0.567937439 +0.433040078 0.566959922 +0.434017595 0.565982405 +0.434995112 0.565004888 +0.435972630 0.564027370 +0.436950147 0.563049853 +0.437927664 0.562072336 +0.438905181 0.561094819 +0.439882698 0.560117302 +0.440860215 0.559139785 +0.441837732 0.558162268 +0.442815249 0.557184751 +0.443792766 0.556207234 +0.444770283 0.555229717 +0.445747801 0.554252199 +0.446725318 0.553274682 +0.447702835 0.552297165 +0.448680352 0.551319648 +0.449657869 0.550342131 +0.450635386 0.549364614 +0.451612903 0.548387097 +0.452590420 0.547409580 +0.453567937 0.546432063 +0.454545455 0.545454545 +0.455522972 0.544477028 +0.456500489 0.543499511 +0.457478006 0.542521994 +0.458455523 0.541544477 +0.459433040 0.540566960 +0.460410557 0.539589443 +0.461388074 0.538611926 +0.462365591 0.537634409 +0.463343109 0.536656891 +0.464320626 0.535679374 +0.465298143 0.534701857 +0.466275660 0.533724340 +0.467253177 0.532746823 +0.468230694 0.531769306 +0.469208211 0.530791789 +0.470185728 0.529814272 +0.471163245 0.528836755 +0.472140762 0.527859238 +0.473118280 0.526881720 +0.474095797 0.525904203 +0.475073314 0.524926686 +0.476050831 0.523949169 +0.477028348 0.522971652 +0.478005865 0.521994135 +0.478983382 0.521016618 +0.479960899 0.520039101 +0.480938416 0.519061584 +0.481915934 0.518084066 +0.482893451 0.517106549 +0.483870968 0.516129032 +0.484848485 0.515151515 +0.485826002 0.514173998 +0.486803519 0.513196481 +0.487781036 0.512218964 +0.488758553 0.511241447 +0.489736070 0.510263930 +0.490713587 0.509286413 +0.491691105 0.508308895 +0.492668622 0.507331378 +0.493646139 0.506353861 +0.494623656 0.505376344 +0.495601173 0.504398827 +0.496578690 0.503421310 +0.497556207 0.502443793 +0.498533724 0.501466276 +0.499511241 0.500488759 +0.500488759 0.499511241 +0.501466276 0.498533724 +0.502443793 0.497556207 +0.503421310 0.496578690 +0.504398827 0.495601173 +0.505376344 0.494623656 +0.506353861 0.493646139 +0.507331378 0.492668622 +0.508308895 0.491691105 +0.509286413 0.490713587 +0.510263930 0.489736070 +0.511241447 0.488758553 +0.512218964 0.487781036 +0.513196481 0.486803519 +0.514173998 0.485826002 +0.515151515 0.484848485 +0.516129032 0.483870968 +0.517106549 0.482893451 +0.518084066 0.481915934 +0.519061584 0.480938416 +0.520039101 0.479960899 +0.521016618 0.478983382 +0.521994135 0.478005865 +0.522971652 0.477028348 +0.523949169 0.476050831 +0.524926686 0.475073314 +0.525904203 0.474095797 +0.526881720 0.473118280 +0.527859238 0.472140762 +0.528836755 0.471163245 +0.529814272 0.470185728 +0.530791789 0.469208211 +0.531769306 0.468230694 +0.532746823 0.467253177 +0.533724340 0.466275660 +0.534701857 0.465298143 +0.535679374 0.464320626 +0.536656891 0.463343109 +0.537634409 0.462365591 +0.538611926 0.461388074 +0.539589443 0.460410557 +0.540566960 0.459433040 +0.541544477 0.458455523 +0.542521994 0.457478006 +0.543499511 0.456500489 +0.544477028 0.455522972 +0.545454545 0.454545455 +0.546432063 0.453567937 +0.547409580 0.452590420 +0.548387097 0.451612903 +0.549364614 0.450635386 +0.550342131 0.449657869 +0.551319648 0.448680352 +0.552297165 0.447702835 +0.553274682 0.446725318 +0.554252199 0.445747801 +0.555229717 0.444770283 +0.556207234 0.443792766 +0.557184751 0.442815249 +0.558162268 0.441837732 +0.559139785 0.440860215 +0.560117302 0.439882698 +0.561094819 0.438905181 +0.562072336 0.437927664 +0.563049853 0.436950147 +0.564027370 0.435972630 +0.565004888 0.434995112 +0.565982405 0.434017595 +0.566959922 0.433040078 +0.567937439 0.432062561 +0.568914956 0.431085044 +0.569892473 0.430107527 +0.570869990 0.429130010 +0.571847507 0.428152493 +0.572825024 0.427174976 +0.573802542 0.426197458 +0.574780059 0.425219941 +0.575757576 0.424242424 +0.576735093 0.423264907 +0.577712610 0.422287390 +0.578690127 0.421309873 +0.579667644 0.420332356 +0.580645161 0.419354839 +0.581622678 0.418377322 +0.582600196 0.417399804 +0.583577713 0.416422287 +0.584555230 0.415444770 +0.585532747 0.414467253 +0.586510264 0.413489736 +0.587487781 0.412512219 +0.588465298 0.411534702 +0.589442815 0.410557185 +0.590420332 0.409579668 +0.591397849 0.408602151 +0.592375367 0.407624633 +0.593352884 0.406647116 +0.594330401 0.405669599 +0.595307918 0.404692082 +0.596285435 0.403714565 +0.597262952 0.402737048 +0.598240469 0.401759531 +0.599217986 0.400782014 +0.600195503 0.399804497 +0.601173021 0.398826979 +0.602150538 0.397849462 +0.603128055 0.396871945 +0.604105572 0.395894428 +0.605083089 0.394916911 +0.606060606 0.393939394 +0.607038123 0.392961877 +0.608015640 0.391984360 +0.608993157 0.391006843 +0.609970674 0.390029326 +0.610948192 0.389051808 +0.611925709 0.388074291 +0.612903226 0.387096774 +0.613880743 0.386119257 +0.614858260 0.385141740 +0.615835777 0.384164223 +0.616813294 0.383186706 +0.617790811 0.382209189 +0.618768328 0.381231672 +0.619745846 0.380254154 +0.620723363 0.379276637 +0.621700880 0.378299120 +0.622678397 0.377321603 +0.623655914 0.376344086 +0.624633431 0.375366569 +0.625610948 0.374389052 +0.626588465 0.373411535 +0.627565982 0.372434018 +0.628543500 0.371456500 +0.629521017 0.370478983 +0.630498534 0.369501466 +0.631476051 0.368523949 +0.632453568 0.367546432 +0.633431085 0.366568915 +0.634408602 0.365591398 +0.635386119 0.364613881 +0.636363636 0.363636364 +0.637341153 0.362658847 +0.638318671 0.361681329 +0.639296188 0.360703812 +0.640273705 0.359726295 +0.641251222 0.358748778 +0.642228739 0.357771261 +0.643206256 0.356793744 +0.644183773 0.355816227 +0.645161290 0.354838710 +0.646138807 0.353861193 +0.647116325 0.352883675 +0.648093842 0.351906158 +0.649071359 0.350928641 +0.650048876 0.349951124 +0.651026393 0.348973607 +0.652003910 0.347996090 +0.652981427 0.347018573 +0.653958944 0.346041056 +0.654936461 0.345063539 +0.655913978 0.344086022 +0.656891496 0.343108504 +0.657869013 0.342130987 +0.658846530 0.341153470 +0.659824047 0.340175953 +0.660801564 0.339198436 +0.661779081 0.338220919 +0.662756598 0.337243402 +0.663734115 0.336265885 +0.664711632 0.335288368 +0.665689150 0.334310850 +0.666666667 0.333333333 +0.667644184 0.332355816 +0.668621701 0.331378299 +0.669599218 0.330400782 +0.670576735 0.329423265 +0.671554252 0.328445748 +0.672531769 0.327468231 +0.673509286 0.326490714 +0.674486804 0.325513196 +0.675464321 0.324535679 +0.676441838 0.323558162 +0.677419355 0.322580645 +0.678396872 0.321603128 +0.679374389 0.320625611 +0.680351906 0.319648094 +0.681329423 0.318670577 +0.682306940 0.317693060 +0.683284457 0.316715543 +0.684261975 0.315738025 +0.685239492 0.314760508 +0.686217009 0.313782991 +0.687194526 0.312805474 +0.688172043 0.311827957 +0.689149560 0.310850440 +0.690127077 0.309872923 +0.691104594 0.308895406 +0.692082111 0.307917889 +0.693059629 0.306940371 +0.694037146 0.305962854 +0.695014663 0.304985337 +0.695992180 0.304007820 +0.696969697 0.303030303 +0.697947214 0.302052786 +0.698924731 0.301075269 +0.699902248 0.300097752 +0.700879765 0.299120235 +0.701857283 0.298142717 +0.702834800 0.297165200 +0.703812317 0.296187683 +0.704789834 0.295210166 +0.705767351 0.294232649 +0.706744868 0.293255132 +0.707722385 0.292277615 +0.708699902 0.291300098 +0.709677419 0.290322581 +0.710654936 0.289345064 +0.711632454 0.288367546 +0.712609971 0.287390029 +0.713587488 0.286412512 +0.714565005 0.285434995 +0.715542522 0.284457478 +0.716520039 0.283479961 +0.717497556 0.282502444 +0.718475073 0.281524927 +0.719452590 0.280547410 +0.720430108 0.279569892 +0.721407625 0.278592375 +0.722385142 0.277614858 +0.723362659 0.276637341 +0.724340176 0.275659824 +0.725317693 0.274682307 +0.726295210 0.273704790 +0.727272727 0.272727273 +0.728250244 0.271749756 +0.729227761 0.270772239 +0.730205279 0.269794721 +0.731182796 0.268817204 +0.732160313 0.267839687 +0.733137830 0.266862170 +0.734115347 0.265884653 +0.735092864 0.264907136 +0.736070381 0.263929619 +0.737047898 0.262952102 +0.738025415 0.261974585 +0.739002933 0.260997067 +0.739980450 0.260019550 +0.740957967 0.259042033 +0.741935484 0.258064516 +0.742913001 0.257086999 +0.743890518 0.256109482 +0.744868035 0.255131965 +0.745845552 0.254154448 +0.746823069 0.253176931 +0.747800587 0.252199413 +0.748778104 0.251221896 +0.749755621 0.250244379 +0.750733138 0.250000000 +0.751710655 0.250000000 +0.752688172 0.250000000 +0.753665689 0.250000000 +0.754643206 0.250000000 +0.755620723 0.250000000 +0.756598240 0.250000000 +0.757575758 0.250000000 +0.758553275 0.250000000 +0.759530792 0.250000000 +0.760508309 0.250000000 +0.761485826 0.250000000 +0.762463343 0.250000000 +0.763440860 0.250000000 +0.764418377 0.250000000 +0.765395894 0.250000000 +0.766373412 0.250000000 +0.767350929 0.250000000 +0.768328446 0.250000000 +0.769305963 0.250000000 +0.770283480 0.250000000 +0.771260997 0.250000000 +0.772238514 0.250000000 +0.773216031 0.250000000 +0.774193548 0.250000000 +0.775171065 0.250000000 +0.776148583 0.250000000 +0.777126100 0.250000000 +0.778103617 0.250000000 +0.779081134 0.250000000 +0.780058651 0.250000000 +0.781036168 0.250000000 +0.782013685 0.250000000 +0.782991202 0.250000000 +0.783968719 0.250000000 +0.784946237 0.250000000 +0.785923754 0.250000000 +0.786901271 0.250000000 +0.787878788 0.250000000 +0.788856305 0.250000000 +0.789833822 0.250000000 +0.790811339 0.250000000 +0.791788856 0.250000000 +0.792766373 0.250000000 +0.793743891 0.250000000 +0.794721408 0.250000000 +0.795698925 0.250000000 +0.796676442 0.250000000 +0.797653959 0.250000000 +0.798631476 0.250000000 +0.799608993 0.250000000 +0.800586510 0.250000000 +0.801564027 0.250000000 +0.802541544 0.250000000 +0.803519062 0.250000000 +0.804496579 0.250000000 +0.805474096 0.250000000 +0.806451613 0.250000000 +0.807429130 0.250000000 +0.808406647 0.250000000 +0.809384164 0.250000000 +0.810361681 0.250000000 +0.811339198 0.250000000 +0.812316716 0.250000000 +0.813294233 0.250000000 +0.814271750 0.250000000 +0.815249267 0.250000000 +0.816226784 0.250000000 +0.817204301 0.250000000 +0.818181818 0.250000000 +0.819159335 0.250000000 +0.820136852 0.250000000 +0.821114370 0.250000000 +0.822091887 0.250000000 +0.823069404 0.250000000 +0.824046921 0.250000000 +0.825024438 0.250000000 +0.826001955 0.250000000 +0.826979472 0.250000000 +0.827956989 0.250000000 +0.828934506 0.250000000 +0.829912023 0.250000000 +0.830889541 0.250000000 +0.831867058 0.250000000 +0.832844575 0.250000000 +0.833822092 0.250000000 +0.834799609 0.250000000 +0.835777126 0.250000000 +0.836754643 0.250000000 +0.837732160 0.250000000 +0.838709677 0.250000000 +0.839687195 0.250000000 +0.840664712 0.250000000 +0.841642229 0.250000000 +0.842619746 0.250000000 +0.843597263 0.250000000 +0.844574780 0.250000000 +0.845552297 0.250000000 +0.846529814 0.250000000 +0.847507331 0.250000000 +0.848484848 0.250000000 +0.849462366 0.250000000 +0.850439883 0.250000000 +0.851417400 0.250000000 +0.852394917 0.250000000 +0.853372434 0.250000000 +0.854349951 0.250000000 +0.855327468 0.250000000 +0.856304985 0.250000000 +0.857282502 0.250000000 +0.858260020 0.250000000 +0.859237537 0.250000000 +0.860215054 0.250000000 +0.861192571 0.250000000 +0.862170088 0.250000000 +0.863147605 0.250000000 +0.864125122 0.250000000 +0.865102639 0.250000000 +0.866080156 0.250000000 +0.867057674 0.250000000 +0.868035191 0.250000000 +0.869012708 0.250000000 +0.869990225 0.250000000 +0.870967742 0.250000000 +0.871945259 0.250000000 +0.872922776 0.250000000 +0.873900293 0.250000000 +0.874877810 0.250000000 +0.875855327 0.250000000 +0.876832845 0.250000000 +0.877810362 0.250000000 +0.878787879 0.250000000 +0.879765396 0.250000000 +0.880742913 0.250000000 +0.881720430 0.250000000 +0.882697947 0.250000000 +0.883675464 0.250000000 +0.884652981 0.250000000 +0.885630499 0.250000000 +0.886608016 0.250000000 +0.887585533 0.250000000 +0.888563050 0.250000000 +0.889540567 0.250000000 +0.890518084 0.250000000 +0.891495601 0.250000000 +0.892473118 0.250000000 +0.893450635 0.250000000 +0.894428152 0.250000000 +0.895405670 0.250000000 +0.896383187 0.250000000 +0.897360704 0.250000000 +0.898338221 0.250000000 +0.899315738 0.250000000 +0.900293255 0.250000000 +0.901270772 0.250000000 +0.902248289 0.250000000 +0.903225806 0.250000000 +0.904203324 0.250000000 +0.905180841 0.250000000 +0.906158358 0.250000000 +0.907135875 0.250000000 +0.908113392 0.250000000 +0.909090909 0.250000000 +0.910068426 0.250000000 +0.911045943 0.250000000 +0.912023460 0.250000000 +0.913000978 0.250000000 +0.913978495 0.250000000 +0.914956012 0.250000000 +0.915933529 0.250000000 +0.916911046 0.250000000 +0.917888563 0.250000000 +0.918866080 0.250000000 +0.919843597 0.250000000 +0.920821114 0.250000000 +0.921798631 0.250000000 +0.922776149 0.250000000 +0.923753666 0.250000000 +0.924731183 0.250000000 +0.925708700 0.250000000 +0.926686217 0.250000000 +0.927663734 0.250000000 +0.928641251 0.250000000 +0.929618768 0.250000000 +0.930596285 0.250000000 +0.931573803 0.250000000 +0.932551320 0.250000000 +0.933528837 0.250000000 +0.934506354 0.250000000 +0.935483871 0.250000000 +0.936461388 0.250000000 +0.937438905 0.250000000 +0.938416422 0.250000000 +0.939393939 0.250000000 +0.940371457 0.250000000 +0.941348974 0.250000000 +0.942326491 0.250000000 +0.943304008 0.250000000 +0.944281525 0.250000000 +0.945259042 0.250000000 +0.946236559 0.250000000 +0.947214076 0.250000000 +0.948191593 0.250000000 +0.949169110 0.250000000 +0.950146628 0.250000000 +0.951124145 0.250000000 +0.952101662 0.250000000 +0.953079179 0.250000000 +0.954056696 0.250000000 +0.955034213 0.250000000 +0.956011730 0.250000000 +0.956989247 0.250000000 +0.957966764 0.250000000 +0.958944282 0.250000000 +0.959921799 0.250000000 +0.960899316 0.250000000 +0.961876833 0.250000000 +0.962854350 0.250000000 +0.963831867 0.250000000 +0.964809384 0.250000000 +0.965786901 0.250000000 +0.966764418 0.250000000 +0.967741935 0.250000000 +0.968719453 0.250000000 +0.969696970 0.250000000 +0.970674487 0.250000000 +0.971652004 0.250000000 +0.972629521 0.250000000 +0.973607038 0.250000000 +0.974584555 0.250000000 +0.975562072 0.250000000 +0.976539589 0.250000000 +0.977517107 0.250000000 +0.978494624 0.250000000 +0.979472141 0.250000000 +0.980449658 0.250000000 +0.981427175 0.250000000 +0.982404692 0.250000000 +0.983382209 0.250000000 +0.984359726 0.250000000 +0.985337243 0.250000000 +0.986314761 0.250000000 +0.987292278 0.250000000 +0.988269795 0.250000000 +0.989247312 0.250000000 +0.990224829 0.250000000 +0.991202346 0.250000000 +0.992179863 0.250000000 +0.993157380 0.250000000 +0.994134897 0.250000000 +0.995112414 0.250000000 +0.996089932 0.250000000 +0.997067449 0.250000000 +0.998044966 0.250000000 +0.999022483 0.250000000 +1.000000000 nan diff --git a/examples/takagi-sugeno/SimpleDimmer.fll b/examples/takagi-sugeno/SimpleDimmer.fll new file mode 100644 index 0000000..f08e563 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.fll @@ -0,0 +1,28 @@ +Engine: SimpleDimmer +InputVariable: Ambient + enabled: true + range: 0.000 1.000 + lock-range: false + term: DARK Triangle 0.000 0.250 0.500 + term: MEDIUM Triangle 0.250 0.500 0.750 + term: BRIGHT Triangle 0.500 0.750 1.000 +OutputVariable: Power + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: LOW Constant 0.250 + term: MEDIUM Constant 0.500 + term: HIGH Constant 0.750 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if Ambient is DARK then Power is HIGH + rule: if Ambient is MEDIUM then Power is MEDIUM + rule: if Ambient is BRIGHT then Power is LOW
\ No newline at end of file diff --git a/examples/takagi-sugeno/SimpleDimmer.java b/examples/takagi-sugeno/SimpleDimmer.java new file mode 100644 index 0000000..c3c53e9 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.java @@ -0,0 +1,63 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class SimpleDimmer{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("SimpleDimmer"); +engine.setDescription(""); + +InputVariable Ambient = new InputVariable(); +Ambient.setName("Ambient"); +Ambient.setDescription(""); +Ambient.setEnabled(true); +Ambient.setRange(0.000, 1.000); +Ambient.setLockValueInRange(false); +Ambient.addTerm(new Triangle("DARK", 0.000, 0.250, 0.500)); +Ambient.addTerm(new Triangle("MEDIUM", 0.250, 0.500, 0.750)); +Ambient.addTerm(new Triangle("BRIGHT", 0.500, 0.750, 1.000)); +engine.addInputVariable(Ambient); + +OutputVariable Power = new OutputVariable(); +Power.setName("Power"); +Power.setDescription(""); +Power.setEnabled(true); +Power.setRange(0.000, 1.000); +Power.setLockValueInRange(false); +Power.setAggregation(null); +Power.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +Power.setDefaultValue(Double.NaN); +Power.setLockPreviousValue(false); +Power.addTerm(new Constant("LOW", 0.250)); +Power.addTerm(new Constant("MEDIUM", 0.500)); +Power.addTerm(new Constant("HIGH", 0.750)); +engine.addOutputVariable(Power); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +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); + + +} +} diff --git a/examples/takagi-sugeno/SimpleDimmer.pdf b/examples/takagi-sugeno/SimpleDimmer.pdf Binary files differnew file mode 100644 index 0000000..f35dec9 --- /dev/null +++ b/examples/takagi-sugeno/SimpleDimmer.pdf diff --git a/examples/takagi-sugeno/approximation.R b/examples/takagi-sugeno/approximation.R new file mode 100644 index 0000000..89c0654 --- /dev/null +++ b/examples/takagi-sugeno/approximation.R @@ -0,0 +1,119 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "approximation" +engine.fll = "Engine: approximation +InputVariable: inputX + enabled: true + range: 0.000 10.000 + lock-range: false + term: NEAR_1 Triangle 0.000 1.000 2.000 + term: NEAR_2 Triangle 1.000 2.000 3.000 + term: NEAR_3 Triangle 2.000 3.000 4.000 + term: NEAR_4 Triangle 3.000 4.000 5.000 + term: NEAR_5 Triangle 4.000 5.000 6.000 + term: NEAR_6 Triangle 5.000 6.000 7.000 + term: NEAR_7 Triangle 6.000 7.000 8.000 + term: NEAR_8 Triangle 7.000 8.000 9.000 + term: NEAR_9 Triangle 8.000 9.000 10.000 +OutputVariable: outputFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: true + term: f1 Constant 0.840 + term: f2 Constant 0.450 + term: f3 Constant 0.040 + term: f4 Constant -0.180 + term: f5 Constant -0.190 + term: f6 Constant -0.040 + term: f7 Constant 0.090 + term: f8 Constant 0.120 + term: f9 Constant 0.040 +OutputVariable: trueFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: true + term: fx Function sin(inputX)/inputX +OutputVariable: diffFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: diff Function fabs(outputFx-trueFx) +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if inputX is NEAR_1 then outputFx is f1 + rule: if inputX is NEAR_2 then outputFx is f2 + rule: if inputX is NEAR_3 then outputFx is f3 + rule: if inputX is NEAR_4 then outputFx is f4 + rule: if inputX is NEAR_5 then outputFx is f5 + rule: if inputX is NEAR_6 then outputFx is f6 + rule: if inputX is NEAR_7 then outputFx is f7 + rule: if inputX is NEAR_8 then outputFx is f8 + rule: if inputX is NEAR_9 then outputFx is f9 + rule: if inputX is any then trueFx is fx and diffFx is diff" + +engine.fldFile = "approximation.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(inputX, outputFx)) + + geom_line(aes(color=outputFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("inputX vs outputFx") + +engine.plot.o1_i1 = ggplot(engine.df, aes(inputX, outputFx)) + + geom_line(aes(color=outputFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("outputFx vs inputX") + +engine.plot.i1_o2 = ggplot(engine.df, aes(inputX, trueFx)) + + geom_line(aes(color=trueFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("inputX vs trueFx") + +engine.plot.o2_i1 = ggplot(engine.df, aes(inputX, trueFx)) + + geom_line(aes(color=trueFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("trueFx vs inputX") + +engine.plot.i1_o3 = ggplot(engine.df, aes(inputX, diffFx)) + + geom_line(aes(color=diffFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("inputX vs diffFx") + +engine.plot.o3_i1 = ggplot(engine.df, aes(inputX, diffFx)) + + geom_line(aes(color=diffFx), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("diffFx vs inputX") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, engine.plot.i1_o3, engine.plot.o3_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/approximation.cpp b/examples/takagi-sugeno/approximation.cpp new file mode 100644 index 0000000..da0a307 --- /dev/null +++ b/examples/takagi-sugeno/approximation.cpp @@ -0,0 +1,97 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("approximation"); +engine->setDescription(""); + +InputVariable* inputX = new InputVariable; +inputX->setName("inputX"); +inputX->setDescription(""); +inputX->setEnabled(true); +inputX->setRange(0.000, 10.000); +inputX->setLockValueInRange(false); +inputX->addTerm(new Triangle("NEAR_1", 0.000, 1.000, 2.000)); +inputX->addTerm(new Triangle("NEAR_2", 1.000, 2.000, 3.000)); +inputX->addTerm(new Triangle("NEAR_3", 2.000, 3.000, 4.000)); +inputX->addTerm(new Triangle("NEAR_4", 3.000, 4.000, 5.000)); +inputX->addTerm(new Triangle("NEAR_5", 4.000, 5.000, 6.000)); +inputX->addTerm(new Triangle("NEAR_6", 5.000, 6.000, 7.000)); +inputX->addTerm(new Triangle("NEAR_7", 6.000, 7.000, 8.000)); +inputX->addTerm(new Triangle("NEAR_8", 7.000, 8.000, 9.000)); +inputX->addTerm(new Triangle("NEAR_9", 8.000, 9.000, 10.000)); +engine->addInputVariable(inputX); + +OutputVariable* outputFx = new OutputVariable; +outputFx->setName("outputFx"); +outputFx->setDescription(""); +outputFx->setEnabled(true); +outputFx->setRange(-1.000, 1.000); +outputFx->setLockValueInRange(false); +outputFx->setAggregation(fl::null); +outputFx->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +outputFx->setDefaultValue(fl::nan); +outputFx->setLockPreviousValue(true); +outputFx->addTerm(new Constant("f1", 0.840)); +outputFx->addTerm(new Constant("f2", 0.450)); +outputFx->addTerm(new Constant("f3", 0.040)); +outputFx->addTerm(new Constant("f4", -0.180)); +outputFx->addTerm(new Constant("f5", -0.190)); +outputFx->addTerm(new Constant("f6", -0.040)); +outputFx->addTerm(new Constant("f7", 0.090)); +outputFx->addTerm(new Constant("f8", 0.120)); +outputFx->addTerm(new Constant("f9", 0.040)); +engine->addOutputVariable(outputFx); + +OutputVariable* trueFx = new OutputVariable; +trueFx->setName("trueFx"); +trueFx->setDescription(""); +trueFx->setEnabled(true); +trueFx->setRange(-1.000, 1.000); +trueFx->setLockValueInRange(false); +trueFx->setAggregation(fl::null); +trueFx->setDefuzzifier(new WeightedAverage("Automatic")); +trueFx->setDefaultValue(fl::nan); +trueFx->setLockPreviousValue(true); +trueFx->addTerm(Function::create("fx", "sin(inputX)/inputX", engine)); +engine->addOutputVariable(trueFx); + +OutputVariable* diffFx = new OutputVariable; +diffFx->setName("diffFx"); +diffFx->setDescription(""); +diffFx->setEnabled(true); +diffFx->setRange(-1.000, 1.000); +diffFx->setLockValueInRange(false); +diffFx->setAggregation(fl::null); +diffFx->setDefuzzifier(new WeightedAverage("Automatic")); +diffFx->setDefaultValue(fl::nan); +diffFx->setLockPreviousValue(false); +diffFx->addTerm(Function::create("diff", "fabs(outputFx-trueFx)", engine)); +engine->addOutputVariable(diffFx); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_1 then outputFx is f1", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_2 then outputFx is f2", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_3 then outputFx is f3", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_4 then outputFx is f4", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_5 then outputFx is f5", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_6 then outputFx is f6", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_7 then outputFx is f7", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_8 then outputFx is f8", engine)); +ruleBlock->addRule(Rule::parse("if inputX is NEAR_9 then outputFx is f9", engine)); +ruleBlock->addRule(Rule::parse("if inputX is any then trueFx is fx and diffFx is diff", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/takagi-sugeno/approximation.fcl b/examples/takagi-sugeno/approximation.fcl new file mode 100644 index 0000000..6bf285d --- /dev/null +++ b/examples/takagi-sugeno/approximation.fcl @@ -0,0 +1,70 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK approximation + +VAR_INPUT + inputX: REAL; +END_VAR + +VAR_OUTPUT + outputFx: REAL; + trueFx: REAL; + diffFx: REAL; +END_VAR + +FUZZIFY inputX + RANGE := (0.000 .. 10.000); + TERM NEAR_1 := Triangle 0.000 1.000 2.000; + TERM NEAR_2 := Triangle 1.000 2.000 3.000; + TERM NEAR_3 := Triangle 2.000 3.000 4.000; + TERM NEAR_4 := Triangle 3.000 4.000 5.000; + TERM NEAR_5 := Triangle 4.000 5.000 6.000; + TERM NEAR_6 := Triangle 5.000 6.000 7.000; + TERM NEAR_7 := Triangle 6.000 7.000 8.000; + TERM NEAR_8 := Triangle 7.000 8.000 9.000; + TERM NEAR_9 := Triangle 8.000 9.000 10.000; +END_FUZZIFY + +DEFUZZIFY outputFx + RANGE := (-1.000 .. 1.000); + TERM f1 := 0.840; + TERM f2 := 0.450; + TERM f3 := 0.040; + TERM f4 := -0.180; + TERM f5 := -0.190; + TERM f6 := -0.040; + TERM f7 := 0.090; + TERM f8 := 0.120; + TERM f9 := 0.040; + METHOD : COGS; + DEFAULT := nan | NC; +END_DEFUZZIFY + +DEFUZZIFY trueFx + RANGE := (-1.000 .. 1.000); + TERM fx := Function sin(inputX)/inputX; + METHOD : COGS; + DEFAULT := nan | NC; +END_DEFUZZIFY + +DEFUZZIFY diffFx + RANGE := (-1.000 .. 1.000); + TERM diff := Function fabs(outputFx-trueFx); + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + RULE 1 : if inputX is NEAR_1 then outputFx is f1 + RULE 2 : if inputX is NEAR_2 then outputFx is f2 + RULE 3 : if inputX is NEAR_3 then outputFx is f3 + RULE 4 : if inputX is NEAR_4 then outputFx is f4 + RULE 5 : if inputX is NEAR_5 then outputFx is f5 + RULE 6 : if inputX is NEAR_6 then outputFx is f6 + RULE 7 : if inputX is NEAR_7 then outputFx is f7 + RULE 8 : if inputX is NEAR_8 then outputFx is f8 + RULE 9 : if inputX is NEAR_9 then outputFx is f9 + RULE 10 : if inputX is any then trueFx is fx and diffFx is diff +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/approximation.fis b/examples/takagi-sugeno/approximation.fis new file mode 100644 index 0000000..2fcbc8d --- /dev/null +++ b/examples/takagi-sugeno/approximation.fis @@ -0,0 +1,66 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='approximation' +Type='sugeno' +Version=6.0 +NumInputs=1 +NumOutputs=3 +NumRules=10 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='inputX' +Range=[0.000 10.000] +NumMFs=9 +MF1='NEAR_1':'trimf',[0.000 1.000 2.000] +MF2='NEAR_2':'trimf',[1.000 2.000 3.000] +MF3='NEAR_3':'trimf',[2.000 3.000 4.000] +MF4='NEAR_4':'trimf',[3.000 4.000 5.000] +MF5='NEAR_5':'trimf',[4.000 5.000 6.000] +MF6='NEAR_6':'trimf',[5.000 6.000 7.000] +MF7='NEAR_7':'trimf',[6.000 7.000 8.000] +MF8='NEAR_8':'trimf',[7.000 8.000 9.000] +MF9='NEAR_9':'trimf',[8.000 9.000 10.000] + +[Output1] +Name='outputFx' +Range=[-1.000 1.000] +NumMFs=9 +MF1='f1':'constant',[0.840] +MF2='f2':'constant',[0.450] +MF3='f3':'constant',[0.040] +MF4='f4':'constant',[-0.180] +MF5='f5':'constant',[-0.190] +MF6='f6':'constant',[-0.040] +MF7='f7':'constant',[0.090] +MF8='f8':'constant',[0.120] +MF9='f9':'constant',[0.040] + +[Output2] +Name='trueFx' +Range=[-1.000 1.000] +NumMFs=1 +MF1='fx':'function',[sin(inputX)/inputX] + +[Output3] +Name='diffFx' +Range=[-1.000 1.000] +NumMFs=1 +MF1='diff':'function',[fabs(outputFx-trueFx)] + +[Rules] +1.000 , 1.000 0.000 0.000 (1.000) : 1 +2.000 , 2.000 0.000 0.000 (1.000) : 1 +3.000 , 3.000 0.000 0.000 (1.000) : 1 +4.000 , 4.000 0.000 0.000 (1.000) : 1 +5.000 , 5.000 0.000 0.000 (1.000) : 1 +6.000 , 6.000 0.000 0.000 (1.000) : 1 +7.000 , 7.000 0.000 0.000 (1.000) : 1 +8.000 , 8.000 0.000 0.000 (1.000) : 1 +9.000 , 9.000 0.000 0.000 (1.000) : 1 +0.990 , 0.000 1.000 1.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/approximation.fld b/examples/takagi-sugeno/approximation.fld new file mode 100644 index 0000000..1f3ba00 --- /dev/null +++ b/examples/takagi-sugeno/approximation.fld @@ -0,0 +1,1025 @@ +inputX outputFx trueFx diffFx +0.000000000 nan nan nan +0.009775171 0.840000000 0.999984074 0.159984074 +0.019550342 0.840000000 0.999936299 0.159936299 +0.029325513 0.840000000 0.999856675 0.159856675 +0.039100684 0.840000000 0.999745209 0.159745209 +0.048875855 0.840000000 0.999601906 0.159601906 +0.058651026 0.840000000 0.999426775 0.159426775 +0.068426197 0.840000000 0.999219825 0.159219825 +0.078201369 0.840000000 0.998981069 0.158981069 +0.087976540 0.840000000 0.998710521 0.158710521 +0.097751711 0.840000000 0.998408195 0.158408195 +0.107526882 0.840000000 0.998074109 0.158074109 +0.117302053 0.840000000 0.997708282 0.157708282 +0.127077224 0.840000000 0.997310736 0.157310736 +0.136852395 0.840000000 0.996881492 0.156881492 +0.146627566 0.840000000 0.996420576 0.156420576 +0.156402737 0.840000000 0.995928014 0.155928014 +0.166177908 0.840000000 0.995403835 0.155403835 +0.175953079 0.840000000 0.994848067 0.154848067 +0.185728250 0.840000000 0.994260744 0.154260744 +0.195503421 0.840000000 0.993641898 0.153641898 +0.205278592 0.840000000 0.992991566 0.152991566 +0.215053763 0.840000000 0.992309784 0.152309784 +0.224828935 0.840000000 0.991596592 0.151596592 +0.234604106 0.840000000 0.990852030 0.150852030 +0.244379277 0.840000000 0.990076141 0.150076141 +0.254154448 0.840000000 0.989268970 0.149268970 +0.263929619 0.840000000 0.988430562 0.148430562 +0.273704790 0.840000000 0.987560966 0.147560966 +0.283479961 0.840000000 0.986660231 0.146660231 +0.293255132 0.840000000 0.985728410 0.145728410 +0.303030303 0.840000000 0.984765555 0.144765555 +0.312805474 0.840000000 0.983771721 0.143771721 +0.322580645 0.840000000 0.982746966 0.142746966 +0.332355816 0.840000000 0.981691347 0.141691347 +0.342130987 0.840000000 0.980604926 0.140604926 +0.351906158 0.840000000 0.979487765 0.139487765 +0.361681329 0.840000000 0.978339927 0.138339927 +0.371456500 0.840000000 0.977161478 0.137161478 +0.381231672 0.840000000 0.975952486 0.135952486 +0.391006843 0.840000000 0.974713019 0.134713019 +0.400782014 0.840000000 0.973443149 0.133443149 +0.410557185 0.840000000 0.972142948 0.132142948 +0.420332356 0.840000000 0.970812490 0.130812490 +0.430107527 0.840000000 0.969451851 0.129451851 +0.439882698 0.840000000 0.968061110 0.128061110 +0.449657869 0.840000000 0.966640345 0.126640345 +0.459433040 0.840000000 0.965189638 0.125189638 +0.469208211 0.840000000 0.963709072 0.123709072 +0.478983382 0.840000000 0.962198730 0.122198730 +0.488758553 0.840000000 0.960658700 0.120658700 +0.498533724 0.840000000 0.959089069 0.119089069 +0.508308895 0.840000000 0.957489927 0.117489927 +0.518084066 0.840000000 0.955861365 0.115861365 +0.527859238 0.840000000 0.954203476 0.114203476 +0.537634409 0.840000000 0.952516354 0.112516354 +0.547409580 0.840000000 0.950800096 0.110800096 +0.557184751 0.840000000 0.949054799 0.109054799 +0.566959922 0.840000000 0.947280564 0.107280564 +0.576735093 0.840000000 0.945477490 0.105477490 +0.586510264 0.840000000 0.943645681 0.103645681 +0.596285435 0.840000000 0.941785241 0.101785241 +0.606060606 0.840000000 0.939896276 0.099896276 +0.615835777 0.840000000 0.937978894 0.097978894 +0.625610948 0.840000000 0.936033204 0.096033204 +0.635386119 0.840000000 0.934059316 0.094059316 +0.645161290 0.840000000 0.932057343 0.092057343 +0.654936461 0.840000000 0.930027398 0.090027398 +0.664711632 0.840000000 0.927969597 0.087969597 +0.674486804 0.840000000 0.925884058 0.085884058 +0.684261975 0.840000000 0.923770897 0.083770897 +0.694037146 0.840000000 0.921630237 0.081630237 +0.703812317 0.840000000 0.919462198 0.079462198 +0.713587488 0.840000000 0.917266903 0.077266903 +0.723362659 0.840000000 0.915044476 0.075044476 +0.733137830 0.840000000 0.912795045 0.072795045 +0.742913001 0.840000000 0.910518737 0.070518737 +0.752688172 0.840000000 0.908215680 0.068215680 +0.762463343 0.840000000 0.905886006 0.065886006 +0.772238514 0.840000000 0.903529847 0.063529847 +0.782013685 0.840000000 0.901147335 0.061147335 +0.791788856 0.840000000 0.898738606 0.058738606 +0.801564027 0.840000000 0.896303797 0.056303797 +0.811339198 0.840000000 0.893843045 0.053843045 +0.821114370 0.840000000 0.891356490 0.051356490 +0.830889541 0.840000000 0.888844272 0.048844272 +0.840664712 0.840000000 0.886306533 0.046306533 +0.850439883 0.840000000 0.883743417 0.043743417 +0.860215054 0.840000000 0.881155068 0.041155068 +0.869990225 0.840000000 0.878541634 0.038541634 +0.879765396 0.840000000 0.875903261 0.035903261 +0.889540567 0.840000000 0.873240099 0.033240099 +0.899315738 0.840000000 0.870552298 0.030552298 +0.909090909 0.840000000 0.867840009 0.027840009 +0.918866080 0.840000000 0.865103386 0.025103386 +0.928641251 0.840000000 0.862342583 0.022342583 +0.938416422 0.840000000 0.859557755 0.019557755 +0.948191593 0.840000000 0.856749059 0.016749059 +0.957966764 0.840000000 0.853916654 0.013916654 +0.967741935 0.840000000 0.851060700 0.011060700 +0.977517107 0.840000000 0.848181355 0.008181355 +0.987292278 0.840000000 0.845278784 0.005278784 +0.997067449 0.840000000 0.842353148 0.002353148 +1.006842620 0.837331378 0.839404613 0.002073235 +1.016617791 0.833519062 0.836433344 0.002914283 +1.026392962 0.829706745 0.833439508 0.003732763 +1.036168133 0.825894428 0.830423273 0.004528844 +1.045943304 0.822082111 0.827384807 0.005302696 +1.055718475 0.818269795 0.824324283 0.006054488 +1.065493646 0.814457478 0.821241871 0.006784393 +1.075268817 0.810645161 0.818137743 0.007492582 +1.085043988 0.806832845 0.815012075 0.008179230 +1.094819159 0.803020528 0.811865040 0.008844512 +1.104594330 0.799208211 0.808696816 0.009488604 +1.114369501 0.795395894 0.805507578 0.010111684 +1.124144673 0.791583578 0.802297506 0.010713928 +1.133919844 0.787771261 0.799066779 0.011295518 +1.143695015 0.783958944 0.795815577 0.011856632 +1.153470186 0.780146628 0.792544081 0.012397454 +1.163245357 0.776334311 0.789252476 0.012918165 +1.173020528 0.772521994 0.785940943 0.013418949 +1.182795699 0.768709677 0.782609668 0.013899990 +1.192570870 0.764897361 0.779258836 0.014361475 +1.202346041 0.761085044 0.775888633 0.014803589 +1.212121212 0.757272727 0.772499248 0.015226521 +1.221896383 0.753460411 0.769090869 0.015630459 +1.231671554 0.749648094 0.765663685 0.016015592 +1.241446725 0.745835777 0.762217888 0.016382110 +1.251221896 0.742023460 0.758753667 0.016730207 +1.260997067 0.738211144 0.755271216 0.017060072 +1.270772239 0.734398827 0.751770728 0.017371901 +1.280547410 0.730586510 0.748252396 0.017665886 +1.290322581 0.726774194 0.744716416 0.017942223 +1.300097752 0.722961877 0.741162984 0.018201107 +1.309872923 0.719149560 0.737592296 0.018442736 +1.319648094 0.715337243 0.734004550 0.018667307 +1.329423265 0.711524927 0.730399945 0.018875018 +1.339198436 0.707712610 0.726778678 0.019066068 +1.348973607 0.703900293 0.723140951 0.019240658 +1.358748778 0.700087977 0.719486964 0.019398987 +1.368523949 0.696275660 0.715816918 0.019541259 +1.378299120 0.692463343 0.712131017 0.019667674 +1.388074291 0.688651026 0.708429462 0.019778436 +1.397849462 0.684838710 0.704712458 0.019873748 +1.407624633 0.681026393 0.700980209 0.019953816 +1.417399804 0.677214076 0.697232921 0.020018845 +1.427174976 0.673401760 0.693470798 0.020069039 +1.436950147 0.669589443 0.689694049 0.020104606 +1.446725318 0.665777126 0.685902879 0.020125753 +1.456500489 0.661964809 0.682097497 0.020132688 +1.466275660 0.658152493 0.678278112 0.020125619 +1.476050831 0.654340176 0.674444932 0.020104756 +1.485826002 0.650527859 0.670598167 0.020070308 +1.495601173 0.646715543 0.666738028 0.020022485 +1.505376344 0.642903226 0.662864725 0.019961499 +1.515151515 0.639090909 0.658978470 0.019887561 +1.524926686 0.635278592 0.655079475 0.019800882 +1.534701857 0.631466276 0.651167952 0.019701676 +1.544477028 0.627653959 0.647244115 0.019590156 +1.554252199 0.623841642 0.643308177 0.019466535 +1.564027370 0.620029326 0.639360352 0.019331027 +1.573802542 0.616217009 0.635400856 0.019183847 +1.583577713 0.612404692 0.631429902 0.019025209 +1.593352884 0.608592375 0.627447706 0.018855331 +1.603128055 0.604780059 0.623454485 0.018674426 +1.612903226 0.600967742 0.619450454 0.018482712 +1.622678397 0.597155425 0.615435831 0.018280406 +1.632453568 0.593343109 0.611410832 0.018067724 +1.642228739 0.589530792 0.607375676 0.017844884 +1.652003910 0.585718475 0.603330579 0.017612104 +1.661779081 0.581906158 0.599275761 0.017369603 +1.671554252 0.578093842 0.595211440 0.017117598 +1.681329423 0.574281525 0.591137834 0.016856310 +1.691104594 0.570469208 0.587055164 0.016585956 +1.700879765 0.566656891 0.582963649 0.016306757 +1.710654936 0.562844575 0.578863507 0.016018933 +1.720430108 0.559032258 0.574754961 0.015722703 +1.730205279 0.555219941 0.570638229 0.015418287 +1.739980450 0.551407625 0.566513532 0.015105908 +1.749755621 0.547595308 0.562381092 0.014785784 +1.759530792 0.543782991 0.558241129 0.014458138 +1.769305963 0.539970674 0.554093865 0.014123190 +1.779081134 0.536158358 0.549939520 0.013781162 +1.788856305 0.532346041 0.545778317 0.013432276 +1.798631476 0.528533724 0.541610476 0.013076752 +1.808406647 0.524721408 0.537436221 0.012714813 +1.818181818 0.520909091 0.533255772 0.012346681 +1.827956989 0.517096774 0.529069352 0.011972578 +1.837732160 0.513284457 0.524877183 0.011592726 +1.847507331 0.509472141 0.520679488 0.011207347 +1.857282502 0.505659824 0.516476488 0.010816664 +1.867057674 0.501847507 0.512268406 0.010420898 +1.876832845 0.498035191 0.508055464 0.010020273 +1.886608016 0.494222874 0.503837884 0.009615010 +1.896383187 0.490410557 0.499615890 0.009205333 +1.906158358 0.486598240 0.495389703 0.008791463 +1.915933529 0.482785924 0.491159546 0.008373622 +1.925708700 0.478973607 0.486925641 0.007952034 +1.935483871 0.475161290 0.482688211 0.007526920 +1.945259042 0.471348974 0.478447477 0.007098503 +1.955034213 0.467536657 0.474203662 0.006667005 +1.964809384 0.463724340 0.469956987 0.006232647 +1.974584555 0.459912023 0.465707675 0.005795652 +1.984359726 0.456099707 0.461455948 0.005356241 +1.994134897 0.452287390 0.457202027 0.004914637 +2.003910068 0.448396872 0.452946134 0.004549262 +2.013685239 0.444389052 0.448688489 0.004299437 +2.023460411 0.440381232 0.444429315 0.004048083 +2.033235582 0.436373412 0.440168832 0.003795420 +2.043010753 0.432365591 0.435907260 0.003541669 +2.052785924 0.428357771 0.431644821 0.003287050 +2.062561095 0.424349951 0.427381735 0.003031784 +2.072336266 0.420342131 0.423118222 0.002776091 +2.082111437 0.416334311 0.418854501 0.002520190 +2.091886608 0.412326491 0.414590792 0.002264301 +2.101661779 0.408318671 0.410327314 0.002008643 +2.111436950 0.404310850 0.406064286 0.001753436 +2.121212121 0.400303030 0.401801927 0.001498897 +2.130987292 0.396295210 0.397540455 0.001245245 +2.140762463 0.392287390 0.393280087 0.000992697 +2.150537634 0.388279570 0.389021042 0.000741472 +2.160312805 0.384271750 0.384763536 0.000491786 +2.170087977 0.380263930 0.380507786 0.000243857 +2.179863148 0.376256109 0.376254009 0.000002100 +2.189638319 0.372248289 0.372002420 0.000245869 +2.199413490 0.368240469 0.367753235 0.000487234 +2.209188661 0.364232649 0.363506669 0.000725980 +2.218963832 0.360224829 0.359262937 0.000961892 +2.228739003 0.356217009 0.355022251 0.001194757 +2.238514174 0.352209189 0.350784828 0.001424361 +2.248289345 0.348201369 0.346550878 0.001650491 +2.258064516 0.344193548 0.342320615 0.001872933 +2.267839687 0.340185728 0.338094251 0.002091477 +2.277614858 0.336177908 0.333871998 0.002305910 +2.287390029 0.332170088 0.329654066 0.002516022 +2.297165200 0.328162268 0.325440666 0.002721602 +2.306940371 0.324154448 0.321232007 0.002922440 +2.316715543 0.320146628 0.317028300 0.003118328 +2.326490714 0.316138807 0.312829752 0.003309056 +2.336265885 0.312130987 0.308636571 0.003494416 +2.346041056 0.308123167 0.304448965 0.003674202 +2.355816227 0.304115347 0.300267141 0.003848206 +2.365591398 0.300107527 0.296091304 0.004016222 +2.375366569 0.296099707 0.291921661 0.004178046 +2.385141740 0.292091887 0.287758415 0.004333472 +2.394916911 0.288084066 0.283601770 0.004482296 +2.404692082 0.284076246 0.279451931 0.004624315 +2.414467253 0.280068426 0.275309099 0.004759327 +2.424242424 0.276060606 0.271173477 0.004887129 +2.434017595 0.272052786 0.267045265 0.005007521 +2.443792766 0.268044966 0.262924663 0.005120302 +2.453567937 0.264037146 0.258811872 0.005225273 +2.463343109 0.260029326 0.254707090 0.005322235 +2.473118280 0.256021505 0.250610515 0.005410990 +2.482893451 0.252013685 0.246522344 0.005491341 +2.492668622 0.248005865 0.242442774 0.005563091 +2.502443793 0.243998045 0.238371999 0.005626046 +2.512218964 0.239990225 0.234310215 0.005680009 +2.521994135 0.235982405 0.230257616 0.005724789 +2.531769306 0.231974585 0.226214394 0.005760191 +2.541544477 0.227966764 0.222180741 0.005786024 +2.551319648 0.223958944 0.218156848 0.005802096 +2.561094819 0.219951124 0.214142907 0.005808217 +2.570869990 0.215943304 0.210139105 0.005804199 +2.580645161 0.211935484 0.206145632 0.005789852 +2.590420332 0.207927664 0.202162674 0.005764989 +2.600195503 0.203919844 0.198190419 0.005729424 +2.609970674 0.199912023 0.194229052 0.005682971 +2.619745846 0.195904203 0.190278758 0.005625446 +2.629521017 0.191896383 0.186339719 0.005556664 +2.639296188 0.187888563 0.182412119 0.005476444 +2.649071359 0.183880743 0.178496140 0.005384603 +2.658846530 0.179872923 0.174591961 0.005280962 +2.668621701 0.175865103 0.170699762 0.005165340 +2.678396872 0.171857283 0.166819723 0.005037560 +2.688172043 0.167849462 0.162952019 0.004897443 +2.697947214 0.163841642 0.159096828 0.004744814 +2.707722385 0.159833822 0.155254326 0.004579496 +2.717497556 0.155826002 0.151424685 0.004401317 +2.727272727 0.151818182 0.147608080 0.004210102 +2.737047898 0.147810362 0.143804682 0.004005680 +2.746823069 0.143802542 0.140014663 0.003787879 +2.756598240 0.139794721 0.136238191 0.003556530 +2.766373412 0.135786901 0.132475437 0.003311464 +2.776148583 0.131779081 0.128726567 0.003052514 +2.785923754 0.127771261 0.124991748 0.002779513 +2.795698925 0.123763441 0.121271145 0.002492296 +2.805474096 0.119755621 0.117564921 0.002190699 +2.815249267 0.115747801 0.113873241 0.001874559 +2.825024438 0.111739980 0.110196266 0.001543715 +2.834799609 0.107732160 0.106534155 0.001198005 +2.844574780 0.103724340 0.102887069 0.000837271 +2.854349951 0.099716520 0.099255166 0.000461354 +2.864125122 0.095708700 0.095638602 0.000070098 +2.873900293 0.091700880 0.092037533 0.000336653 +2.883675464 0.087693060 0.088452113 0.000759053 +2.893450635 0.083685239 0.084882496 0.001197256 +2.903225806 0.079677419 0.081328833 0.001651414 +2.913000978 0.075669599 0.077791275 0.002121676 +2.922776149 0.071661779 0.074269971 0.002608192 +2.932551320 0.067653959 0.070765070 0.003111111 +2.942326491 0.063646139 0.067276718 0.003630579 +2.952101662 0.059638319 0.063805060 0.004166741 +2.961876833 0.055630499 0.060350240 0.004719742 +2.971652004 0.051622678 0.056912402 0.005289724 +2.981427175 0.047614858 0.053491687 0.005876829 +2.991202346 0.043607038 0.050088235 0.006481197 +3.000977517 0.039784946 0.046702185 0.006917238 +3.010752688 0.037634409 0.043333674 0.005699265 +3.020527859 0.035483871 0.039982838 0.004498967 +3.030303030 0.033333333 0.036649813 0.003316479 +3.040078201 0.031182796 0.033334731 0.002151935 +3.049853372 0.029032258 0.030037724 0.001005466 +3.059628543 0.026881720 0.026758924 0.000122797 +3.069403715 0.024731183 0.023498459 0.001232724 +3.079178886 0.022580645 0.020256457 0.002324188 +3.088954057 0.020430108 0.017033044 0.003397063 +3.098729228 0.018279570 0.013828347 0.004451223 +3.108504399 0.016129032 0.010642487 0.005486545 +3.118279570 0.013978495 0.007475588 0.006502907 +3.128054741 0.011827957 0.004327769 0.007500188 +3.137829912 0.009677419 0.001199151 0.008478268 +3.147605083 0.007526882 -0.001910149 0.009437030 +3.157380254 0.005376344 -0.005000014 0.010376358 +3.167155425 0.003225806 -0.008070329 0.011296136 +3.176930596 0.001075269 -0.011120982 0.012196251 +3.186705767 -0.001075269 -0.014151860 0.013076591 +3.196480938 -0.003225806 -0.017162852 0.013937045 +3.206256109 -0.005376344 -0.020153849 0.014777505 +3.216031281 -0.007526882 -0.023124744 0.015597862 +3.225806452 -0.009677419 -0.026075431 0.016398012 +3.235581623 -0.011827957 -0.029005805 0.017177848 +3.245356794 -0.013978495 -0.031915762 0.017937268 +3.255131965 -0.016129032 -0.034805202 0.018676170 +3.264907136 -0.018279570 -0.037674024 0.019394454 +3.274682307 -0.020430108 -0.040522130 0.020092022 +3.284457478 -0.022580645 -0.043349422 0.020768777 +3.294232649 -0.024731183 -0.046155805 0.021424622 +3.304007820 -0.026881720 -0.048941185 0.022059465 +3.313782991 -0.029032258 -0.051705469 0.022673211 +3.323558162 -0.031182796 -0.054448567 0.023265771 +3.333333333 -0.033333333 -0.057170389 0.023837056 +3.343108504 -0.035483871 -0.059870847 0.024386976 +3.352883675 -0.037634409 -0.062549854 0.024915446 +3.362658847 -0.039784946 -0.065207327 0.025422380 +3.372434018 -0.041935484 -0.067843181 0.025907697 +3.382209189 -0.044086022 -0.070457335 0.026371313 +3.391984360 -0.046236559 -0.073049709 0.026813150 +3.401759531 -0.048387097 -0.075620224 0.027233127 +3.411534702 -0.050537634 -0.078168803 0.027631169 +3.421309873 -0.052688172 -0.080695371 0.028007199 +3.431085044 -0.054838710 -0.083199854 0.028361144 +3.440860215 -0.056989247 -0.085682179 0.028692932 +3.450635386 -0.059139785 -0.088142277 0.029002492 +3.460410557 -0.061290323 -0.090580077 0.029289754 +3.470185728 -0.063440860 -0.092995512 0.029554651 +3.479960899 -0.065591398 -0.095388516 0.029797118 +3.489736070 -0.067741935 -0.097759024 0.030017089 +3.499511241 -0.069892473 -0.100106975 0.030214502 +3.509286413 -0.072043011 -0.102432306 0.030389296 +3.519061584 -0.074193548 -0.104734958 0.030541410 +3.528836755 -0.076344086 -0.107014873 0.030670787 +3.538611926 -0.078494624 -0.109271995 0.030777371 +3.548387097 -0.080645161 -0.111506268 0.030861107 +3.558162268 -0.082795699 -0.113717639 0.030921940 +3.567937439 -0.084946237 -0.115906057 0.030959820 +3.577712610 -0.087096774 -0.118071471 0.030974697 +3.587487781 -0.089247312 -0.120213834 0.030966522 +3.597262952 -0.091397849 -0.122333097 0.030935248 +3.607038123 -0.093548387 -0.124429216 0.030880829 +3.616813294 -0.095698925 -0.126502148 0.030803223 +3.626588465 -0.097849462 -0.128551849 0.030702387 +3.636363636 -0.100000000 -0.130578280 0.030578280 +3.646138807 -0.102150538 -0.132581402 0.030430865 +3.655913978 -0.104301075 -0.134561177 0.030260102 +3.665689150 -0.106451613 -0.136517570 0.030065957 +3.675464321 -0.108602151 -0.138450547 0.029848396 +3.685239492 -0.110752688 -0.140360075 0.029607387 +3.695014663 -0.112903226 -0.142246123 0.029342897 +3.704789834 -0.115053763 -0.144108662 0.029054898 +3.714565005 -0.117204301 -0.145947664 0.028743363 +3.724340176 -0.119354839 -0.147763104 0.028408265 +3.734115347 -0.121505376 -0.149554957 0.028049580 +3.743890518 -0.123655914 -0.151323199 0.027667285 +3.753665689 -0.125806452 -0.153067810 0.027261359 +3.763440860 -0.127956989 -0.154788770 0.026831781 +3.773216031 -0.130107527 -0.156486061 0.026378534 +3.782991202 -0.132258065 -0.158159667 0.025901602 +3.792766373 -0.134408602 -0.159809571 0.025400969 +3.802541544 -0.136559140 -0.161435762 0.024876622 +3.812316716 -0.138709677 -0.163038227 0.024328550 +3.822091887 -0.140860215 -0.164616957 0.023756742 +3.831867058 -0.143010753 -0.166171942 0.023161190 +3.841642229 -0.145161290 -0.167703176 0.022541886 +3.851417400 -0.147311828 -0.169210654 0.021898826 +3.861192571 -0.149462366 -0.170694370 0.021232005 +3.870967742 -0.151612903 -0.172154324 0.020541421 +3.880742913 -0.153763441 -0.173590515 0.019827074 +3.890518084 -0.155913978 -0.175002943 0.019088965 +3.900293255 -0.158064516 -0.176391612 0.018327095 +3.910068426 -0.160215054 -0.177756524 0.017541470 +3.919843597 -0.162365591 -0.179097686 0.016732094 +3.929618768 -0.164516129 -0.180415104 0.015898975 +3.939393939 -0.166666667 -0.181708788 0.015042122 +3.949169110 -0.168817204 -0.182978748 0.014161544 +3.958944282 -0.170967742 -0.184224995 0.013257253 +3.968719453 -0.173118280 -0.185447544 0.012329264 +3.978494624 -0.175268817 -0.186646408 0.011377591 +3.988269795 -0.177419355 -0.187821604 0.010402249 +3.998044966 -0.179569892 -0.188973151 0.009403258 +4.007820137 -0.180078201 -0.190101067 0.010022866 +4.017595308 -0.180175953 -0.191205374 0.011029421 +4.027370479 -0.180273705 -0.192286095 0.012012390 +4.037145650 -0.180371457 -0.193343253 0.012971796 +4.046920821 -0.180469208 -0.194376874 0.013907665 +4.056695992 -0.180566960 -0.195386985 0.014820025 +4.066471163 -0.180664712 -0.196373614 0.015708903 +4.076246334 -0.180762463 -0.197336793 0.016574330 +4.086021505 -0.180860215 -0.198276552 0.017416337 +4.095796676 -0.180957967 -0.199192925 0.018234958 +4.105571848 -0.181055718 -0.200085945 0.019030227 +4.115347019 -0.181153470 -0.200955650 0.019802180 +4.125122190 -0.181251222 -0.201802077 0.020550855 +4.134897361 -0.181348974 -0.202625264 0.021276290 +4.144672532 -0.181446725 -0.203425253 0.021978527 +4.154447703 -0.181544477 -0.204202084 0.022657607 +4.164222874 -0.181642229 -0.204955802 0.023313574 +4.173998045 -0.181739980 -0.205686452 0.023946472 +4.183773216 -0.181837732 -0.206394079 0.024556347 +4.193548387 -0.181935484 -0.207078732 0.025143248 +4.203323558 -0.182033236 -0.207740459 0.025707224 +4.213098729 -0.182130987 -0.208379312 0.026248324 +4.222873900 -0.182228739 -0.208995341 0.026766602 +4.232649071 -0.182326491 -0.209588601 0.027262110 +4.242424242 -0.182424242 -0.210159146 0.027734904 +4.252199413 -0.182521994 -0.210707033 0.028185039 +4.261974585 -0.182619746 -0.211232319 0.028612574 +4.271749756 -0.182717498 -0.211735064 0.029017566 +4.281524927 -0.182815249 -0.212215327 0.029400078 +4.291300098 -0.182913001 -0.212673170 0.029760169 +4.301075269 -0.183010753 -0.213108657 0.030097904 +4.310850440 -0.183108504 -0.213521852 0.030413347 +4.320625611 -0.183206256 -0.213912820 0.030706564 +4.330400782 -0.183304008 -0.214281630 0.030977622 +4.340175953 -0.183401760 -0.214628349 0.031226589 +4.349951124 -0.183499511 -0.214953047 0.031453536 +4.359726295 -0.183597263 -0.215255796 0.031658533 +4.369501466 -0.183695015 -0.215536668 0.031841654 +4.379276637 -0.183792766 -0.215795737 0.032002971 +4.389051808 -0.183890518 -0.216033078 0.032142560 +4.398826979 -0.183988270 -0.216248767 0.032260497 +4.408602151 -0.184086022 -0.216442883 0.032356861 +4.418377322 -0.184183773 -0.216615503 0.032431730 +4.428152493 -0.184281525 -0.216766708 0.032485183 +4.437927664 -0.184379277 -0.216896581 0.032517304 +4.447702835 -0.184477028 -0.217005203 0.032528174 +4.457478006 -0.184574780 -0.217092658 0.032517878 +4.467253177 -0.184672532 -0.217159032 0.032486500 +4.477028348 -0.184770283 -0.217204411 0.032434128 +4.486803519 -0.184868035 -0.217228884 0.032360849 +4.496578690 -0.184965787 -0.217232538 0.032266751 +4.506353861 -0.185063539 -0.217215464 0.032151925 +4.516129032 -0.185161290 -0.217177753 0.032016463 +4.525904203 -0.185259042 -0.217119498 0.031860456 +4.535679374 -0.185356794 -0.217040792 0.031683998 +4.545454545 -0.185454545 -0.216941730 0.031487185 +4.555229717 -0.185552297 -0.216822409 0.031270112 +4.565004888 -0.185650049 -0.216682925 0.031032876 +4.574780059 -0.185747801 -0.216523376 0.030775576 +4.584555230 -0.185845552 -0.216343863 0.030498310 +4.594330401 -0.185943304 -0.216144485 0.030201181 +4.604105572 -0.186041056 -0.215925344 0.029884288 +4.613880743 -0.186138807 -0.215686543 0.029547735 +4.623655914 -0.186236559 -0.215428185 0.029191626 +4.633431085 -0.186334311 -0.215150377 0.028816066 +4.643206256 -0.186432063 -0.214853223 0.028421161 +4.652981427 -0.186529814 -0.214536831 0.028007017 +4.662756598 -0.186627566 -0.214201309 0.027573743 +4.672531769 -0.186725318 -0.213846766 0.027121448 +4.682306940 -0.186823069 -0.213473312 0.026650242 +4.692082111 -0.186920821 -0.213081058 0.026160237 +4.701857283 -0.187018573 -0.212670118 0.025651545 +4.711632454 -0.187116325 -0.212240603 0.025124279 +4.721407625 -0.187214076 -0.211792629 0.024578553 +4.731182796 -0.187311828 -0.211326310 0.024014482 +4.740957967 -0.187409580 -0.210841763 0.023432183 +4.750733138 -0.187507331 -0.210339104 0.022831773 +4.760508309 -0.187605083 -0.209818453 0.022213370 +4.770283480 -0.187702835 -0.209279928 0.021577093 +4.780058651 -0.187800587 -0.208723648 0.020923062 +4.789833822 -0.187898338 -0.208149736 0.020251398 +4.799608993 -0.187996090 -0.207558313 0.019562223 +4.809384164 -0.188093842 -0.206949501 0.018855660 +4.819159335 -0.188191593 -0.206323425 0.018131831 +4.828934506 -0.188289345 -0.205680208 0.017390863 +4.838709677 -0.188387097 -0.205019977 0.016632880 +4.848484848 -0.188484848 -0.204342856 0.015858008 +4.858260020 -0.188582600 -0.203648975 0.015066375 +4.868035191 -0.188680352 -0.202938460 0.014258108 +4.877810362 -0.188778104 -0.202211440 0.013433336 +4.887585533 -0.188875855 -0.201468044 0.012592189 +4.897360704 -0.188973607 -0.200708404 0.011734797 +4.907135875 -0.189071359 -0.199932650 0.010861292 +4.916911046 -0.189169110 -0.199140915 0.009971804 +4.926686217 -0.189266862 -0.198333330 0.009066468 +4.936461388 -0.189364614 -0.197510031 0.008145417 +4.946236559 -0.189462366 -0.196671149 0.007208784 +4.956011730 -0.189560117 -0.195816822 0.006256704 +4.965786901 -0.189657869 -0.194947184 0.005289315 +4.975562072 -0.189755621 -0.194062371 0.004306751 +4.985337243 -0.189853372 -0.193162522 0.003309149 +4.995112414 -0.189951124 -0.192247773 0.002296649 +5.004887586 -0.189266862 -0.191318264 0.002051402 +5.014662757 -0.187800587 -0.190374133 0.002573546 +5.024437928 -0.186334311 -0.189415520 0.003081209 +5.034213099 -0.184868035 -0.188442566 0.003574530 +5.043988270 -0.183401760 -0.187455411 0.004053652 +5.053763441 -0.181935484 -0.186454198 0.004518714 +5.063538612 -0.180469208 -0.185439069 0.004969861 +5.073313783 -0.179002933 -0.184410166 0.005407234 +5.083088954 -0.177536657 -0.183367634 0.005830977 +5.092864125 -0.176070381 -0.182311616 0.006241235 +5.102639296 -0.174604106 -0.181242257 0.006638152 +5.112414467 -0.173137830 -0.180159702 0.007021872 +5.122189638 -0.171671554 -0.179064097 0.007392543 +5.131964809 -0.170205279 -0.177955589 0.007750310 +5.141739980 -0.168739003 -0.176834323 0.008095320 +5.151515152 -0.167272727 -0.175700447 0.008427720 +5.161290323 -0.165806452 -0.174554110 0.008747658 +5.171065494 -0.164340176 -0.173395458 0.009055283 +5.180840665 -0.162873900 -0.172224642 0.009350742 +5.190615836 -0.161407625 -0.171041810 0.009634186 +5.200391007 -0.159941349 -0.169847112 0.009905763 +5.210166178 -0.158475073 -0.168640698 0.010165625 +5.219941349 -0.157008798 -0.167422718 0.010413921 +5.229716520 -0.155542522 -0.166193324 0.010650802 +5.239491691 -0.154076246 -0.164952666 0.010876420 +5.249266862 -0.152609971 -0.163700897 0.011090926 +5.259042033 -0.151143695 -0.162438167 0.011294472 +5.268817204 -0.149677419 -0.161164631 0.011487212 +5.278592375 -0.148211144 -0.159880440 0.011669296 +5.288367546 -0.146744868 -0.158585748 0.011840880 +5.298142717 -0.145278592 -0.157280708 0.012002115 +5.307917889 -0.143812317 -0.155965473 0.012153157 +5.317693060 -0.142346041 -0.154640199 0.012294158 +5.327468231 -0.140879765 -0.153305038 0.012425273 +5.337243402 -0.139413490 -0.151960146 0.012546657 +5.347018573 -0.137947214 -0.150605678 0.012658464 +5.356793744 -0.136480938 -0.149241789 0.012760850 +5.366568915 -0.135014663 -0.147868633 0.012853971 +5.376344086 -0.133548387 -0.146486368 0.012937981 +5.386119257 -0.132082111 -0.145095148 0.013013036 +5.395894428 -0.130615836 -0.143695129 0.013079293 +5.405669599 -0.129149560 -0.142286468 0.013136908 +5.415444770 -0.127683284 -0.140869321 0.013186036 +5.425219941 -0.126217009 -0.139443844 0.013226835 +5.434995112 -0.124750733 -0.138010195 0.013259462 +5.444770283 -0.123284457 -0.136568530 0.013284072 +5.454545455 -0.121818182 -0.135119006 0.013300824 +5.464320626 -0.120351906 -0.133661780 0.013309874 +5.474095797 -0.118885630 -0.132197009 0.013311379 +5.483870968 -0.117419355 -0.130724852 0.013305497 +5.493646139 -0.115953079 -0.129245464 0.013292385 +5.503421310 -0.114486804 -0.127759003 0.013272200 +5.513196481 -0.113020528 -0.126265628 0.013245100 +5.522971652 -0.111554252 -0.124765495 0.013211243 +5.532746823 -0.110087977 -0.123258763 0.013170786 +5.542521994 -0.108621701 -0.121745588 0.013123887 +5.552297165 -0.107155425 -0.120226129 0.013070703 +5.562072336 -0.105689150 -0.118700542 0.013011393 +5.571847507 -0.104222874 -0.117168986 0.012946112 +5.581622678 -0.102756598 -0.115631619 0.012875020 +5.591397849 -0.101290323 -0.114088597 0.012798274 +5.601173021 -0.099824047 -0.112540078 0.012716031 +5.610948192 -0.098357771 -0.110986220 0.012628449 +5.620723363 -0.096891496 -0.109427180 0.012535685 +5.630498534 -0.095425220 -0.107863116 0.012437896 +5.640273705 -0.093958944 -0.106294184 0.012335240 +5.650048876 -0.092492669 -0.104720542 0.012227873 +5.659824047 -0.091026393 -0.103142346 0.012115953 +5.669599218 -0.089560117 -0.101559754 0.011999637 +5.679374389 -0.088093842 -0.099972922 0.011879080 +5.689149560 -0.086627566 -0.098382007 0.011754441 +5.698924731 -0.085161290 -0.096787164 0.011625874 +5.708699902 -0.083695015 -0.095188551 0.011493537 +5.718475073 -0.082228739 -0.093586324 0.011357585 +5.728250244 -0.080762463 -0.091980637 0.011218174 +5.738025415 -0.079296188 -0.090371648 0.011075460 +5.747800587 -0.077829912 -0.088759510 0.010929598 +5.757575758 -0.076363636 -0.087144380 0.010780744 +5.767350929 -0.074897361 -0.085526412 0.010629051 +5.777126100 -0.073431085 -0.083905761 0.010474676 +5.786901271 -0.071964809 -0.082282581 0.010317771 +5.796676442 -0.070498534 -0.080657026 0.010158492 +5.806451613 -0.069032258 -0.079029251 0.009996993 +5.816226784 -0.067565982 -0.077399408 0.009833426 +5.826001955 -0.066099707 -0.075767651 0.009667945 +5.835777126 -0.064633431 -0.074134133 0.009500702 +5.845552297 -0.063167155 -0.072499007 0.009331851 +5.855327468 -0.061700880 -0.070862424 0.009161544 +5.865102639 -0.060234604 -0.069224536 0.008989932 +5.874877810 -0.058768328 -0.067585496 0.008817167 +5.884652981 -0.057302053 -0.065945453 0.008643400 +5.894428152 -0.055835777 -0.064304559 0.008468782 +5.904203324 -0.054369501 -0.062662964 0.008293463 +5.913978495 -0.052903226 -0.061020818 0.008117593 +5.923753666 -0.051436950 -0.059378271 0.007941321 +5.933528837 -0.049970674 -0.057735471 0.007764797 +5.943304008 -0.048504399 -0.056092568 0.007588169 +5.953079179 -0.047038123 -0.054449709 0.007411586 +5.962854350 -0.045571848 -0.052807042 0.007235194 +5.972629521 -0.044105572 -0.051164714 0.007059142 +5.982404692 -0.042639296 -0.049522873 0.006883577 +5.992179863 -0.041173021 -0.047881664 0.006708643 +6.001955034 -0.039745846 -0.046241233 0.006495387 +6.011730205 -0.038475073 -0.044601725 0.006126652 +6.021505376 -0.037204301 -0.042963286 0.005758985 +6.031280547 -0.035933529 -0.041326059 0.005392530 +6.041055718 -0.034662757 -0.039690188 0.005027431 +6.050830890 -0.033391984 -0.038055816 0.004663832 +6.060606061 -0.032121212 -0.036423086 0.004301874 +6.070381232 -0.030850440 -0.034792139 0.003941699 +6.080156403 -0.029579668 -0.033163118 0.003583450 +6.089931574 -0.028308895 -0.031536162 0.003227267 +6.099706745 -0.027038123 -0.029911413 0.002873289 +6.109481916 -0.025767351 -0.028289009 0.002521658 +6.119257087 -0.024496579 -0.026669089 0.002172511 +6.129032258 -0.023225806 -0.025051793 0.001825986 +6.138807429 -0.021955034 -0.023437257 0.001482223 +6.148582600 -0.020684262 -0.021825619 0.001141357 +6.158357771 -0.019413490 -0.020217015 0.000803526 +6.168132942 -0.018142717 -0.018611581 0.000468864 +6.177908113 -0.016871945 -0.017009452 0.000137507 +6.187683284 -0.015601173 -0.015410762 0.000190411 +6.197458456 -0.014330401 -0.013815645 0.000514755 +6.207233627 -0.013059629 -0.012224234 0.000835394 +6.217008798 -0.011788856 -0.010636662 0.001152195 +6.226783969 -0.010518084 -0.009053059 0.001465025 +6.236559140 -0.009247312 -0.007473556 0.001773756 +6.246334311 -0.007976540 -0.005898284 0.002078255 +6.256109482 -0.006705767 -0.004327373 0.002378395 +6.265884653 -0.005434995 -0.002760950 0.002674046 +6.275659824 -0.004164223 -0.001199143 0.002965080 +6.285434995 -0.002893451 0.000357920 0.003251371 +6.295210166 -0.001622678 0.001910114 0.003532792 +6.304985337 -0.000351906 0.003457312 0.003809218 +6.314760508 0.000918866 0.004999391 0.004080525 +6.324535679 0.002189638 0.006536225 0.004346587 +6.334310850 0.003460411 0.008067693 0.004607282 +6.344086022 0.004731183 0.009593671 0.004862488 +6.353861193 0.006001955 0.011114039 0.005112084 +6.363636364 0.007272727 0.012628676 0.005355948 +6.373411535 0.008543500 0.014137461 0.005593962 +6.383186706 0.009814272 0.015640277 0.005826005 +6.392961877 0.011085044 0.017137005 0.006051961 +6.402737048 0.012355816 0.018627527 0.006271711 +6.412512219 0.013626588 0.020111728 0.006485140 +6.422287390 0.014897361 0.021589493 0.006692132 +6.432062561 0.016168133 0.023060705 0.006892572 +6.441837732 0.017438905 0.024525253 0.007086348 +6.451612903 0.018709677 0.025983022 0.007273345 +6.461388074 0.019980450 0.027433902 0.007453453 +6.471163245 0.021251222 0.028877781 0.007626559 +6.480938416 0.022521994 0.030314550 0.007792555 +6.490713587 0.023792766 0.031744098 0.007951331 +6.500488759 0.025063539 0.033166318 0.008102779 +6.510263930 0.026334311 0.034581103 0.008246792 +6.520039101 0.027605083 0.035988346 0.008383263 +6.529814272 0.028875855 0.037387943 0.008512087 +6.539589443 0.030146628 0.038779788 0.008633160 +6.549364614 0.031417400 0.040163778 0.008746378 +6.559139785 0.032688172 0.041539811 0.008851639 +6.568914956 0.033958944 0.042907785 0.008948841 +6.578690127 0.035229717 0.044267600 0.009037884 +6.588465298 0.036500489 0.045619157 0.009118668 +6.598240469 0.037771261 0.046962356 0.009191095 +6.608015640 0.039042033 0.048297101 0.009255067 +6.617790811 0.040312805 0.049623294 0.009310488 +6.627565982 0.041583578 0.050940840 0.009357263 +6.637341153 0.042854350 0.052249646 0.009395296 +6.647116325 0.044125122 0.053549616 0.009424494 +6.656891496 0.045395894 0.054840660 0.009444765 +6.666666667 0.046666667 0.056122685 0.009456018 +6.676441838 0.047937439 0.057395600 0.009458162 +6.686217009 0.049208211 0.058659318 0.009451107 +6.695992180 0.050478983 0.059913749 0.009434766 +6.705767351 0.051749756 0.061158806 0.009409051 +6.715542522 0.053020528 0.062394403 0.009373876 +6.725317693 0.054291300 0.063620455 0.009329155 +6.735092864 0.055562072 0.064836878 0.009274806 +6.744868035 0.056832845 0.066043589 0.009210744 +6.754643206 0.058103617 0.067240505 0.009136888 +6.764418377 0.059374389 0.068427546 0.009053157 +6.774193548 0.060645161 0.069604633 0.008959471 +6.783968719 0.061915934 0.070771685 0.008855752 +6.793743891 0.063186706 0.071928627 0.008741921 +6.803519062 0.064457478 0.073075381 0.008617903 +6.813294233 0.065728250 0.074211872 0.008483622 +6.823069404 0.066999022 0.075338026 0.008339003 +6.832844575 0.068269795 0.076453768 0.008183974 +6.842619746 0.069540567 0.077559028 0.008018461 +6.852394917 0.070811339 0.078653734 0.007842395 +6.862170088 0.072082111 0.079737817 0.007655705 +6.871945259 0.073352884 0.080811207 0.007458323 +6.881720430 0.074623656 0.081873836 0.007250181 +6.891495601 0.075894428 0.082925639 0.007031211 +6.901270772 0.077165200 0.083966550 0.006801350 +6.911045943 0.078435973 0.084996504 0.006560532 +6.920821114 0.079706745 0.086015439 0.006308694 +6.930596285 0.080977517 0.087023292 0.006045774 +6.940371457 0.082248289 0.088020002 0.005771712 +6.950146628 0.083519062 0.089005509 0.005486448 +6.959921799 0.084789834 0.089979756 0.005189922 +6.969696970 0.086060606 0.090942684 0.004882078 +6.979472141 0.087331378 0.091894237 0.004562859 +6.989247312 0.088602151 0.092834360 0.004232209 +6.999022483 0.089872923 0.093762998 0.003890075 +7.008797654 0.090263930 0.094680100 0.004416170 +7.018572825 0.090557185 0.095585612 0.005028427 +7.028347996 0.090850440 0.096479485 0.005629045 +7.038123167 0.091143695 0.097361668 0.006217973 +7.047898338 0.091436950 0.098232114 0.006795164 +7.057673509 0.091730205 0.099090776 0.007360571 +7.067448680 0.092023460 0.099937607 0.007914147 +7.077223851 0.092316716 0.100772562 0.008455847 +7.086999022 0.092609971 0.101595599 0.008985628 +7.096774194 0.092903226 0.102406673 0.009503447 +7.106549365 0.093196481 0.103205745 0.010009264 +7.116324536 0.093489736 0.103992773 0.010503037 +7.126099707 0.093782991 0.104767719 0.010984727 +7.135874878 0.094076246 0.105530544 0.011454298 +7.145650049 0.094369501 0.106281212 0.011911711 +7.155425220 0.094662757 0.107019688 0.012356931 +7.165200391 0.094956012 0.107745936 0.012789925 +7.174975562 0.095249267 0.108459925 0.013210658 +7.184750733 0.095542522 0.109161621 0.013619099 +7.194525904 0.095835777 0.109850993 0.014015216 +7.204301075 0.096129032 0.110528013 0.014398980 +7.214076246 0.096422287 0.111192650 0.014770363 +7.223851417 0.096715543 0.111844879 0.015129336 +7.233626588 0.097008798 0.112484672 0.015475874 +7.243401760 0.097302053 0.113112004 0.015809951 +7.253176931 0.097595308 0.113726852 0.016131544 +7.262952102 0.097888563 0.114329192 0.016440629 +7.272727273 0.098181818 0.114919004 0.016737185 +7.282502444 0.098475073 0.115496266 0.017021192 +7.292277615 0.098768328 0.116060959 0.017292630 +7.302052786 0.099061584 0.116613065 0.017551481 +7.311827957 0.099354839 0.117152566 0.017797728 +7.321603128 0.099648094 0.117679448 0.018031354 +7.331378299 0.099941349 0.118193696 0.018252347 +7.341153470 0.100234604 0.118695295 0.018460691 +7.350928641 0.100527859 0.119184233 0.018656374 +7.360703812 0.100821114 0.119660499 0.018839385 +7.370478983 0.101114370 0.120124084 0.019009714 +7.380254154 0.101407625 0.120574977 0.019167352 +7.390029326 0.101700880 0.121013171 0.019312291 +7.399804497 0.101994135 0.121438660 0.019444525 +7.409579668 0.102287390 0.121851437 0.019564047 +7.419354839 0.102580645 0.122251499 0.019670854 +7.429130010 0.102873900 0.122638842 0.019764942 +7.438905181 0.103167155 0.123013464 0.019846308 +7.448680352 0.103460411 0.123375363 0.019914953 +7.458455523 0.103753666 0.123724541 0.019970875 +7.468230694 0.104046921 0.124060997 0.020014077 +7.478005865 0.104340176 0.124384736 0.020044560 +7.487781036 0.104633431 0.124695758 0.020062327 +7.497556207 0.104926686 0.124994071 0.020067385 +7.507331378 0.105219941 0.125279678 0.020059737 +7.517106549 0.105513196 0.125552588 0.020039391 +7.526881720 0.105806452 0.125812807 0.020006355 +7.536656891 0.106099707 0.126060345 0.019960638 +7.546432063 0.106392962 0.126295212 0.019902250 +7.556207234 0.106686217 0.126517418 0.019831201 +7.565982405 0.106979472 0.126726978 0.019747505 +7.575757576 0.107272727 0.126923902 0.019651175 +7.585532747 0.107565982 0.127108207 0.019542225 +7.595307918 0.107859238 0.127279908 0.019420670 +7.605083089 0.108152493 0.127439020 0.019286528 +7.614858260 0.108445748 0.127585563 0.019139815 +7.624633431 0.108739003 0.127719554 0.018980551 +7.634408602 0.109032258 0.127841014 0.018808756 +7.644183773 0.109325513 0.127949963 0.018624450 +7.653958944 0.109618768 0.128046424 0.018427655 +7.663734115 0.109912023 0.128130418 0.018218395 +7.673509286 0.110205279 0.128201972 0.017996693 +7.683284457 0.110498534 0.128261108 0.017762574 +7.693059629 0.110791789 0.128307854 0.017516065 +7.702834800 0.111085044 0.128342237 0.017257193 +7.712609971 0.111378299 0.128364284 0.016985985 +7.722385142 0.111671554 0.128374026 0.016702472 +7.732160313 0.111964809 0.128371492 0.016406683 +7.741935484 0.112258065 0.128356713 0.016098649 +7.751710655 0.112551320 0.128329723 0.015778403 +7.761485826 0.112844575 0.128290553 0.015445979 +7.771260997 0.113137830 0.128239239 0.015101409 +7.781036168 0.113431085 0.128175816 0.014744731 +7.790811339 0.113724340 0.128100319 0.014375979 +7.800586510 0.114017595 0.128012787 0.013995192 +7.810361681 0.114310850 0.127913257 0.013602407 +7.820136852 0.114604106 0.127801769 0.013197663 +7.829912023 0.114897361 0.127678362 0.012781001 +7.839687195 0.115190616 0.127543078 0.012352462 +7.849462366 0.115483871 0.127395959 0.011912088 +7.859237537 0.115777126 0.127237049 0.011459922 +7.869012708 0.116070381 0.127066390 0.010996009 +7.878787879 0.116363636 0.126884028 0.010520392 +7.888563050 0.116656891 0.126690009 0.010033117 +7.898338221 0.116950147 0.126484379 0.009534233 +7.908113392 0.117243402 0.126267187 0.009023785 +7.917888563 0.117536657 0.126038481 0.008501824 +7.927663734 0.117829912 0.125798310 0.007968398 +7.937438905 0.118123167 0.125546725 0.007423558 +7.947214076 0.118416422 0.125283778 0.006867356 +7.956989247 0.118709677 0.125009520 0.006299842 +7.966764418 0.119002933 0.124724004 0.005721072 +7.976539589 0.119296188 0.124427286 0.005131098 +7.986314761 0.119589443 0.124119418 0.004529975 +7.996089932 0.119882698 0.123800458 0.003917760 +8.005865103 0.119530792 0.123470462 0.003939670 +8.015640274 0.118748778 0.123129487 0.004380709 +8.025415445 0.117966764 0.122777591 0.004810827 +8.035190616 0.117184751 0.122414835 0.005230084 +8.044965787 0.116402737 0.122041276 0.005638539 +8.054740958 0.115620723 0.121656978 0.006036254 +8.064516129 0.114838710 0.121262000 0.006423290 +8.074291300 0.114056696 0.120856406 0.006799710 +8.084066471 0.113274682 0.120440258 0.007165576 +8.093841642 0.112492669 0.120013621 0.007520952 +8.103616813 0.111710655 0.119576559 0.007865904 +8.113391984 0.110928641 0.119129139 0.008200497 +8.123167155 0.110146628 0.118671425 0.008524798 +8.132942326 0.109364614 0.118203486 0.008838873 +8.142717498 0.108582600 0.117725390 0.009142790 +8.152492669 0.107800587 0.117237204 0.009436618 +8.162267840 0.107018573 0.116738999 0.009720426 +8.172043011 0.106236559 0.116230844 0.009994285 +8.181818182 0.105454545 0.115712811 0.010258266 +8.191593353 0.104672532 0.115184970 0.010512439 +8.201368524 0.103890518 0.114647395 0.010756877 +8.211143695 0.103108504 0.114100157 0.010991653 +8.220918866 0.102326491 0.113543331 0.011216841 +8.230694037 0.101544477 0.112976992 0.011432515 +8.240469208 0.100762463 0.112401213 0.011638750 +8.250244379 0.099980450 0.111816071 0.011835622 +8.260019550 0.099198436 0.111221643 0.012023207 +8.269794721 0.098416422 0.110618004 0.012201582 +8.279569892 0.097634409 0.110005234 0.012370825 +8.289345064 0.096852395 0.109383410 0.012531015 +8.299120235 0.096070381 0.108752611 0.012682230 +8.308895406 0.095288368 0.108112917 0.012824549 +8.318670577 0.094506354 0.107464408 0.012958054 +8.328445748 0.093724340 0.106807165 0.013082824 +8.338220919 0.092942326 0.106141268 0.013198942 +8.347996090 0.092160313 0.105466802 0.013306489 +8.357771261 0.091378299 0.104783846 0.013405547 +8.367546432 0.090596285 0.104092486 0.013496201 +8.377321603 0.089814272 0.103392805 0.013578533 +8.387096774 0.089032258 0.102684886 0.013652628 +8.396871945 0.088250244 0.101968816 0.013718571 +8.406647116 0.087468231 0.101244678 0.013776447 +8.416422287 0.086686217 0.100512560 0.013826343 +8.426197458 0.085904203 0.099772547 0.013868343 +8.435972630 0.085122190 0.099024726 0.013902537 +8.445747801 0.084340176 0.098269186 0.013929010 +8.455522972 0.083558162 0.097506013 0.013947850 +8.465298143 0.082776149 0.096735296 0.013959148 +8.475073314 0.081994135 0.095957125 0.013962990 +8.484848485 0.081212121 0.095171588 0.013959467 +8.494623656 0.080430108 0.094378776 0.013948668 +8.504398827 0.079648094 0.093578778 0.013930684 +8.514173998 0.078866080 0.092771686 0.013905606 +8.523949169 0.078084066 0.091957590 0.013873524 +8.533724340 0.077302053 0.091136583 0.013834530 +8.543499511 0.076520039 0.090308756 0.013788717 +8.553274682 0.075738025 0.089474202 0.013736177 +8.563049853 0.074956012 0.088633013 0.013677002 +8.572825024 0.074173998 0.087785284 0.013611286 +8.582600196 0.073391984 0.086931106 0.013539122 +8.592375367 0.072609971 0.086070575 0.013460605 +8.602150538 0.071827957 0.085203785 0.013375828 +8.611925709 0.071045943 0.084330831 0.013284887 +8.621700880 0.070263930 0.083451807 0.013187877 +8.631476051 0.069481916 0.082566808 0.013084893 +8.641251222 0.068699902 0.081675932 0.012976030 +8.651026393 0.067917889 0.080779273 0.012861385 +8.660801564 0.067135875 0.079876928 0.012741054 +8.670576735 0.066353861 0.078968994 0.012615133 +8.680351906 0.065571848 0.078055568 0.012483720 +8.690127077 0.064789834 0.077136747 0.012346913 +8.699902248 0.064007820 0.076212627 0.012204807 +8.709677419 0.063225806 0.075283308 0.012057502 +8.719452590 0.062443793 0.074348888 0.011905095 +8.729227761 0.061661779 0.073409463 0.011747684 +8.739002933 0.060879765 0.072465134 0.011585369 +8.748778104 0.060097752 0.071515998 0.011418247 +8.758553275 0.059315738 0.070562155 0.011246417 +8.768328446 0.058533724 0.069603704 0.011069980 +8.778103617 0.057751711 0.068640744 0.010889033 +8.787878788 0.056969697 0.067673375 0.010703678 +8.797653959 0.056187683 0.066701696 0.010514013 +8.807429130 0.055405670 0.065725808 0.010320138 +8.817204301 0.054623656 0.064745810 0.010122154 +8.826979472 0.053841642 0.063761802 0.009920160 +8.836754643 0.053059629 0.062773886 0.009714258 +8.846529814 0.052277615 0.061782162 0.009504547 +8.856304985 0.051495601 0.060786730 0.009291128 +8.866080156 0.050713587 0.059787690 0.009074103 +8.875855327 0.049931574 0.058785145 0.008853571 +8.885630499 0.049149560 0.057779195 0.008629635 +8.895405670 0.048367546 0.056769940 0.008402394 +8.905180841 0.047585533 0.055757483 0.008171950 +8.914956012 0.046803519 0.054741924 0.007938405 +8.924731183 0.046021505 0.053723365 0.007701859 +8.934506354 0.045239492 0.052701907 0.007462415 +8.944281525 0.044457478 0.051677651 0.007220173 +8.954056696 0.043675464 0.050650698 0.006975234 +8.963831867 0.042893451 0.049621151 0.006727701 +8.973607038 0.042111437 0.048589111 0.006477674 +8.983382209 0.041329423 0.047554679 0.006225256 +8.993157380 0.040547410 0.046517957 0.005970547 +9.002932551 0.040000000 0.045479046 0.005479046 +9.012707722 0.040000000 0.044438047 0.004438047 +9.022482893 0.040000000 0.043395063 0.003395063 +9.032258065 0.040000000 0.042350194 0.002350194 +9.042033236 0.040000000 0.041303542 0.001303542 +9.051808407 0.040000000 0.040255208 0.000255208 +9.061583578 0.040000000 0.039205294 0.000794706 +9.071358749 0.040000000 0.038153900 0.001846100 +9.081133920 0.040000000 0.037101127 0.002898873 +9.090909091 0.040000000 0.036047078 0.003952922 +9.100684262 0.040000000 0.034991852 0.005008148 +9.110459433 0.040000000 0.033935551 0.006064449 +9.120234604 0.040000000 0.032878274 0.007121726 +9.130009775 0.040000000 0.031820124 0.008179876 +9.139784946 0.040000000 0.030761199 0.009238801 +9.149560117 0.040000000 0.029701602 0.010298398 +9.159335288 0.040000000 0.028641430 0.011358570 +9.169110459 0.040000000 0.027580786 0.012419214 +9.178885630 0.040000000 0.026519767 0.013480233 +9.188660802 0.040000000 0.025458475 0.014541525 +9.198435973 0.040000000 0.024397009 0.015602991 +9.208211144 0.040000000 0.023335467 0.016664533 +9.217986315 0.040000000 0.022273950 0.017726050 +9.227761486 0.040000000 0.021212555 0.018787445 +9.237536657 0.040000000 0.020151382 0.019848618 +9.247311828 0.040000000 0.019090529 0.020909471 +9.257086999 0.040000000 0.018030094 0.021969906 +9.266862170 0.040000000 0.016970175 0.023029825 +9.276637341 0.040000000 0.015910870 0.024089130 +9.286412512 0.040000000 0.014852277 0.025147723 +9.296187683 0.040000000 0.013794492 0.026205508 +9.305962854 0.040000000 0.012737613 0.027262387 +9.315738025 0.040000000 0.011681736 0.028318264 +9.325513196 0.040000000 0.010626957 0.029373043 +9.335288368 0.040000000 0.009573373 0.030426627 +9.345063539 0.040000000 0.008521079 0.031478921 +9.354838710 0.040000000 0.007470171 0.032529829 +9.364613881 0.040000000 0.006420744 0.033579256 +9.374389052 0.040000000 0.005372893 0.034627107 +9.384164223 0.040000000 0.004326712 0.035673288 +9.393939394 0.040000000 0.003282295 0.036717705 +9.403714565 0.040000000 0.002239736 0.037760264 +9.413489736 0.040000000 0.001199129 0.038800871 +9.423264907 0.040000000 0.000160566 0.039839434 +9.433040078 0.040000000 -0.000875860 0.040875860 +9.442815249 0.040000000 -0.001910056 0.041910056 +9.452590420 0.040000000 -0.002941932 0.042941932 +9.462365591 0.040000000 -0.003971394 0.043971394 +9.472140762 0.040000000 -0.004998352 0.044998352 +9.481915934 0.040000000 -0.006022716 0.046022716 +9.491691105 0.040000000 -0.007044395 0.047044395 +9.501466276 0.040000000 -0.008063300 0.048063300 +9.511241447 0.040000000 -0.009079340 0.049079340 +9.521016618 0.040000000 -0.010092427 0.050092427 +9.530791789 0.040000000 -0.011102473 0.051102473 +9.540566960 0.040000000 -0.012109389 0.052109389 +9.550342131 0.040000000 -0.013113089 0.053113089 +9.560117302 0.040000000 -0.014113483 0.054113483 +9.569892473 0.040000000 -0.015110487 0.055110487 +9.579667644 0.040000000 -0.016104014 0.056104014 +9.589442815 0.040000000 -0.017093978 0.057093978 +9.599217986 0.040000000 -0.018080295 0.058080295 +9.608993157 0.040000000 -0.019062878 0.059062878 +9.618768328 0.040000000 -0.020041645 0.060041645 +9.628543500 0.040000000 -0.021016511 0.061016511 +9.638318671 0.040000000 -0.021987394 0.061987394 +9.648093842 0.040000000 -0.022954211 0.062954211 +9.657869013 0.040000000 -0.023916879 0.063916879 +9.667644184 0.040000000 -0.024875317 0.064875317 +9.677419355 0.040000000 -0.025829445 0.065829445 +9.687194526 0.040000000 -0.026779182 0.066779182 +9.696969697 0.040000000 -0.027724447 0.067724447 +9.706744868 0.040000000 -0.028665163 0.068665163 +9.716520039 0.040000000 -0.029601249 0.069601249 +9.726295210 0.040000000 -0.030532628 0.070532628 +9.736070381 0.040000000 -0.031459222 0.071459222 +9.745845552 0.040000000 -0.032380954 0.072380954 +9.755620723 0.040000000 -0.033297748 0.073297748 +9.765395894 0.040000000 -0.034209528 0.074209528 +9.775171065 0.040000000 -0.035116220 0.075116220 +9.784946237 0.040000000 -0.036017747 0.076017747 +9.794721408 0.040000000 -0.036914037 0.076914037 +9.804496579 0.040000000 -0.037805016 0.077805016 +9.814271750 0.040000000 -0.038690611 0.078690611 +9.824046921 0.040000000 -0.039570750 0.079570750 +9.833822092 0.040000000 -0.040445362 0.080445362 +9.843597263 0.040000000 -0.041314377 0.081314377 +9.853372434 0.040000000 -0.042177723 0.082177723 +9.863147605 0.040000000 -0.043035332 0.083035332 +9.872922776 0.040000000 -0.043887135 0.083887135 +9.882697947 0.040000000 -0.044733063 0.084733063 +9.892473118 0.040000000 -0.045573049 0.085573049 +9.902248289 0.040000000 -0.046407026 0.086407026 +9.912023460 0.040000000 -0.047234929 0.087234929 +9.921798631 0.040000000 -0.048056691 0.088056691 +9.931573803 0.040000000 -0.048872248 0.088872248 +9.941348974 0.040000000 -0.049681535 0.089681535 +9.951124145 0.040000000 -0.050484491 0.090484491 +9.960899316 0.040000000 -0.051281051 0.091281051 +9.970674487 0.040000000 -0.052071154 0.092071154 +9.980449658 0.040000000 -0.052854739 0.092854739 +9.990224829 0.040000000 -0.053631744 0.093631744 +10.000000000 0.040000000 -0.054402111 0.094402111 diff --git a/examples/takagi-sugeno/approximation.fll b/examples/takagi-sugeno/approximation.fll new file mode 100644 index 0000000..4461299 --- /dev/null +++ b/examples/takagi-sugeno/approximation.fll @@ -0,0 +1,65 @@ +Engine: approximation +InputVariable: inputX + enabled: true + range: 0.000 10.000 + lock-range: false + term: NEAR_1 Triangle 0.000 1.000 2.000 + term: NEAR_2 Triangle 1.000 2.000 3.000 + term: NEAR_3 Triangle 2.000 3.000 4.000 + term: NEAR_4 Triangle 3.000 4.000 5.000 + term: NEAR_5 Triangle 4.000 5.000 6.000 + term: NEAR_6 Triangle 5.000 6.000 7.000 + term: NEAR_7 Triangle 6.000 7.000 8.000 + term: NEAR_8 Triangle 7.000 8.000 9.000 + term: NEAR_9 Triangle 8.000 9.000 10.000 +OutputVariable: outputFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: true + term: f1 Constant 0.840 + term: f2 Constant 0.450 + term: f3 Constant 0.040 + term: f4 Constant -0.180 + term: f5 Constant -0.190 + term: f6 Constant -0.040 + term: f7 Constant 0.090 + term: f8 Constant 0.120 + term: f9 Constant 0.040 +OutputVariable: trueFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: true + term: fx Function sin(inputX)/inputX +OutputVariable: diffFx + enabled: true + range: -1.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: diff Function fabs(outputFx-trueFx) +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if inputX is NEAR_1 then outputFx is f1 + rule: if inputX is NEAR_2 then outputFx is f2 + rule: if inputX is NEAR_3 then outputFx is f3 + rule: if inputX is NEAR_4 then outputFx is f4 + rule: if inputX is NEAR_5 then outputFx is f5 + rule: if inputX is NEAR_6 then outputFx is f6 + rule: if inputX is NEAR_7 then outputFx is f7 + rule: if inputX is NEAR_8 then outputFx is f8 + rule: if inputX is NEAR_9 then outputFx is f9 + rule: if inputX is any then trueFx is fx and diffFx is diff
\ No newline at end of file diff --git a/examples/takagi-sugeno/approximation.java b/examples/takagi-sugeno/approximation.java new file mode 100644 index 0000000..c2f9d00 --- /dev/null +++ b/examples/takagi-sugeno/approximation.java @@ -0,0 +1,108 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class approximation{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("approximation"); +engine.setDescription(""); + +InputVariable inputX = new InputVariable(); +inputX.setName("inputX"); +inputX.setDescription(""); +inputX.setEnabled(true); +inputX.setRange(0.000, 10.000); +inputX.setLockValueInRange(false); +inputX.addTerm(new Triangle("NEAR_1", 0.000, 1.000, 2.000)); +inputX.addTerm(new Triangle("NEAR_2", 1.000, 2.000, 3.000)); +inputX.addTerm(new Triangle("NEAR_3", 2.000, 3.000, 4.000)); +inputX.addTerm(new Triangle("NEAR_4", 3.000, 4.000, 5.000)); +inputX.addTerm(new Triangle("NEAR_5", 4.000, 5.000, 6.000)); +inputX.addTerm(new Triangle("NEAR_6", 5.000, 6.000, 7.000)); +inputX.addTerm(new Triangle("NEAR_7", 6.000, 7.000, 8.000)); +inputX.addTerm(new Triangle("NEAR_8", 7.000, 8.000, 9.000)); +inputX.addTerm(new Triangle("NEAR_9", 8.000, 9.000, 10.000)); +engine.addInputVariable(inputX); + +OutputVariable outputFx = new OutputVariable(); +outputFx.setName("outputFx"); +outputFx.setDescription(""); +outputFx.setEnabled(true); +outputFx.setRange(-1.000, 1.000); +outputFx.setLockValueInRange(false); +outputFx.setAggregation(null); +outputFx.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +outputFx.setDefaultValue(Double.NaN); +outputFx.setLockPreviousValue(true); +outputFx.addTerm(new Constant("f1", 0.840)); +outputFx.addTerm(new Constant("f2", 0.450)); +outputFx.addTerm(new Constant("f3", 0.040)); +outputFx.addTerm(new Constant("f4", -0.180)); +outputFx.addTerm(new Constant("f5", -0.190)); +outputFx.addTerm(new Constant("f6", -0.040)); +outputFx.addTerm(new Constant("f7", 0.090)); +outputFx.addTerm(new Constant("f8", 0.120)); +outputFx.addTerm(new Constant("f9", 0.040)); +engine.addOutputVariable(outputFx); + +OutputVariable trueFx = new OutputVariable(); +trueFx.setName("trueFx"); +trueFx.setDescription(""); +trueFx.setEnabled(true); +trueFx.setRange(-1.000, 1.000); +trueFx.setLockValueInRange(false); +trueFx.setAggregation(null); +trueFx.setDefuzzifier(new WeightedAverage("Automatic")); +trueFx.setDefaultValue(Double.NaN); +trueFx.setLockPreviousValue(true); +trueFx.addTerm(Function.create("fx", "sin(inputX)/inputX", engine)); +engine.addOutputVariable(trueFx); + +OutputVariable diffFx = new OutputVariable(); +diffFx.setName("diffFx"); +diffFx.setDescription(""); +diffFx.setEnabled(true); +diffFx.setRange(-1.000, 1.000); +diffFx.setLockValueInRange(false); +diffFx.setAggregation(null); +diffFx.setDefuzzifier(new WeightedAverage("Automatic")); +diffFx.setDefaultValue(Double.NaN); +diffFx.setLockPreviousValue(false); +diffFx.addTerm(Function.create("diff", "fabs(outputFx-trueFx)", engine)); +engine.addOutputVariable(diffFx); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_1 then outputFx is f1", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_2 then outputFx is f2", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_3 then outputFx is f3", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_4 then outputFx is f4", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_5 then outputFx is f5", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_6 then outputFx is f6", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_7 then outputFx is f7", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_8 then outputFx is f8", engine)); +ruleBlock.addRule(Rule.parse("if inputX is NEAR_9 then outputFx is f9", engine)); +ruleBlock.addRule(Rule.parse("if inputX is any then trueFx is fx and diffFx is diff", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/takagi-sugeno/approximation.pdf b/examples/takagi-sugeno/approximation.pdf Binary files differnew file mode 100644 index 0000000..6af8fef --- /dev/null +++ b/examples/takagi-sugeno/approximation.pdf diff --git a/examples/takagi-sugeno/octave/COPYING b/examples/takagi-sugeno/octave/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/examples/takagi-sugeno/octave/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/examples/takagi-sugeno/octave/DESCRIPTION b/examples/takagi-sugeno/octave/DESCRIPTION new file mode 100644 index 0000000..35df57d --- /dev/null +++ b/examples/takagi-sugeno/octave/DESCRIPTION @@ -0,0 +1,12 @@ +Name: fuzzy-logic-toolkit +Version: 0.4.2 +Date: 2012-10-02 +Author: L. Markowsky <lmarkov@users.sourceforge.net> +Maintainer: L. Markowsky <lmarkov@users.sourceforge.net> +Title: Octave Fuzzy Logic Toolkit +Description: A mostly MATLAB-compatible fuzzy logic toolkit for Octave. +Depends: octave (>= 3.2.4) +Autoload: no +License: GPLv3+ +Url: http://octave.sf.net + http://sf.net/projects/octave-fuzzy diff --git a/examples/takagi-sugeno/octave/cubic_approximator.R b/examples/takagi-sugeno/octave/cubic_approximator.R new file mode 100644 index 0000000..d3d3fbf --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.R @@ -0,0 +1,84 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "cubic_approximator" +engine.fll = "Engine: cubic_approximator +InputVariable: X + enabled: true + range: -5.000 5.000 + lock-range: false + term: AboutNegFive Triangle -6.000 -5.000 -4.000 + term: AboutNegFour Triangle -5.000 -4.000 -3.000 + term: AboutNegThree Triangle -4.000 -3.000 -2.000 + term: AboutNegTwo Triangle -3.000 -2.000 -1.000 + term: AboutNegOne Triangle -2.000 -1.000 0.000 + term: AboutZero Triangle -1.000 0.000 1.000 + term: AboutOne Triangle 0.000 1.000 2.000 + term: AboutTwo Triangle 1.000 2.000 3.000 + term: AboutThree Triangle 2.000 3.000 4.000 + term: AboutFour Triangle 3.000 4.000 5.000 + term: AboutFive Triangle 4.000 5.000 6.000 +OutputVariable: ApproxXCubed + enabled: true + range: -5.000 5.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: TangentatNegFive Linear 75.000 250.000 + term: TangentatNegFour Linear 48.000 128.000 + term: TangentatNegThree Linear 27.000 54.000 + term: TangentatNegTwo Linear 12.000 16.000 + term: TangentatNegOne Linear 3.000 2.000 + term: TangentatZero Linear 0.000 0.000 + term: TangentatOne Linear 3.000 -2.000 + term: TangentatTwo Linear 12.000 -16.000 + term: TangentatThree Linear 27.000 -54.000 + term: TangentatFour Linear 48.000 -128.000 + term: TangentatFive Linear 75.000 -250.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is AboutNegFive then ApproxXCubed is TangentatNegFive + rule: if X is AboutNegFour then ApproxXCubed is TangentatNegFour + rule: if X is AboutNegThree then ApproxXCubed is TangentatNegThree + rule: if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo + rule: if X is AboutNegOne then ApproxXCubed is TangentatNegOne + rule: if X is AboutZero then ApproxXCubed is TangentatZero + rule: if X is AboutOne then ApproxXCubed is TangentatOne + rule: if X is AboutTwo then ApproxXCubed is TangentatTwo + rule: if X is AboutThree then ApproxXCubed is TangentatThree + rule: if X is AboutFour then ApproxXCubed is TangentatFour + rule: if X is AboutFive then ApproxXCubed is TangentatFive" + +engine.fldFile = "cubic_approximator.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(X, ApproxXCubed)) + + geom_line(aes(color=ApproxXCubed), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("X vs ApproxXCubed") + +engine.plot.o1_i1 = ggplot(engine.df, aes(X, ApproxXCubed)) + + geom_line(aes(color=ApproxXCubed), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("ApproxXCubed vs X") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/octave/cubic_approximator.cpp b/examples/takagi-sugeno/octave/cubic_approximator.cpp new file mode 100644 index 0000000..2b9df3f --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.cpp @@ -0,0 +1,76 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("cubic_approximator"); +engine->setDescription(""); + +InputVariable* X = new InputVariable; +X->setName("X"); +X->setDescription(""); +X->setEnabled(true); +X->setRange(-5.000, 5.000); +X->setLockValueInRange(false); +X->addTerm(new Triangle("AboutNegFive", -6.000, -5.000, -4.000)); +X->addTerm(new Triangle("AboutNegFour", -5.000, -4.000, -3.000)); +X->addTerm(new Triangle("AboutNegThree", -4.000, -3.000, -2.000)); +X->addTerm(new Triangle("AboutNegTwo", -3.000, -2.000, -1.000)); +X->addTerm(new Triangle("AboutNegOne", -2.000, -1.000, 0.000)); +X->addTerm(new Triangle("AboutZero", -1.000, 0.000, 1.000)); +X->addTerm(new Triangle("AboutOne", 0.000, 1.000, 2.000)); +X->addTerm(new Triangle("AboutTwo", 1.000, 2.000, 3.000)); +X->addTerm(new Triangle("AboutThree", 2.000, 3.000, 4.000)); +X->addTerm(new Triangle("AboutFour", 3.000, 4.000, 5.000)); +X->addTerm(new Triangle("AboutFive", 4.000, 5.000, 6.000)); +engine->addInputVariable(X); + +OutputVariable* ApproxXCubed = new OutputVariable; +ApproxXCubed->setName("ApproxXCubed"); +ApproxXCubed->setDescription(""); +ApproxXCubed->setEnabled(true); +ApproxXCubed->setRange(-5.000, 5.000); +ApproxXCubed->setLockValueInRange(false); +ApproxXCubed->setAggregation(fl::null); +ApproxXCubed->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +ApproxXCubed->setDefaultValue(fl::nan); +ApproxXCubed->setLockPreviousValue(false); +ApproxXCubed->addTerm(Linear::create("TangentatNegFive", engine, 75.000, 250.000)); +ApproxXCubed->addTerm(Linear::create("TangentatNegFour", engine, 48.000, 128.000)); +ApproxXCubed->addTerm(Linear::create("TangentatNegThree", engine, 27.000, 54.000)); +ApproxXCubed->addTerm(Linear::create("TangentatNegTwo", engine, 12.000, 16.000)); +ApproxXCubed->addTerm(Linear::create("TangentatNegOne", engine, 3.000, 2.000)); +ApproxXCubed->addTerm(Linear::create("TangentatZero", engine, 0.000, 0.000)); +ApproxXCubed->addTerm(Linear::create("TangentatOne", engine, 3.000, -2.000)); +ApproxXCubed->addTerm(Linear::create("TangentatTwo", engine, 12.000, -16.000)); +ApproxXCubed->addTerm(Linear::create("TangentatThree", engine, 27.000, -54.000)); +ApproxXCubed->addTerm(Linear::create("TangentatFour", engine, 48.000, -128.000)); +ApproxXCubed->addTerm(Linear::create("TangentatFive", engine, 75.000, -250.000)); +engine->addOutputVariable(ApproxXCubed); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if X is AboutNegFive then ApproxXCubed is TangentatNegFive", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutNegFour then ApproxXCubed is TangentatNegFour", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutNegThree then ApproxXCubed is TangentatNegThree", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutNegOne then ApproxXCubed is TangentatNegOne", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutZero then ApproxXCubed is TangentatZero", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutOne then ApproxXCubed is TangentatOne", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutTwo then ApproxXCubed is TangentatTwo", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutThree then ApproxXCubed is TangentatThree", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutFour then ApproxXCubed is TangentatFour", engine)); +ruleBlock->addRule(Rule::parse("if X is AboutFive then ApproxXCubed is TangentatFive", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/takagi-sugeno/octave/cubic_approximator.fcl b/examples/takagi-sugeno/octave/cubic_approximator.fcl new file mode 100644 index 0000000..df4e8be --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.fcl @@ -0,0 +1,59 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK cubic_approximator + +VAR_INPUT + X: REAL; +END_VAR + +VAR_OUTPUT + ApproxXCubed: REAL; +END_VAR + +FUZZIFY X + RANGE := (-5.000 .. 5.000); + TERM AboutNegFive := Triangle -6.000 -5.000 -4.000; + TERM AboutNegFour := Triangle -5.000 -4.000 -3.000; + TERM AboutNegThree := Triangle -4.000 -3.000 -2.000; + TERM AboutNegTwo := Triangle -3.000 -2.000 -1.000; + TERM AboutNegOne := Triangle -2.000 -1.000 0.000; + TERM AboutZero := Triangle -1.000 0.000 1.000; + TERM AboutOne := Triangle 0.000 1.000 2.000; + TERM AboutTwo := Triangle 1.000 2.000 3.000; + TERM AboutThree := Triangle 2.000 3.000 4.000; + TERM AboutFour := Triangle 3.000 4.000 5.000; + TERM AboutFive := Triangle 4.000 5.000 6.000; +END_FUZZIFY + +DEFUZZIFY ApproxXCubed + RANGE := (-5.000 .. 5.000); + TERM TangentatNegFive := Linear 75.000 250.000; + TERM TangentatNegFour := Linear 48.000 128.000; + TERM TangentatNegThree := Linear 27.000 54.000; + TERM TangentatNegTwo := Linear 12.000 16.000; + TERM TangentatNegOne := Linear 3.000 2.000; + TERM TangentatZero := Linear 0.000 0.000; + TERM TangentatOne := Linear 3.000 -2.000; + TERM TangentatTwo := Linear 12.000 -16.000; + TERM TangentatThree := Linear 27.000 -54.000; + TERM TangentatFour := Linear 48.000 -128.000; + TERM TangentatFive := Linear 75.000 -250.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + RULE 1 : if X is AboutNegFive then ApproxXCubed is TangentatNegFive + RULE 2 : if X is AboutNegFour then ApproxXCubed is TangentatNegFour + RULE 3 : if X is AboutNegThree then ApproxXCubed is TangentatNegThree + RULE 4 : if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo + RULE 5 : if X is AboutNegOne then ApproxXCubed is TangentatNegOne + RULE 6 : if X is AboutZero then ApproxXCubed is TangentatZero + RULE 7 : if X is AboutOne then ApproxXCubed is TangentatOne + RULE 8 : if X is AboutTwo then ApproxXCubed is TangentatTwo + RULE 9 : if X is AboutThree then ApproxXCubed is TangentatThree + RULE 10 : if X is AboutFour then ApproxXCubed is TangentatFour + RULE 11 : if X is AboutFive then ApproxXCubed is TangentatFive +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/octave/cubic_approximator.fis b/examples/takagi-sugeno/octave/cubic_approximator.fis new file mode 100644 index 0000000..e0af36f --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.fis @@ -0,0 +1,59 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='cubic_approximator' +Type='sugeno' +Version=6.0 +NumInputs=1 +NumOutputs=1 +NumRules=11 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='X' +Range=[-5.000 5.000] +NumMFs=11 +MF1='AboutNegFive':'trimf',[-6.000 -5.000 -4.000] +MF2='AboutNegFour':'trimf',[-5.000 -4.000 -3.000] +MF3='AboutNegThree':'trimf',[-4.000 -3.000 -2.000] +MF4='AboutNegTwo':'trimf',[-3.000 -2.000 -1.000] +MF5='AboutNegOne':'trimf',[-2.000 -1.000 0.000] +MF6='AboutZero':'trimf',[-1.000 0.000 1.000] +MF7='AboutOne':'trimf',[0.000 1.000 2.000] +MF8='AboutTwo':'trimf',[1.000 2.000 3.000] +MF9='AboutThree':'trimf',[2.000 3.000 4.000] +MF10='AboutFour':'trimf',[3.000 4.000 5.000] +MF11='AboutFive':'trimf',[4.000 5.000 6.000] + +[Output1] +Name='ApproxXCubed' +Range=[-5.000 5.000] +NumMFs=11 +MF1='TangentatNegFive':'linear',[75.000 250.000] +MF2='TangentatNegFour':'linear',[48.000 128.000] +MF3='TangentatNegThree':'linear',[27.000 54.000] +MF4='TangentatNegTwo':'linear',[12.000 16.000] +MF5='TangentatNegOne':'linear',[3.000 2.000] +MF6='TangentatZero':'linear',[0.000 0.000] +MF7='TangentatOne':'linear',[3.000 -2.000] +MF8='TangentatTwo':'linear',[12.000 -16.000] +MF9='TangentatThree':'linear',[27.000 -54.000] +MF10='TangentatFour':'linear',[48.000 -128.000] +MF11='TangentatFive':'linear',[75.000 -250.000] + +[Rules] +1.000 , 1.000 (1.000) : 1 +2.000 , 2.000 (1.000) : 1 +3.000 , 3.000 (1.000) : 1 +4.000 , 4.000 (1.000) : 1 +5.000 , 5.000 (1.000) : 1 +6.000 , 6.000 (1.000) : 1 +7.000 , 7.000 (1.000) : 1 +8.000 , 8.000 (1.000) : 1 +9.000 , 9.000 (1.000) : 1 +10.000 , 10.000 (1.000) : 1 +11.000 , 11.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/octave/cubic_approximator.fld b/examples/takagi-sugeno/octave/cubic_approximator.fld new file mode 100644 index 0000000..4f6ddeb --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.fld @@ -0,0 +1,1025 @@ +X ApproxXCubed +-5.000000000 -125.000000000 +-4.990224829 -124.142364903 +-4.980449658 -123.289889721 +-4.970674487 -122.442574453 +-4.960899316 -121.600419100 +-4.951124145 -120.763423661 +-4.941348974 -119.931588136 +-4.931573803 -119.104912525 +-4.921798631 -118.283396829 +-4.912023460 -117.467041047 +-4.902248289 -116.655845180 +-4.892473118 -115.849809227 +-4.882697947 -115.048933188 +-4.872922776 -114.253217063 +-4.863147605 -113.462660853 +-4.853372434 -112.677264557 +-4.843597263 -111.897028176 +-4.833822092 -111.121951709 +-4.824046921 -110.352035156 +-4.814271750 -109.587278518 +-4.804496579 -108.827681794 +-4.794721408 -108.073244984 +-4.784946237 -107.323968089 +-4.775171065 -106.579851108 +-4.765395894 -105.840894041 +-4.755620723 -105.107096889 +-4.745845552 -104.378459651 +-4.736070381 -103.654982327 +-4.726295210 -102.936664918 +-4.716520039 -102.223507423 +-4.706744868 -101.515509843 +-4.696969697 -100.812672176 +-4.687194526 -100.114994424 +-4.677419355 -99.422476587 +-4.667644184 -98.735118664 +-4.657869013 -98.052920655 +-4.648093842 -97.375882560 +-4.638318671 -96.704004380 +-4.628543500 -96.037286114 +-4.618768328 -95.375727763 +-4.608993157 -94.719329326 +-4.599217986 -94.068090803 +-4.589442815 -93.422012195 +-4.579667644 -92.781093501 +-4.569892473 -92.145334721 +-4.560117302 -91.514735855 +-4.550342131 -90.889296904 +-4.540566960 -90.269017868 +-4.530791789 -89.653898745 +-4.521016618 -89.043939537 +-4.511241447 -88.439140244 +-4.501466276 -87.839500864 +-4.491691105 -87.245021399 +-4.481915934 -86.655701849 +-4.472140762 -86.071542212 +-4.462365591 -85.492542490 +-4.452590420 -84.918702683 +-4.442815249 -84.350022790 +-4.433040078 -83.786502811 +-4.423264907 -83.228142746 +-4.413489736 -82.674942596 +-4.403714565 -82.126902360 +-4.393939394 -81.584022039 +-4.384164223 -81.046301631 +-4.374389052 -80.513741139 +-4.364613881 -79.986340560 +-4.354838710 -79.464099896 +-4.345063539 -78.947019146 +-4.335288368 -78.435098311 +-4.325513196 -77.928337390 +-4.315738025 -77.426736383 +-4.305962854 -76.930295290 +-4.296187683 -76.439014112 +-4.286412512 -75.952892849 +-4.276637341 -75.471931499 +-4.266862170 -74.996130064 +-4.257086999 -74.525488544 +-4.247311828 -74.060006937 +-4.237536657 -73.599685245 +-4.227761486 -73.144523468 +-4.217986315 -72.694521604 +-4.208211144 -72.249679655 +-4.198435973 -71.809997621 +-4.188660802 -71.375475500 +-4.178885630 -70.946113295 +-4.169110459 -70.521911003 +-4.159335288 -70.102868626 +-4.149560117 -69.688986163 +-4.139784946 -69.280263614 +-4.130009775 -68.876700980 +-4.120234604 -68.478298260 +-4.110459433 -68.085055455 +-4.100684262 -67.696972564 +-4.090909091 -67.314049587 +-4.081133920 -66.936286524 +-4.071358749 -66.563683376 +-4.061583578 -66.196240142 +-4.051808407 -65.833956823 +-4.042033236 -65.476833418 +-4.032258065 -65.124869927 +-4.022482893 -64.778066351 +-4.012707722 -64.436422689 +-4.002932551 -64.099938941 +-3.993157380 -63.604111305 +-3.983382209 -63.041967303 +-3.973607038 -62.483836568 +-3.963831867 -61.929719100 +-3.954056696 -61.379614898 +-3.944281525 -60.833523964 +-3.934506354 -60.291446295 +-3.924731183 -59.753381894 +-3.914956012 -59.219330759 +-3.905180841 -58.689292891 +-3.895405670 -58.163268290 +-3.885630499 -57.641256955 +-3.875855327 -57.123258887 +-3.866080156 -56.609274086 +-3.856304985 -56.099302552 +-3.846529814 -55.593344284 +-3.836754643 -55.091399283 +-3.826979472 -54.593467548 +-3.817204301 -54.099549081 +-3.807429130 -53.609643880 +-3.797653959 -53.123751946 +-3.787878788 -52.641873278 +-3.778103617 -52.164007877 +-3.768328446 -51.690155743 +-3.758553275 -51.220316876 +-3.748778104 -50.754491275 +-3.739002933 -50.292678942 +-3.729227761 -49.834879874 +-3.719452590 -49.381094074 +-3.709677419 -48.931321540 +-3.699902248 -48.485562273 +-3.690127077 -48.043816273 +-3.680351906 -47.606083539 +-3.670576735 -47.172364072 +-3.660801564 -46.742657872 +-3.651026393 -46.316964938 +-3.641251222 -45.895285272 +-3.631476051 -45.477618872 +-3.621700880 -45.063965738 +-3.611925709 -44.654325872 +-3.602150538 -44.248699272 +-3.592375367 -43.847085938 +-3.582600196 -43.449485872 +-3.572825024 -43.055899072 +-3.563049853 -42.666325539 +-3.553274682 -42.280765273 +-3.543499511 -41.899218273 +-3.533724340 -41.521684540 +-3.523949169 -41.148164074 +-3.514173998 -40.778656874 +-3.504398827 -40.413162941 +-3.494623656 -40.051682275 +-3.484848485 -39.694214876 +-3.475073314 -39.340760743 +-3.465298143 -38.991319877 +-3.455522972 -38.645892278 +-3.445747801 -38.304477946 +-3.435972630 -37.967076880 +-3.426197458 -37.633689081 +-3.416422287 -37.304314548 +-3.406647116 -36.978953283 +-3.396871945 -36.657605284 +-3.387096774 -36.340270552 +-3.377321603 -36.026949086 +-3.367546432 -35.717640887 +-3.357771261 -35.412345955 +-3.347996090 -35.111064290 +-3.338220919 -34.813795891 +-3.328445748 -34.520540759 +-3.318670577 -34.231298894 +-3.308895406 -33.946070295 +-3.299120235 -33.664854963 +-3.289345064 -33.387652898 +-3.279569892 -33.114464100 +-3.269794721 -32.845288568 +-3.260019550 -32.580126303 +-3.250244379 -32.318977305 +-3.240469208 -32.061841573 +-3.230694037 -31.808719109 +-3.220918866 -31.559609910 +-3.211143695 -31.314513979 +-3.201368524 -31.073431314 +-3.191593353 -30.836361916 +-3.181818182 -30.603305785 +-3.172043011 -30.374262921 +-3.162267840 -30.149233323 +-3.152492669 -29.928216992 +-3.142717498 -29.711213927 +-3.132942326 -29.498224129 +-3.123167155 -29.289247598 +-3.113391984 -29.084284334 +-3.103616813 -28.883334337 +-3.093841642 -28.686397606 +-3.084066471 -28.493474142 +-3.074291300 -28.304563944 +-3.064516129 -28.119667014 +-3.054740958 -27.938783350 +-3.044965787 -27.761912952 +-3.035190616 -27.589055822 +-3.025415445 -27.420211958 +-3.015640274 -27.255381361 +-3.005865103 -27.094564030 +-2.996089932 -26.867287003 +-2.986314761 -26.537511144 +-2.976539589 -26.210601904 +-2.966764418 -25.886559283 +-2.956989247 -25.565383281 +-2.947214076 -25.247073899 +-2.937438905 -24.931631135 +-2.927663734 -24.619054990 +-2.917888563 -24.309345465 +-2.908113392 -24.002502558 +-2.898338221 -23.698526271 +-2.888563050 -23.397416603 +-2.878787879 -23.099173554 +-2.869012708 -22.803797124 +-2.859237537 -22.511287313 +-2.849462366 -22.221644121 +-2.839687195 -21.934867548 +-2.829912023 -21.650957594 +-2.820136852 -21.369914259 +-2.810361681 -21.091737544 +-2.800586510 -20.816427447 +-2.790811339 -20.543983970 +-2.781036168 -20.274407112 +-2.771260997 -20.007696872 +-2.761485826 -19.743853252 +-2.751710655 -19.482876251 +-2.741935484 -19.224765869 +-2.732160313 -18.969522106 +-2.722385142 -18.717144962 +-2.712609971 -18.467634437 +-2.702834800 -18.220990532 +-2.693059629 -17.977213245 +-2.683284457 -17.736302577 +-2.673509286 -17.498258529 +-2.663734115 -17.263081100 +-2.653958944 -17.030770289 +-2.644183773 -16.801326098 +-2.634408602 -16.574748526 +-2.624633431 -16.351037573 +-2.614858260 -16.130193239 +-2.605083089 -15.912215524 +-2.595307918 -15.697104428 +-2.585532747 -15.484859951 +-2.575757576 -15.275482094 +-2.565982405 -15.068970855 +-2.556207234 -14.865326236 +-2.546432063 -14.664548235 +-2.536656891 -14.466636854 +-2.526881720 -14.271592092 +-2.517106549 -14.079413948 +-2.507331378 -13.890102424 +-2.497556207 -13.703657519 +-2.487781036 -13.520079233 +-2.478005865 -13.339367566 +-2.468230694 -13.161522519 +-2.458455523 -12.986544090 +-2.448680352 -12.814432280 +-2.438905181 -12.645187090 +-2.429130010 -12.478808518 +-2.419354839 -12.315296566 +-2.409579668 -12.154651233 +-2.399804497 -11.996872519 +-2.390029326 -11.841960423 +-2.380254154 -11.689914947 +-2.370478983 -11.540736090 +-2.360703812 -11.394423853 +-2.350928641 -11.250978234 +-2.341153470 -11.110399234 +-2.331378299 -10.972686853 +-2.321603128 -10.837841092 +-2.311827957 -10.705861949 +-2.302052786 -10.576749426 +-2.292277615 -10.450503522 +-2.282502444 -10.327124236 +-2.272727273 -10.206611570 +-2.262952102 -10.088965523 +-2.253176931 -9.974186095 +-2.243401760 -9.862273286 +-2.233626588 -9.753227096 +-2.223851417 -9.647047526 +-2.214076246 -9.543734574 +-2.204301075 -9.443288241 +-2.194525904 -9.345708528 +-2.184750733 -9.250995433 +-2.174975562 -9.159148958 +-2.165200391 -9.070169102 +-2.155425220 -8.984055865 +-2.145650049 -8.900809247 +-2.135874878 -8.820429248 +-2.126099707 -8.742915868 +-2.116324536 -8.668269107 +-2.106549365 -8.596488965 +-2.096774194 -8.527575442 +-2.086999022 -8.461528539 +-2.077223851 -8.398348254 +-2.067448680 -8.338034589 +-2.057673509 -8.280587542 +-2.047898338 -8.226007115 +-2.038123167 -8.174293307 +-2.028347996 -8.125446118 +-2.018572825 -8.079465548 +-2.008797654 -8.036351597 +-1.999022483 -7.984368326 +-1.989247312 -7.828997572 +-1.979472141 -7.675346789 +-1.969696970 -7.523415978 +-1.959921799 -7.373205138 +-1.950146628 -7.224714270 +-1.940371457 -7.077943373 +-1.930596285 -6.932892447 +-1.920821114 -6.789561493 +-1.911045943 -6.647950511 +-1.901270772 -6.508059500 +-1.891495601 -6.369888460 +-1.881720430 -6.233437392 +-1.871945259 -6.098706295 +-1.862170088 -5.965695169 +-1.852394917 -5.834404016 +-1.842619746 -5.704832833 +-1.832844575 -5.576981622 +-1.823069404 -5.450850383 +-1.813294233 -5.326439114 +-1.803519062 -5.203747818 +-1.793743891 -5.082776493 +-1.783968719 -4.963525139 +-1.774193548 -4.845993757 +-1.764418377 -4.730182346 +-1.754643206 -4.616090906 +-1.744868035 -4.503719438 +-1.735092864 -4.393067942 +-1.725317693 -4.284136417 +-1.715542522 -4.176924863 +-1.705767351 -4.071433281 +-1.695992180 -3.967661670 +-1.686217009 -3.865610031 +-1.676441838 -3.765278363 +-1.666666667 -3.666666667 +-1.656891496 -3.569774942 +-1.647116325 -3.474603188 +-1.637341153 -3.381151406 +-1.627565982 -3.289419596 +-1.617790811 -3.199407756 +-1.608015640 -3.111115889 +-1.598240469 -3.024543993 +-1.588465298 -2.939692068 +-1.578690127 -2.856560114 +-1.568914956 -2.775148133 +-1.559139785 -2.695456122 +-1.549364614 -2.617484083 +-1.539589443 -2.541232016 +-1.529814272 -2.466699919 +-1.520039101 -2.393887795 +-1.510263930 -2.322795642 +-1.500488759 -2.253423460 +-1.490713587 -2.185771250 +-1.480938416 -2.119839011 +-1.471163245 -2.055626743 +-1.461388074 -1.993134447 +-1.451612903 -1.932362123 +-1.441837732 -1.873309770 +-1.432062561 -1.815977388 +-1.422287390 -1.760364978 +-1.412512219 -1.706472539 +-1.402737048 -1.654300072 +-1.392961877 -1.603847576 +-1.383186706 -1.555115052 +-1.373411535 -1.508102499 +-1.363636364 -1.462809917 +-1.353861193 -1.419237307 +-1.344086022 -1.377384669 +-1.334310850 -1.337252002 +-1.324535679 -1.298839306 +-1.314760508 -1.262146582 +-1.304985337 -1.227173829 +-1.295210166 -1.193921048 +-1.285434995 -1.162388238 +-1.275659824 -1.132575399 +-1.265884653 -1.104482532 +-1.256109482 -1.078109637 +-1.246334311 -1.053456713 +-1.236559140 -1.030523760 +-1.226783969 -1.009310779 +-1.217008798 -0.989817769 +-1.207233627 -0.972044731 +-1.197458456 -0.955991664 +-1.187683284 -0.941658568 +-1.177908113 -0.929045445 +-1.168132942 -0.918152292 +-1.158357771 -0.908979111 +-1.148582600 -0.901525901 +-1.138807429 -0.895792663 +-1.129032258 -0.891779396 +-1.119257087 -0.889486101 +-1.109481916 -0.888912777 +-1.099706745 -0.890059425 +-1.089931574 -0.892926044 +-1.080156403 -0.897512635 +-1.070381232 -0.903819197 +-1.060606061 -0.911845730 +-1.050830890 -0.921592235 +-1.041055718 -0.933058711 +-1.031280547 -0.946245159 +-1.021505376 -0.961151578 +-1.011730205 -0.977777969 +-1.001955034 -0.996124331 +-0.992179863 -0.968902916 +-0.982404692 -0.930547553 +-0.972629521 -0.892765513 +-0.962854350 -0.855556798 +-0.953079179 -0.818921406 +-0.943304008 -0.782859338 +-0.933528837 -0.747370594 +-0.923753666 -0.712455173 +-0.913978495 -0.678113077 +-0.904203324 -0.644344304 +-0.894428152 -0.611148855 +-0.884652981 -0.578526730 +-0.874877810 -0.546477928 +-0.865102639 -0.515002451 +-0.855327468 -0.484100297 +-0.845552297 -0.453771467 +-0.835777126 -0.424015961 +-0.826001955 -0.394833779 +-0.816226784 -0.366224921 +-0.806451613 -0.338189386 +-0.796676442 -0.310727175 +-0.786901271 -0.283838288 +-0.777126100 -0.257522725 +-0.767350929 -0.231780486 +-0.757575758 -0.206611570 +-0.747800587 -0.182015979 +-0.738025415 -0.157993711 +-0.728250244 -0.134544767 +-0.718475073 -0.111669146 +-0.708699902 -0.089366850 +-0.698924731 -0.067637877 +-0.689149560 -0.046482228 +-0.679374389 -0.025899903 +-0.669599218 -0.005890902 +-0.659824047 0.013544775 +-0.650048876 0.032407129 +-0.640273705 0.050696158 +-0.630498534 0.068411864 +-0.620723363 0.085554246 +-0.610948192 0.102123305 +-0.601173021 0.118119039 +-0.591397849 0.133541450 +-0.581622678 0.148390537 +-0.571847507 0.162666300 +-0.562072336 0.176368739 +-0.552297165 0.189497854 +-0.542521994 0.202053646 +-0.532746823 0.214036114 +-0.522971652 0.225445258 +-0.513196481 0.236281078 +-0.503421310 0.246543574 +-0.493646139 0.256232747 +-0.483870968 0.265348595 +-0.474095797 0.273891120 +-0.464320626 0.281860321 +-0.454545455 0.289256198 +-0.444770283 0.296078752 +-0.434995112 0.302327981 +-0.425219941 0.308003887 +-0.415444770 0.313106469 +-0.405669599 0.317635727 +-0.395894428 0.321591662 +-0.386119257 0.324974272 +-0.376344086 0.327783559 +-0.366568915 0.330019522 +-0.356793744 0.331682161 +-0.347018573 0.332771476 +-0.337243402 0.333287467 +-0.327468231 0.333230135 +-0.317693060 0.332599479 +-0.307917889 0.331395499 +-0.298142717 0.329618195 +-0.288367546 0.327267567 +-0.278592375 0.324343616 +-0.268817204 0.320846341 +-0.259042033 0.316775742 +-0.249266862 0.312131819 +-0.239491691 0.306914572 +-0.229716520 0.301124001 +-0.219941349 0.294760107 +-0.210166178 0.287822889 +-0.200391007 0.280312347 +-0.190615836 0.272228481 +-0.180840665 0.263571291 +-0.171065494 0.254340778 +-0.161290323 0.244536941 +-0.151515152 0.234159780 +-0.141739980 0.223209295 +-0.131964809 0.211685486 +-0.122189638 0.199588353 +-0.112414467 0.186917897 +-0.102639296 0.173674117 +-0.092864125 0.159857013 +-0.083088954 0.145466585 +-0.073313783 0.130502834 +-0.063538612 0.114965758 +-0.053763441 0.098855359 +-0.043988270 0.082171636 +-0.034213099 0.064914589 +-0.024437928 0.047084218 +-0.014662757 0.028680524 +-0.004887586 0.009703506 +0.004887586 -0.009703506 +0.014662757 -0.028680524 +0.024437928 -0.047084218 +0.034213099 -0.064914589 +0.043988270 -0.082171636 +0.053763441 -0.098855359 +0.063538612 -0.114965758 +0.073313783 -0.130502834 +0.083088954 -0.145466585 +0.092864125 -0.159857013 +0.102639296 -0.173674117 +0.112414467 -0.186917897 +0.122189638 -0.199588353 +0.131964809 -0.211685486 +0.141739980 -0.223209295 +0.151515152 -0.234159780 +0.161290323 -0.244536941 +0.171065494 -0.254340778 +0.180840665 -0.263571291 +0.190615836 -0.272228481 +0.200391007 -0.280312347 +0.210166178 -0.287822889 +0.219941349 -0.294760107 +0.229716520 -0.301124001 +0.239491691 -0.306914572 +0.249266862 -0.312131819 +0.259042033 -0.316775742 +0.268817204 -0.320846341 +0.278592375 -0.324343616 +0.288367546 -0.327267567 +0.298142717 -0.329618195 +0.307917889 -0.331395499 +0.317693060 -0.332599479 +0.327468231 -0.333230135 +0.337243402 -0.333287467 +0.347018573 -0.332771476 +0.356793744 -0.331682161 +0.366568915 -0.330019522 +0.376344086 -0.327783559 +0.386119257 -0.324974272 +0.395894428 -0.321591662 +0.405669599 -0.317635727 +0.415444770 -0.313106469 +0.425219941 -0.308003887 +0.434995112 -0.302327981 +0.444770283 -0.296078752 +0.454545455 -0.289256198 +0.464320626 -0.281860321 +0.474095797 -0.273891120 +0.483870968 -0.265348595 +0.493646139 -0.256232747 +0.503421310 -0.246543574 +0.513196481 -0.236281078 +0.522971652 -0.225445258 +0.532746823 -0.214036114 +0.542521994 -0.202053646 +0.552297165 -0.189497854 +0.562072336 -0.176368739 +0.571847507 -0.162666300 +0.581622678 -0.148390537 +0.591397849 -0.133541450 +0.601173021 -0.118119039 +0.610948192 -0.102123305 +0.620723363 -0.085554246 +0.630498534 -0.068411864 +0.640273705 -0.050696158 +0.650048876 -0.032407129 +0.659824047 -0.013544775 +0.669599218 0.005890902 +0.679374389 0.025899903 +0.689149560 0.046482228 +0.698924731 0.067637877 +0.708699902 0.089366850 +0.718475073 0.111669146 +0.728250244 0.134544767 +0.738025415 0.157993711 +0.747800587 0.182015979 +0.757575758 0.206611570 +0.767350929 0.231780486 +0.777126100 0.257522725 +0.786901271 0.283838288 +0.796676442 0.310727175 +0.806451613 0.338189386 +0.816226784 0.366224921 +0.826001955 0.394833779 +0.835777126 0.424015961 +0.845552297 0.453771467 +0.855327468 0.484100297 +0.865102639 0.515002451 +0.874877810 0.546477928 +0.884652981 0.578526730 +0.894428152 0.611148855 +0.904203324 0.644344304 +0.913978495 0.678113077 +0.923753666 0.712455173 +0.933528837 0.747370594 +0.943304008 0.782859338 +0.953079179 0.818921406 +0.962854350 0.855556798 +0.972629521 0.892765513 +0.982404692 0.930547553 +0.992179863 0.968902916 +1.001955034 0.996124331 +1.011730205 0.977777969 +1.021505376 0.961151578 +1.031280547 0.946245159 +1.041055718 0.933058711 +1.050830890 0.921592235 +1.060606061 0.911845730 +1.070381232 0.903819197 +1.080156403 0.897512635 +1.089931574 0.892926044 +1.099706745 0.890059425 +1.109481916 0.888912777 +1.119257087 0.889486101 +1.129032258 0.891779396 +1.138807429 0.895792663 +1.148582600 0.901525901 +1.158357771 0.908979111 +1.168132942 0.918152292 +1.177908113 0.929045445 +1.187683284 0.941658568 +1.197458456 0.955991664 +1.207233627 0.972044731 +1.217008798 0.989817769 +1.226783969 1.009310779 +1.236559140 1.030523760 +1.246334311 1.053456713 +1.256109482 1.078109637 +1.265884653 1.104482532 +1.275659824 1.132575399 +1.285434995 1.162388238 +1.295210166 1.193921048 +1.304985337 1.227173829 +1.314760508 1.262146582 +1.324535679 1.298839306 +1.334310850 1.337252002 +1.344086022 1.377384669 +1.353861193 1.419237307 +1.363636364 1.462809917 +1.373411535 1.508102499 +1.383186706 1.555115052 +1.392961877 1.603847576 +1.402737048 1.654300072 +1.412512219 1.706472539 +1.422287390 1.760364978 +1.432062561 1.815977388 +1.441837732 1.873309770 +1.451612903 1.932362123 +1.461388074 1.993134447 +1.471163245 2.055626743 +1.480938416 2.119839011 +1.490713587 2.185771250 +1.500488759 2.253423460 +1.510263930 2.322795642 +1.520039101 2.393887795 +1.529814272 2.466699919 +1.539589443 2.541232016 +1.549364614 2.617484083 +1.559139785 2.695456122 +1.568914956 2.775148133 +1.578690127 2.856560114 +1.588465298 2.939692068 +1.598240469 3.024543993 +1.608015640 3.111115889 +1.617790811 3.199407756 +1.627565982 3.289419596 +1.637341153 3.381151406 +1.647116325 3.474603188 +1.656891496 3.569774942 +1.666666667 3.666666667 +1.676441838 3.765278363 +1.686217009 3.865610031 +1.695992180 3.967661670 +1.705767351 4.071433281 +1.715542522 4.176924863 +1.725317693 4.284136417 +1.735092864 4.393067942 +1.744868035 4.503719438 +1.754643206 4.616090906 +1.764418377 4.730182346 +1.774193548 4.845993757 +1.783968719 4.963525139 +1.793743891 5.082776493 +1.803519062 5.203747818 +1.813294233 5.326439114 +1.823069404 5.450850383 +1.832844575 5.576981622 +1.842619746 5.704832833 +1.852394917 5.834404016 +1.862170088 5.965695169 +1.871945259 6.098706295 +1.881720430 6.233437392 +1.891495601 6.369888460 +1.901270772 6.508059500 +1.911045943 6.647950511 +1.920821114 6.789561493 +1.930596285 6.932892447 +1.940371457 7.077943373 +1.950146628 7.224714270 +1.959921799 7.373205138 +1.969696970 7.523415978 +1.979472141 7.675346789 +1.989247312 7.828997572 +1.999022483 7.984368326 +2.008797654 8.036351597 +2.018572825 8.079465548 +2.028347996 8.125446118 +2.038123167 8.174293307 +2.047898338 8.226007115 +2.057673509 8.280587542 +2.067448680 8.338034589 +2.077223851 8.398348254 +2.086999022 8.461528539 +2.096774194 8.527575442 +2.106549365 8.596488965 +2.116324536 8.668269107 +2.126099707 8.742915868 +2.135874878 8.820429248 +2.145650049 8.900809247 +2.155425220 8.984055865 +2.165200391 9.070169102 +2.174975562 9.159148958 +2.184750733 9.250995433 +2.194525904 9.345708528 +2.204301075 9.443288241 +2.214076246 9.543734574 +2.223851417 9.647047526 +2.233626588 9.753227096 +2.243401760 9.862273286 +2.253176931 9.974186095 +2.262952102 10.088965523 +2.272727273 10.206611570 +2.282502444 10.327124236 +2.292277615 10.450503522 +2.302052786 10.576749426 +2.311827957 10.705861949 +2.321603128 10.837841092 +2.331378299 10.972686853 +2.341153470 11.110399234 +2.350928641 11.250978234 +2.360703812 11.394423853 +2.370478983 11.540736090 +2.380254154 11.689914947 +2.390029326 11.841960423 +2.399804497 11.996872519 +2.409579668 12.154651233 +2.419354839 12.315296566 +2.429130010 12.478808518 +2.438905181 12.645187090 +2.448680352 12.814432280 +2.458455523 12.986544090 +2.468230694 13.161522519 +2.478005865 13.339367566 +2.487781036 13.520079233 +2.497556207 13.703657519 +2.507331378 13.890102424 +2.517106549 14.079413948 +2.526881720 14.271592092 +2.536656891 14.466636854 +2.546432063 14.664548235 +2.556207234 14.865326236 +2.565982405 15.068970855 +2.575757576 15.275482094 +2.585532747 15.484859951 +2.595307918 15.697104428 +2.605083089 15.912215524 +2.614858260 16.130193239 +2.624633431 16.351037573 +2.634408602 16.574748526 +2.644183773 16.801326098 +2.653958944 17.030770289 +2.663734115 17.263081100 +2.673509286 17.498258529 +2.683284457 17.736302577 +2.693059629 17.977213245 +2.702834800 18.220990532 +2.712609971 18.467634437 +2.722385142 18.717144962 +2.732160313 18.969522106 +2.741935484 19.224765869 +2.751710655 19.482876251 +2.761485826 19.743853252 +2.771260997 20.007696872 +2.781036168 20.274407112 +2.790811339 20.543983970 +2.800586510 20.816427447 +2.810361681 21.091737544 +2.820136852 21.369914259 +2.829912023 21.650957594 +2.839687195 21.934867548 +2.849462366 22.221644121 +2.859237537 22.511287313 +2.869012708 22.803797124 +2.878787879 23.099173554 +2.888563050 23.397416603 +2.898338221 23.698526271 +2.908113392 24.002502558 +2.917888563 24.309345465 +2.927663734 24.619054990 +2.937438905 24.931631135 +2.947214076 25.247073899 +2.956989247 25.565383281 +2.966764418 25.886559283 +2.976539589 26.210601904 +2.986314761 26.537511144 +2.996089932 26.867287003 +3.005865103 27.094564030 +3.015640274 27.255381361 +3.025415445 27.420211958 +3.035190616 27.589055822 +3.044965787 27.761912952 +3.054740958 27.938783350 +3.064516129 28.119667014 +3.074291300 28.304563944 +3.084066471 28.493474142 +3.093841642 28.686397606 +3.103616813 28.883334337 +3.113391984 29.084284334 +3.123167155 29.289247598 +3.132942326 29.498224129 +3.142717498 29.711213927 +3.152492669 29.928216992 +3.162267840 30.149233323 +3.172043011 30.374262921 +3.181818182 30.603305785 +3.191593353 30.836361916 +3.201368524 31.073431314 +3.211143695 31.314513979 +3.220918866 31.559609910 +3.230694037 31.808719109 +3.240469208 32.061841573 +3.250244379 32.318977305 +3.260019550 32.580126303 +3.269794721 32.845288568 +3.279569892 33.114464100 +3.289345064 33.387652898 +3.299120235 33.664854963 +3.308895406 33.946070295 +3.318670577 34.231298894 +3.328445748 34.520540759 +3.338220919 34.813795891 +3.347996090 35.111064290 +3.357771261 35.412345955 +3.367546432 35.717640887 +3.377321603 36.026949086 +3.387096774 36.340270552 +3.396871945 36.657605284 +3.406647116 36.978953283 +3.416422287 37.304314548 +3.426197458 37.633689081 +3.435972630 37.967076880 +3.445747801 38.304477946 +3.455522972 38.645892278 +3.465298143 38.991319877 +3.475073314 39.340760743 +3.484848485 39.694214876 +3.494623656 40.051682275 +3.504398827 40.413162941 +3.514173998 40.778656874 +3.523949169 41.148164074 +3.533724340 41.521684540 +3.543499511 41.899218273 +3.553274682 42.280765273 +3.563049853 42.666325539 +3.572825024 43.055899072 +3.582600196 43.449485872 +3.592375367 43.847085938 +3.602150538 44.248699272 +3.611925709 44.654325872 +3.621700880 45.063965738 +3.631476051 45.477618872 +3.641251222 45.895285272 +3.651026393 46.316964938 +3.660801564 46.742657872 +3.670576735 47.172364072 +3.680351906 47.606083539 +3.690127077 48.043816273 +3.699902248 48.485562273 +3.709677419 48.931321540 +3.719452590 49.381094074 +3.729227761 49.834879874 +3.739002933 50.292678942 +3.748778104 50.754491275 +3.758553275 51.220316876 +3.768328446 51.690155743 +3.778103617 52.164007877 +3.787878788 52.641873278 +3.797653959 53.123751946 +3.807429130 53.609643880 +3.817204301 54.099549081 +3.826979472 54.593467548 +3.836754643 55.091399283 +3.846529814 55.593344284 +3.856304985 56.099302552 +3.866080156 56.609274086 +3.875855327 57.123258887 +3.885630499 57.641256955 +3.895405670 58.163268290 +3.905180841 58.689292891 +3.914956012 59.219330759 +3.924731183 59.753381894 +3.934506354 60.291446295 +3.944281525 60.833523964 +3.954056696 61.379614898 +3.963831867 61.929719100 +3.973607038 62.483836568 +3.983382209 63.041967303 +3.993157380 63.604111305 +4.002932551 64.099938941 +4.012707722 64.436422689 +4.022482893 64.778066351 +4.032258065 65.124869927 +4.042033236 65.476833418 +4.051808407 65.833956823 +4.061583578 66.196240142 +4.071358749 66.563683376 +4.081133920 66.936286524 +4.090909091 67.314049587 +4.100684262 67.696972564 +4.110459433 68.085055455 +4.120234604 68.478298260 +4.130009775 68.876700980 +4.139784946 69.280263614 +4.149560117 69.688986163 +4.159335288 70.102868626 +4.169110459 70.521911003 +4.178885630 70.946113295 +4.188660802 71.375475500 +4.198435973 71.809997621 +4.208211144 72.249679655 +4.217986315 72.694521604 +4.227761486 73.144523468 +4.237536657 73.599685245 +4.247311828 74.060006937 +4.257086999 74.525488544 +4.266862170 74.996130064 +4.276637341 75.471931499 +4.286412512 75.952892849 +4.296187683 76.439014112 +4.305962854 76.930295290 +4.315738025 77.426736383 +4.325513196 77.928337390 +4.335288368 78.435098311 +4.345063539 78.947019146 +4.354838710 79.464099896 +4.364613881 79.986340560 +4.374389052 80.513741139 +4.384164223 81.046301631 +4.393939394 81.584022039 +4.403714565 82.126902360 +4.413489736 82.674942596 +4.423264907 83.228142746 +4.433040078 83.786502811 +4.442815249 84.350022790 +4.452590420 84.918702683 +4.462365591 85.492542490 +4.472140762 86.071542212 +4.481915934 86.655701849 +4.491691105 87.245021399 +4.501466276 87.839500864 +4.511241447 88.439140244 +4.521016618 89.043939537 +4.530791789 89.653898745 +4.540566960 90.269017868 +4.550342131 90.889296904 +4.560117302 91.514735855 +4.569892473 92.145334721 +4.579667644 92.781093501 +4.589442815 93.422012195 +4.599217986 94.068090803 +4.608993157 94.719329326 +4.618768328 95.375727763 +4.628543500 96.037286114 +4.638318671 96.704004380 +4.648093842 97.375882560 +4.657869013 98.052920655 +4.667644184 98.735118664 +4.677419355 99.422476587 +4.687194526 100.114994424 +4.696969697 100.812672176 +4.706744868 101.515509843 +4.716520039 102.223507423 +4.726295210 102.936664918 +4.736070381 103.654982327 +4.745845552 104.378459651 +4.755620723 105.107096889 +4.765395894 105.840894041 +4.775171065 106.579851108 +4.784946237 107.323968089 +4.794721408 108.073244984 +4.804496579 108.827681794 +4.814271750 109.587278518 +4.824046921 110.352035156 +4.833822092 111.121951709 +4.843597263 111.897028176 +4.853372434 112.677264557 +4.863147605 113.462660853 +4.872922776 114.253217063 +4.882697947 115.048933188 +4.892473118 115.849809227 +4.902248289 116.655845180 +4.912023460 117.467041047 +4.921798631 118.283396829 +4.931573803 119.104912525 +4.941348974 119.931588136 +4.951124145 120.763423661 +4.960899316 121.600419100 +4.970674487 122.442574453 +4.980449658 123.289889721 +4.990224829 124.142364903 +5.000000000 125.000000000 diff --git a/examples/takagi-sugeno/octave/cubic_approximator.fll b/examples/takagi-sugeno/octave/cubic_approximator.fll new file mode 100644 index 0000000..22b8fa6 --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.fll @@ -0,0 +1,52 @@ +Engine: cubic_approximator +InputVariable: X + enabled: true + range: -5.000 5.000 + lock-range: false + term: AboutNegFive Triangle -6.000 -5.000 -4.000 + term: AboutNegFour Triangle -5.000 -4.000 -3.000 + term: AboutNegThree Triangle -4.000 -3.000 -2.000 + term: AboutNegTwo Triangle -3.000 -2.000 -1.000 + term: AboutNegOne Triangle -2.000 -1.000 0.000 + term: AboutZero Triangle -1.000 0.000 1.000 + term: AboutOne Triangle 0.000 1.000 2.000 + term: AboutTwo Triangle 1.000 2.000 3.000 + term: AboutThree Triangle 2.000 3.000 4.000 + term: AboutFour Triangle 3.000 4.000 5.000 + term: AboutFive Triangle 4.000 5.000 6.000 +OutputVariable: ApproxXCubed + enabled: true + range: -5.000 5.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: TangentatNegFive Linear 75.000 250.000 + term: TangentatNegFour Linear 48.000 128.000 + term: TangentatNegThree Linear 27.000 54.000 + term: TangentatNegTwo Linear 12.000 16.000 + term: TangentatNegOne Linear 3.000 2.000 + term: TangentatZero Linear 0.000 0.000 + term: TangentatOne Linear 3.000 -2.000 + term: TangentatTwo Linear 12.000 -16.000 + term: TangentatThree Linear 27.000 -54.000 + term: TangentatFour Linear 48.000 -128.000 + term: TangentatFive Linear 75.000 -250.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is AboutNegFive then ApproxXCubed is TangentatNegFive + rule: if X is AboutNegFour then ApproxXCubed is TangentatNegFour + rule: if X is AboutNegThree then ApproxXCubed is TangentatNegThree + rule: if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo + rule: if X is AboutNegOne then ApproxXCubed is TangentatNegOne + rule: if X is AboutZero then ApproxXCubed is TangentatZero + rule: if X is AboutOne then ApproxXCubed is TangentatOne + rule: if X is AboutTwo then ApproxXCubed is TangentatTwo + rule: if X is AboutThree then ApproxXCubed is TangentatThree + rule: if X is AboutFour then ApproxXCubed is TangentatFour + rule: if X is AboutFive then ApproxXCubed is TangentatFive
\ No newline at end of file diff --git a/examples/takagi-sugeno/octave/cubic_approximator.java b/examples/takagi-sugeno/octave/cubic_approximator.java new file mode 100644 index 0000000..ed64870 --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.java @@ -0,0 +1,87 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class cubic_approximator{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("cubic_approximator"); +engine.setDescription(""); + +InputVariable X = new InputVariable(); +X.setName("X"); +X.setDescription(""); +X.setEnabled(true); +X.setRange(-5.000, 5.000); +X.setLockValueInRange(false); +X.addTerm(new Triangle("AboutNegFive", -6.000, -5.000, -4.000)); +X.addTerm(new Triangle("AboutNegFour", -5.000, -4.000, -3.000)); +X.addTerm(new Triangle("AboutNegThree", -4.000, -3.000, -2.000)); +X.addTerm(new Triangle("AboutNegTwo", -3.000, -2.000, -1.000)); +X.addTerm(new Triangle("AboutNegOne", -2.000, -1.000, 0.000)); +X.addTerm(new Triangle("AboutZero", -1.000, 0.000, 1.000)); +X.addTerm(new Triangle("AboutOne", 0.000, 1.000, 2.000)); +X.addTerm(new Triangle("AboutTwo", 1.000, 2.000, 3.000)); +X.addTerm(new Triangle("AboutThree", 2.000, 3.000, 4.000)); +X.addTerm(new Triangle("AboutFour", 3.000, 4.000, 5.000)); +X.addTerm(new Triangle("AboutFive", 4.000, 5.000, 6.000)); +engine.addInputVariable(X); + +OutputVariable ApproxXCubed = new OutputVariable(); +ApproxXCubed.setName("ApproxXCubed"); +ApproxXCubed.setDescription(""); +ApproxXCubed.setEnabled(true); +ApproxXCubed.setRange(-5.000, 5.000); +ApproxXCubed.setLockValueInRange(false); +ApproxXCubed.setAggregation(null); +ApproxXCubed.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +ApproxXCubed.setDefaultValue(Double.NaN); +ApproxXCubed.setLockPreviousValue(false); +ApproxXCubed.addTerm(Linear.create("TangentatNegFive", engine, 75.000, 250.000)); +ApproxXCubed.addTerm(Linear.create("TangentatNegFour", engine, 48.000, 128.000)); +ApproxXCubed.addTerm(Linear.create("TangentatNegThree", engine, 27.000, 54.000)); +ApproxXCubed.addTerm(Linear.create("TangentatNegTwo", engine, 12.000, 16.000)); +ApproxXCubed.addTerm(Linear.create("TangentatNegOne", engine, 3.000, 2.000)); +ApproxXCubed.addTerm(Linear.create("TangentatZero", engine, 0.000, 0.000)); +ApproxXCubed.addTerm(Linear.create("TangentatOne", engine, 3.000, -2.000)); +ApproxXCubed.addTerm(Linear.create("TangentatTwo", engine, 12.000, -16.000)); +ApproxXCubed.addTerm(Linear.create("TangentatThree", engine, 27.000, -54.000)); +ApproxXCubed.addTerm(Linear.create("TangentatFour", engine, 48.000, -128.000)); +ApproxXCubed.addTerm(Linear.create("TangentatFive", engine, 75.000, -250.000)); +engine.addOutputVariable(ApproxXCubed); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if X is AboutNegFive then ApproxXCubed is TangentatNegFive", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutNegFour then ApproxXCubed is TangentatNegFour", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutNegThree then ApproxXCubed is TangentatNegThree", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutNegTwo then ApproxXCubed is TangentatNegTwo", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutNegOne then ApproxXCubed is TangentatNegOne", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutZero then ApproxXCubed is TangentatZero", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutOne then ApproxXCubed is TangentatOne", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutTwo then ApproxXCubed is TangentatTwo", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutThree then ApproxXCubed is TangentatThree", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutFour then ApproxXCubed is TangentatFour", engine)); +ruleBlock.addRule(Rule.parse("if X is AboutFive then ApproxXCubed is TangentatFive", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/takagi-sugeno/octave/cubic_approximator.pdf b/examples/takagi-sugeno/octave/cubic_approximator.pdf Binary files differnew file mode 100644 index 0000000..62d12ee --- /dev/null +++ b/examples/takagi-sugeno/octave/cubic_approximator.pdf diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.R b/examples/takagi-sugeno/octave/heart_disease_risk.R new file mode 100644 index 0000000..6ea4240 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.R @@ -0,0 +1,84 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "heart_disease_risk" +engine.fll = "Engine: heart_disease_risk +InputVariable: LDLLevel + enabled: true + range: 0.000 300.000 + lock-range: false + term: Low Trapezoid -1.000 0.000 90.000 110.000 + term: LowBorderline Trapezoid 90.000 110.000 120.000 140.000 + term: Borderline Trapezoid 120.000 140.000 150.000 170.000 + term: HighBorderline Trapezoid 150.000 170.000 180.000 200.000 + term: High Trapezoid 180.000 200.000 300.000 301.000 +InputVariable: HDLLevel + enabled: true + range: 0.000 100.000 + lock-range: false + term: LowHDL Trapezoid -1.000 0.000 35.000 45.000 + term: ModerateHDL Trapezoid 35.000 45.000 55.000 65.000 + term: HighHDL Trapezoid 55.000 65.000 100.000 101.000 +OutputVariable: HeartDiseaseRisk + enabled: true + range: 0.000 10.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: NoRisk Constant 0.000 + term: LowRisk Constant 2.500 + term: MediumRisk Constant 5.000 + term: HighRisk Constant 7.500 + term: ExtremeRisk Constant 10.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk + rule: if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk + rule: if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk" + +engine.fldFile = "heart_disease_risk.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(LDLLevel, HDLLevel)) + + geom_tile(aes(fill=HeartDiseaseRisk)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=LDLLevel, y=HDLLevel, z=HeartDiseaseRisk), color="black") + + ggtitle("(LDLLevel, HDLLevel) = HeartDiseaseRisk") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(HDLLevel, LDLLevel)) + + geom_tile(aes(fill=HeartDiseaseRisk)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=HDLLevel, y=LDLLevel, z=HeartDiseaseRisk), color="black") + + ggtitle("(HDLLevel, LDLLevel) = HeartDiseaseRisk") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.cpp b/examples/takagi-sugeno/octave/heart_disease_risk.cpp new file mode 100644 index 0000000..12e7f72 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.cpp @@ -0,0 +1,79 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("heart_disease_risk"); +engine->setDescription(""); + +InputVariable* LDLLevel = new InputVariable; +LDLLevel->setName("LDLLevel"); +LDLLevel->setDescription(""); +LDLLevel->setEnabled(true); +LDLLevel->setRange(0.000, 300.000); +LDLLevel->setLockValueInRange(false); +LDLLevel->addTerm(new Trapezoid("Low", -1.000, 0.000, 90.000, 110.000)); +LDLLevel->addTerm(new Trapezoid("LowBorderline", 90.000, 110.000, 120.000, 140.000)); +LDLLevel->addTerm(new Trapezoid("Borderline", 120.000, 140.000, 150.000, 170.000)); +LDLLevel->addTerm(new Trapezoid("HighBorderline", 150.000, 170.000, 180.000, 200.000)); +LDLLevel->addTerm(new Trapezoid("High", 180.000, 200.000, 300.000, 301.000)); +engine->addInputVariable(LDLLevel); + +InputVariable* HDLLevel = new InputVariable; +HDLLevel->setName("HDLLevel"); +HDLLevel->setDescription(""); +HDLLevel->setEnabled(true); +HDLLevel->setRange(0.000, 100.000); +HDLLevel->setLockValueInRange(false); +HDLLevel->addTerm(new Trapezoid("LowHDL", -1.000, 0.000, 35.000, 45.000)); +HDLLevel->addTerm(new Trapezoid("ModerateHDL", 35.000, 45.000, 55.000, 65.000)); +HDLLevel->addTerm(new Trapezoid("HighHDL", 55.000, 65.000, 100.000, 101.000)); +engine->addInputVariable(HDLLevel); + +OutputVariable* HeartDiseaseRisk = new OutputVariable; +HeartDiseaseRisk->setName("HeartDiseaseRisk"); +HeartDiseaseRisk->setDescription(""); +HeartDiseaseRisk->setEnabled(true); +HeartDiseaseRisk->setRange(0.000, 10.000); +HeartDiseaseRisk->setLockValueInRange(false); +HeartDiseaseRisk->setAggregation(fl::null); +HeartDiseaseRisk->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +HeartDiseaseRisk->setDefaultValue(fl::nan); +HeartDiseaseRisk->setLockPreviousValue(false); +HeartDiseaseRisk->addTerm(new Constant("NoRisk", 0.000)); +HeartDiseaseRisk->addTerm(new Constant("LowRisk", 2.500)); +HeartDiseaseRisk->addTerm(new Constant("MediumRisk", 5.000)); +HeartDiseaseRisk->addTerm(new Constant("HighRisk", 7.500)); +HeartDiseaseRisk->addTerm(new Constant("ExtremeRisk", 10.000)); +engine->addOutputVariable(HeartDiseaseRisk); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new Minimum); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock->addRule(Rule::parse("if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.fcl b/examples/takagi-sugeno/octave/heart_disease_risk.fcl new file mode 100644 index 0000000..4e09d59 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.fcl @@ -0,0 +1,60 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK heart_disease_risk + +VAR_INPUT + LDLLevel: REAL; + HDLLevel: REAL; +END_VAR + +VAR_OUTPUT + HeartDiseaseRisk: REAL; +END_VAR + +FUZZIFY LDLLevel + RANGE := (0.000 .. 300.000); + TERM Low := Trapezoid -1.000 0.000 90.000 110.000; + TERM LowBorderline := Trapezoid 90.000 110.000 120.000 140.000; + TERM Borderline := Trapezoid 120.000 140.000 150.000 170.000; + TERM HighBorderline := Trapezoid 150.000 170.000 180.000 200.000; + TERM High := Trapezoid 180.000 200.000 300.000 301.000; +END_FUZZIFY + +FUZZIFY HDLLevel + RANGE := (0.000 .. 100.000); + TERM LowHDL := Trapezoid -1.000 0.000 35.000 45.000; + TERM ModerateHDL := Trapezoid 35.000 45.000 55.000 65.000; + TERM HighHDL := Trapezoid 55.000 65.000 100.000 101.000; +END_FUZZIFY + +DEFUZZIFY HeartDiseaseRisk + RANGE := (0.000 .. 10.000); + TERM NoRisk := 0.000; + TERM LowRisk := 2.500; + TERM MediumRisk := 5.000; + TERM HighRisk := 7.500; + TERM ExtremeRisk := 10.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : MIN; + RULE 1 : if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + RULE 2 : if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + RULE 3 : if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk + RULE 4 : if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + RULE 5 : if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + RULE 6 : if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + RULE 7 : if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + RULE 8 : if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk + RULE 9 : if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + RULE 10 : if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + RULE 11 : if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + RULE 12 : if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk + RULE 13 : if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk + RULE 14 : if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + RULE 15 : if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.fis b/examples/takagi-sugeno/octave/heart_disease_risk.fis new file mode 100644 index 0000000..485d8d9 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.fis @@ -0,0 +1,59 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='heart_disease_risk' +Type='sugeno' +Version=6.0 +NumInputs=2 +NumOutputs=1 +NumRules=15 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='LDLLevel' +Range=[0.000 300.000] +NumMFs=5 +MF1='Low':'trapmf',[-1.000 0.000 90.000 110.000] +MF2='LowBorderline':'trapmf',[90.000 110.000 120.000 140.000] +MF3='Borderline':'trapmf',[120.000 140.000 150.000 170.000] +MF4='HighBorderline':'trapmf',[150.000 170.000 180.000 200.000] +MF5='High':'trapmf',[180.000 200.000 300.000 301.000] + +[Input2] +Name='HDLLevel' +Range=[0.000 100.000] +NumMFs=3 +MF1='LowHDL':'trapmf',[-1.000 0.000 35.000 45.000] +MF2='ModerateHDL':'trapmf',[35.000 45.000 55.000 65.000] +MF3='HighHDL':'trapmf',[55.000 65.000 100.000 101.000] + +[Output1] +Name='HeartDiseaseRisk' +Range=[0.000 10.000] +NumMFs=5 +MF1='NoRisk':'constant',[0.000] +MF2='LowRisk':'constant',[2.500] +MF3='MediumRisk':'constant',[5.000] +MF4='HighRisk':'constant',[7.500] +MF5='ExtremeRisk':'constant',[10.000] + +[Rules] +1.000 1.000 , 3.000 (1.000) : 1 +1.000 2.000 , 2.000 (1.000) : 1 +1.000 3.000 , 1.000 (1.000) : 1 +2.000 1.000 , 3.000 (1.000) : 1 +2.000 2.000 , 2.000 (1.000) : 1 +2.000 3.000 , 2.000 (1.000) : 1 +3.000 1.000 , 4.000 (1.000) : 1 +3.000 2.000 , 3.000 (1.000) : 1 +3.000 3.000 , 2.000 (1.000) : 1 +4.000 1.000 , 4.000 (1.000) : 1 +4.000 2.000 , 4.000 (1.000) : 1 +4.000 3.000 , 3.000 (1.000) : 1 +5.000 1.000 , 5.000 (1.000) : 1 +5.000 2.000 , 4.000 (1.000) : 1 +5.000 3.000 , 3.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.fld b/examples/takagi-sugeno/octave/heart_disease_risk.fld new file mode 100644 index 0000000..7b9a00e --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.fld @@ -0,0 +1,1025 @@ +LDLLevel HDLLevel HeartDiseaseRisk +0.000000000 0.000000000 5.000000000 +0.000000000 3.225806452 5.000000000 +0.000000000 6.451612903 5.000000000 +0.000000000 9.677419355 5.000000000 +0.000000000 12.903225806 5.000000000 +0.000000000 16.129032258 5.000000000 +0.000000000 19.354838710 5.000000000 +0.000000000 22.580645161 5.000000000 +0.000000000 25.806451613 5.000000000 +0.000000000 29.032258065 5.000000000 +0.000000000 32.258064516 5.000000000 +0.000000000 35.483870968 4.879032258 +0.000000000 38.709677419 4.072580645 +0.000000000 41.935483871 3.266129032 +0.000000000 45.161290323 2.500000000 +0.000000000 48.387096774 2.500000000 +0.000000000 51.612903226 2.500000000 +0.000000000 54.838709677 2.500000000 +0.000000000 58.064516129 1.733870968 +0.000000000 61.290322581 0.927419355 +0.000000000 64.516129032 0.120967742 +0.000000000 67.741935484 0.000000000 +0.000000000 70.967741935 0.000000000 +0.000000000 74.193548387 0.000000000 +0.000000000 77.419354839 0.000000000 +0.000000000 80.645161290 0.000000000 +0.000000000 83.870967742 0.000000000 +0.000000000 87.096774194 0.000000000 +0.000000000 90.322580645 0.000000000 +0.000000000 93.548387097 0.000000000 +0.000000000 96.774193548 0.000000000 +0.000000000 100.000000000 0.000000000 +9.677419355 0.000000000 5.000000000 +9.677419355 3.225806452 5.000000000 +9.677419355 6.451612903 5.000000000 +9.677419355 9.677419355 5.000000000 +9.677419355 12.903225806 5.000000000 +9.677419355 16.129032258 5.000000000 +9.677419355 19.354838710 5.000000000 +9.677419355 22.580645161 5.000000000 +9.677419355 25.806451613 5.000000000 +9.677419355 29.032258065 5.000000000 +9.677419355 32.258064516 5.000000000 +9.677419355 35.483870968 4.879032258 +9.677419355 38.709677419 4.072580645 +9.677419355 41.935483871 3.266129032 +9.677419355 45.161290323 2.500000000 +9.677419355 48.387096774 2.500000000 +9.677419355 51.612903226 2.500000000 +9.677419355 54.838709677 2.500000000 +9.677419355 58.064516129 1.733870968 +9.677419355 61.290322581 0.927419355 +9.677419355 64.516129032 0.120967742 +9.677419355 67.741935484 0.000000000 +9.677419355 70.967741935 0.000000000 +9.677419355 74.193548387 0.000000000 +9.677419355 77.419354839 0.000000000 +9.677419355 80.645161290 0.000000000 +9.677419355 83.870967742 0.000000000 +9.677419355 87.096774194 0.000000000 +9.677419355 90.322580645 0.000000000 +9.677419355 93.548387097 0.000000000 +9.677419355 96.774193548 0.000000000 +9.677419355 100.000000000 0.000000000 +19.354838710 0.000000000 5.000000000 +19.354838710 3.225806452 5.000000000 +19.354838710 6.451612903 5.000000000 +19.354838710 9.677419355 5.000000000 +19.354838710 12.903225806 5.000000000 +19.354838710 16.129032258 5.000000000 +19.354838710 19.354838710 5.000000000 +19.354838710 22.580645161 5.000000000 +19.354838710 25.806451613 5.000000000 +19.354838710 29.032258065 5.000000000 +19.354838710 32.258064516 5.000000000 +19.354838710 35.483870968 4.879032258 +19.354838710 38.709677419 4.072580645 +19.354838710 41.935483871 3.266129032 +19.354838710 45.161290323 2.500000000 +19.354838710 48.387096774 2.500000000 +19.354838710 51.612903226 2.500000000 +19.354838710 54.838709677 2.500000000 +19.354838710 58.064516129 1.733870968 +19.354838710 61.290322581 0.927419355 +19.354838710 64.516129032 0.120967742 +19.354838710 67.741935484 0.000000000 +19.354838710 70.967741935 0.000000000 +19.354838710 74.193548387 0.000000000 +19.354838710 77.419354839 0.000000000 +19.354838710 80.645161290 0.000000000 +19.354838710 83.870967742 0.000000000 +19.354838710 87.096774194 0.000000000 +19.354838710 90.322580645 0.000000000 +19.354838710 93.548387097 0.000000000 +19.354838710 96.774193548 0.000000000 +19.354838710 100.000000000 0.000000000 +29.032258065 0.000000000 5.000000000 +29.032258065 3.225806452 5.000000000 +29.032258065 6.451612903 5.000000000 +29.032258065 9.677419355 5.000000000 +29.032258065 12.903225806 5.000000000 +29.032258065 16.129032258 5.000000000 +29.032258065 19.354838710 5.000000000 +29.032258065 22.580645161 5.000000000 +29.032258065 25.806451613 5.000000000 +29.032258065 29.032258065 5.000000000 +29.032258065 32.258064516 5.000000000 +29.032258065 35.483870968 4.879032258 +29.032258065 38.709677419 4.072580645 +29.032258065 41.935483871 3.266129032 +29.032258065 45.161290323 2.500000000 +29.032258065 48.387096774 2.500000000 +29.032258065 51.612903226 2.500000000 +29.032258065 54.838709677 2.500000000 +29.032258065 58.064516129 1.733870968 +29.032258065 61.290322581 0.927419355 +29.032258065 64.516129032 0.120967742 +29.032258065 67.741935484 0.000000000 +29.032258065 70.967741935 0.000000000 +29.032258065 74.193548387 0.000000000 +29.032258065 77.419354839 0.000000000 +29.032258065 80.645161290 0.000000000 +29.032258065 83.870967742 0.000000000 +29.032258065 87.096774194 0.000000000 +29.032258065 90.322580645 0.000000000 +29.032258065 93.548387097 0.000000000 +29.032258065 96.774193548 0.000000000 +29.032258065 100.000000000 0.000000000 +38.709677419 0.000000000 5.000000000 +38.709677419 3.225806452 5.000000000 +38.709677419 6.451612903 5.000000000 +38.709677419 9.677419355 5.000000000 +38.709677419 12.903225806 5.000000000 +38.709677419 16.129032258 5.000000000 +38.709677419 19.354838710 5.000000000 +38.709677419 22.580645161 5.000000000 +38.709677419 25.806451613 5.000000000 +38.709677419 29.032258065 5.000000000 +38.709677419 32.258064516 5.000000000 +38.709677419 35.483870968 4.879032258 +38.709677419 38.709677419 4.072580645 +38.709677419 41.935483871 3.266129032 +38.709677419 45.161290323 2.500000000 +38.709677419 48.387096774 2.500000000 +38.709677419 51.612903226 2.500000000 +38.709677419 54.838709677 2.500000000 +38.709677419 58.064516129 1.733870968 +38.709677419 61.290322581 0.927419355 +38.709677419 64.516129032 0.120967742 +38.709677419 67.741935484 0.000000000 +38.709677419 70.967741935 0.000000000 +38.709677419 74.193548387 0.000000000 +38.709677419 77.419354839 0.000000000 +38.709677419 80.645161290 0.000000000 +38.709677419 83.870967742 0.000000000 +38.709677419 87.096774194 0.000000000 +38.709677419 90.322580645 0.000000000 +38.709677419 93.548387097 0.000000000 +38.709677419 96.774193548 0.000000000 +38.709677419 100.000000000 0.000000000 +48.387096774 0.000000000 5.000000000 +48.387096774 3.225806452 5.000000000 +48.387096774 6.451612903 5.000000000 +48.387096774 9.677419355 5.000000000 +48.387096774 12.903225806 5.000000000 +48.387096774 16.129032258 5.000000000 +48.387096774 19.354838710 5.000000000 +48.387096774 22.580645161 5.000000000 +48.387096774 25.806451613 5.000000000 +48.387096774 29.032258065 5.000000000 +48.387096774 32.258064516 5.000000000 +48.387096774 35.483870968 4.879032258 +48.387096774 38.709677419 4.072580645 +48.387096774 41.935483871 3.266129032 +48.387096774 45.161290323 2.500000000 +48.387096774 48.387096774 2.500000000 +48.387096774 51.612903226 2.500000000 +48.387096774 54.838709677 2.500000000 +48.387096774 58.064516129 1.733870968 +48.387096774 61.290322581 0.927419355 +48.387096774 64.516129032 0.120967742 +48.387096774 67.741935484 0.000000000 +48.387096774 70.967741935 0.000000000 +48.387096774 74.193548387 0.000000000 +48.387096774 77.419354839 0.000000000 +48.387096774 80.645161290 0.000000000 +48.387096774 83.870967742 0.000000000 +48.387096774 87.096774194 0.000000000 +48.387096774 90.322580645 0.000000000 +48.387096774 93.548387097 0.000000000 +48.387096774 96.774193548 0.000000000 +48.387096774 100.000000000 0.000000000 +58.064516129 0.000000000 5.000000000 +58.064516129 3.225806452 5.000000000 +58.064516129 6.451612903 5.000000000 +58.064516129 9.677419355 5.000000000 +58.064516129 12.903225806 5.000000000 +58.064516129 16.129032258 5.000000000 +58.064516129 19.354838710 5.000000000 +58.064516129 22.580645161 5.000000000 +58.064516129 25.806451613 5.000000000 +58.064516129 29.032258065 5.000000000 +58.064516129 32.258064516 5.000000000 +58.064516129 35.483870968 4.879032258 +58.064516129 38.709677419 4.072580645 +58.064516129 41.935483871 3.266129032 +58.064516129 45.161290323 2.500000000 +58.064516129 48.387096774 2.500000000 +58.064516129 51.612903226 2.500000000 +58.064516129 54.838709677 2.500000000 +58.064516129 58.064516129 1.733870968 +58.064516129 61.290322581 0.927419355 +58.064516129 64.516129032 0.120967742 +58.064516129 67.741935484 0.000000000 +58.064516129 70.967741935 0.000000000 +58.064516129 74.193548387 0.000000000 +58.064516129 77.419354839 0.000000000 +58.064516129 80.645161290 0.000000000 +58.064516129 83.870967742 0.000000000 +58.064516129 87.096774194 0.000000000 +58.064516129 90.322580645 0.000000000 +58.064516129 93.548387097 0.000000000 +58.064516129 96.774193548 0.000000000 +58.064516129 100.000000000 0.000000000 +67.741935484 0.000000000 5.000000000 +67.741935484 3.225806452 5.000000000 +67.741935484 6.451612903 5.000000000 +67.741935484 9.677419355 5.000000000 +67.741935484 12.903225806 5.000000000 +67.741935484 16.129032258 5.000000000 +67.741935484 19.354838710 5.000000000 +67.741935484 22.580645161 5.000000000 +67.741935484 25.806451613 5.000000000 +67.741935484 29.032258065 5.000000000 +67.741935484 32.258064516 5.000000000 +67.741935484 35.483870968 4.879032258 +67.741935484 38.709677419 4.072580645 +67.741935484 41.935483871 3.266129032 +67.741935484 45.161290323 2.500000000 +67.741935484 48.387096774 2.500000000 +67.741935484 51.612903226 2.500000000 +67.741935484 54.838709677 2.500000000 +67.741935484 58.064516129 1.733870968 +67.741935484 61.290322581 0.927419355 +67.741935484 64.516129032 0.120967742 +67.741935484 67.741935484 0.000000000 +67.741935484 70.967741935 0.000000000 +67.741935484 74.193548387 0.000000000 +67.741935484 77.419354839 0.000000000 +67.741935484 80.645161290 0.000000000 +67.741935484 83.870967742 0.000000000 +67.741935484 87.096774194 0.000000000 +67.741935484 90.322580645 0.000000000 +67.741935484 93.548387097 0.000000000 +67.741935484 96.774193548 0.000000000 +67.741935484 100.000000000 0.000000000 +77.419354839 0.000000000 5.000000000 +77.419354839 3.225806452 5.000000000 +77.419354839 6.451612903 5.000000000 +77.419354839 9.677419355 5.000000000 +77.419354839 12.903225806 5.000000000 +77.419354839 16.129032258 5.000000000 +77.419354839 19.354838710 5.000000000 +77.419354839 22.580645161 5.000000000 +77.419354839 25.806451613 5.000000000 +77.419354839 29.032258065 5.000000000 +77.419354839 32.258064516 5.000000000 +77.419354839 35.483870968 4.879032258 +77.419354839 38.709677419 4.072580645 +77.419354839 41.935483871 3.266129032 +77.419354839 45.161290323 2.500000000 +77.419354839 48.387096774 2.500000000 +77.419354839 51.612903226 2.500000000 +77.419354839 54.838709677 2.500000000 +77.419354839 58.064516129 1.733870968 +77.419354839 61.290322581 0.927419355 +77.419354839 64.516129032 0.120967742 +77.419354839 67.741935484 0.000000000 +77.419354839 70.967741935 0.000000000 +77.419354839 74.193548387 0.000000000 +77.419354839 77.419354839 0.000000000 +77.419354839 80.645161290 0.000000000 +77.419354839 83.870967742 0.000000000 +77.419354839 87.096774194 0.000000000 +77.419354839 90.322580645 0.000000000 +77.419354839 93.548387097 0.000000000 +77.419354839 96.774193548 0.000000000 +77.419354839 100.000000000 0.000000000 +87.096774194 0.000000000 5.000000000 +87.096774194 3.225806452 5.000000000 +87.096774194 6.451612903 5.000000000 +87.096774194 9.677419355 5.000000000 +87.096774194 12.903225806 5.000000000 +87.096774194 16.129032258 5.000000000 +87.096774194 19.354838710 5.000000000 +87.096774194 22.580645161 5.000000000 +87.096774194 25.806451613 5.000000000 +87.096774194 29.032258065 5.000000000 +87.096774194 32.258064516 5.000000000 +87.096774194 35.483870968 4.879032258 +87.096774194 38.709677419 4.072580645 +87.096774194 41.935483871 3.266129032 +87.096774194 45.161290323 2.500000000 +87.096774194 48.387096774 2.500000000 +87.096774194 51.612903226 2.500000000 +87.096774194 54.838709677 2.500000000 +87.096774194 58.064516129 1.733870968 +87.096774194 61.290322581 0.927419355 +87.096774194 64.516129032 0.120967742 +87.096774194 67.741935484 0.000000000 +87.096774194 70.967741935 0.000000000 +87.096774194 74.193548387 0.000000000 +87.096774194 77.419354839 0.000000000 +87.096774194 80.645161290 0.000000000 +87.096774194 83.870967742 0.000000000 +87.096774194 87.096774194 0.000000000 +87.096774194 90.322580645 0.000000000 +87.096774194 93.548387097 0.000000000 +87.096774194 96.774193548 0.000000000 +87.096774194 100.000000000 0.000000000 +96.774193548 0.000000000 5.000000000 +96.774193548 3.225806452 5.000000000 +96.774193548 6.451612903 5.000000000 +96.774193548 9.677419355 5.000000000 +96.774193548 12.903225806 5.000000000 +96.774193548 16.129032258 5.000000000 +96.774193548 19.354838710 5.000000000 +96.774193548 22.580645161 5.000000000 +96.774193548 25.806451613 5.000000000 +96.774193548 29.032258065 5.000000000 +96.774193548 32.258064516 5.000000000 +96.774193548 35.483870968 4.779411765 +96.774193548 38.709677419 3.942307692 +96.774193548 41.935483871 3.450000000 +96.774193548 45.161290323 2.500000000 +96.774193548 48.387096774 2.500000000 +96.774193548 51.612903226 2.500000000 +96.774193548 54.838709677 2.500000000 +96.774193548 58.064516129 2.025000000 +96.774193548 61.290322581 1.562500000 +96.774193548 64.516129032 0.992647059 +96.774193548 67.741935484 0.846774194 +96.774193548 70.967741935 0.846774194 +96.774193548 74.193548387 0.846774194 +96.774193548 77.419354839 0.846774194 +96.774193548 80.645161290 0.846774194 +96.774193548 83.870967742 0.846774194 +96.774193548 87.096774194 0.846774194 +96.774193548 90.322580645 0.846774194 +96.774193548 93.548387097 0.846774194 +96.774193548 96.774193548 0.846774194 +96.774193548 100.000000000 0.846774194 +106.451612903 0.000000000 5.000000000 +106.451612903 3.225806452 5.000000000 +106.451612903 6.451612903 5.000000000 +106.451612903 9.677419355 5.000000000 +106.451612903 12.903225806 5.000000000 +106.451612903 16.129032258 5.000000000 +106.451612903 19.354838710 5.000000000 +106.451612903 22.580645161 5.000000000 +106.451612903 25.806451613 5.000000000 +106.451612903 29.032258065 5.000000000 +106.451612903 32.258064516 5.000000000 +106.451612903 35.483870968 4.779411765 +106.451612903 38.709677419 3.988095238 +106.451612903 41.935483871 3.392857143 +106.451612903 45.161290323 2.500000000 +106.451612903 48.387096774 2.500000000 +106.451612903 51.612903226 2.500000000 +106.451612903 54.838709677 2.500000000 +106.451612903 58.064516129 2.172619048 +106.451612903 61.290322581 2.172619048 +106.451612903 64.516129032 2.095588235 +106.451612903 67.741935484 2.056451613 +106.451612903 70.967741935 2.056451613 +106.451612903 74.193548387 2.056451613 +106.451612903 77.419354839 2.056451613 +106.451612903 80.645161290 2.056451613 +106.451612903 83.870967742 2.056451613 +106.451612903 87.096774194 2.056451613 +106.451612903 90.322580645 2.056451613 +106.451612903 93.548387097 2.056451613 +106.451612903 96.774193548 2.056451613 +106.451612903 100.000000000 2.056451613 +116.129032258 0.000000000 5.000000000 +116.129032258 3.225806452 5.000000000 +116.129032258 6.451612903 5.000000000 +116.129032258 9.677419355 5.000000000 +116.129032258 12.903225806 5.000000000 +116.129032258 16.129032258 5.000000000 +116.129032258 19.354838710 5.000000000 +116.129032258 22.580645161 5.000000000 +116.129032258 25.806451613 5.000000000 +116.129032258 29.032258065 5.000000000 +116.129032258 32.258064516 5.000000000 +116.129032258 35.483870968 4.879032258 +116.129032258 38.709677419 4.072580645 +116.129032258 41.935483871 3.266129032 +116.129032258 45.161290323 2.500000000 +116.129032258 48.387096774 2.500000000 +116.129032258 51.612903226 2.500000000 +116.129032258 54.838709677 2.500000000 +116.129032258 58.064516129 2.500000000 +116.129032258 61.290322581 2.500000000 +116.129032258 64.516129032 2.500000000 +116.129032258 67.741935484 2.500000000 +116.129032258 70.967741935 2.500000000 +116.129032258 74.193548387 2.500000000 +116.129032258 77.419354839 2.500000000 +116.129032258 80.645161290 2.500000000 +116.129032258 83.870967742 2.500000000 +116.129032258 87.096774194 2.500000000 +116.129032258 90.322580645 2.500000000 +116.129032258 93.548387097 2.500000000 +116.129032258 96.774193548 2.500000000 +116.129032258 100.000000000 2.500000000 +125.806451613 0.000000000 5.725806452 +125.806451613 3.225806452 5.725806452 +125.806451613 6.451612903 5.725806452 +125.806451613 9.677419355 5.725806452 +125.806451613 12.903225806 5.725806452 +125.806451613 16.129032258 5.725806452 +125.806451613 19.354838710 5.725806452 +125.806451613 22.580645161 5.725806452 +125.806451613 25.806451613 5.725806452 +125.806451613 29.032258065 5.725806452 +125.806451613 32.258064516 5.725806452 +125.806451613 35.483870968 5.551470588 +125.806451613 38.709677419 4.872448980 +125.806451613 41.935483871 4.362244898 +125.806451613 45.161290323 3.225806452 +125.806451613 48.387096774 3.225806452 +125.806451613 51.612903226 3.225806452 +125.806451613 54.838709677 3.225806452 +125.806451613 58.064516129 2.959183673 +125.806451613 61.290322581 2.959183673 +125.806451613 64.516129032 2.610294118 +125.806451613 67.741935484 2.500000000 +125.806451613 70.967741935 2.500000000 +125.806451613 74.193548387 2.500000000 +125.806451613 77.419354839 2.500000000 +125.806451613 80.645161290 2.500000000 +125.806451613 83.870967742 2.500000000 +125.806451613 87.096774194 2.500000000 +125.806451613 90.322580645 2.500000000 +125.806451613 93.548387097 2.500000000 +125.806451613 96.774193548 2.500000000 +125.806451613 100.000000000 2.500000000 +135.483870968 0.000000000 6.935483871 +135.483870968 3.225806452 6.935483871 +135.483870968 6.451612903 6.935483871 +135.483870968 9.677419355 6.935483871 +135.483870968 12.903225806 6.935483871 +135.483870968 16.129032258 6.935483871 +135.483870968 19.354838710 6.935483871 +135.483870968 22.580645161 6.935483871 +135.483870968 25.806451613 6.935483871 +135.483870968 29.032258065 6.935483871 +135.483870968 32.258064516 6.935483871 +135.483870968 35.483870968 6.654411765 +135.483870968 38.709677419 5.694444444 +135.483870968 41.935483871 5.138888889 +135.483870968 45.161290323 4.435483871 +135.483870968 48.387096774 4.435483871 +135.483870968 51.612903226 4.435483871 +135.483870968 54.838709677 4.435483871 +135.483870968 58.064516129 3.694444444 +135.483870968 61.290322581 3.138888889 +135.483870968 64.516129032 2.610294118 +135.483870968 67.741935484 2.500000000 +135.483870968 70.967741935 2.500000000 +135.483870968 74.193548387 2.500000000 +135.483870968 77.419354839 2.500000000 +135.483870968 80.645161290 2.500000000 +135.483870968 83.870967742 2.500000000 +135.483870968 87.096774194 2.500000000 +135.483870968 90.322580645 2.500000000 +135.483870968 93.548387097 2.500000000 +135.483870968 96.774193548 2.500000000 +135.483870968 100.000000000 2.500000000 +145.161290323 0.000000000 7.500000000 +145.161290323 3.225806452 7.500000000 +145.161290323 6.451612903 7.500000000 +145.161290323 9.677419355 7.500000000 +145.161290323 12.903225806 7.500000000 +145.161290323 16.129032258 7.500000000 +145.161290323 19.354838710 7.500000000 +145.161290323 22.580645161 7.500000000 +145.161290323 25.806451613 7.500000000 +145.161290323 29.032258065 7.500000000 +145.161290323 32.258064516 7.500000000 +145.161290323 35.483870968 7.379032258 +145.161290323 38.709677419 6.572580645 +145.161290323 41.935483871 5.766129032 +145.161290323 45.161290323 5.000000000 +145.161290323 48.387096774 5.000000000 +145.161290323 51.612903226 5.000000000 +145.161290323 54.838709677 5.000000000 +145.161290323 58.064516129 4.233870968 +145.161290323 61.290322581 3.427419355 +145.161290323 64.516129032 2.620967742 +145.161290323 67.741935484 2.500000000 +145.161290323 70.967741935 2.500000000 +145.161290323 74.193548387 2.500000000 +145.161290323 77.419354839 2.500000000 +145.161290323 80.645161290 2.500000000 +145.161290323 83.870967742 2.500000000 +145.161290323 87.096774194 2.500000000 +145.161290323 90.322580645 2.500000000 +145.161290323 93.548387097 2.500000000 +145.161290323 96.774193548 2.500000000 +145.161290323 100.000000000 2.500000000 +154.838709677 0.000000000 7.500000000 +154.838709677 3.225806452 7.500000000 +154.838709677 6.451612903 7.500000000 +154.838709677 9.677419355 7.500000000 +154.838709677 12.903225806 7.500000000 +154.838709677 16.129032258 7.500000000 +154.838709677 19.354838710 7.500000000 +154.838709677 22.580645161 7.500000000 +154.838709677 25.806451613 7.500000000 +154.838709677 29.032258065 7.500000000 +154.838709677 32.258064516 7.500000000 +154.838709677 35.483870968 7.389705882 +154.838709677 38.709677419 6.875000000 +154.838709677 41.935483871 6.331521739 +154.838709677 45.161290323 5.604838710 +154.838709677 48.387096774 5.604838710 +154.838709677 51.612903226 5.604838710 +154.838709677 54.838709677 5.604838710 +154.838709677 58.064516129 4.891304348 +154.838709677 61.290322581 4.347826087 +154.838709677 64.516129032 3.382352941 +154.838709677 67.741935484 3.104838710 +154.838709677 70.967741935 3.104838710 +154.838709677 74.193548387 3.104838710 +154.838709677 77.419354839 3.104838710 +154.838709677 80.645161290 3.104838710 +154.838709677 83.870967742 3.104838710 +154.838709677 87.096774194 3.104838710 +154.838709677 90.322580645 3.104838710 +154.838709677 93.548387097 3.104838710 +154.838709677 96.774193548 3.104838710 +154.838709677 100.000000000 3.104838710 +164.516129032 0.000000000 7.500000000 +164.516129032 3.225806452 7.500000000 +164.516129032 6.451612903 7.500000000 +164.516129032 9.677419355 7.500000000 +164.516129032 12.903225806 7.500000000 +164.516129032 16.129032258 7.500000000 +164.516129032 19.354838710 7.500000000 +164.516129032 22.580645161 7.500000000 +164.516129032 25.806451613 7.500000000 +164.516129032 29.032258065 7.500000000 +164.516129032 32.258064516 7.500000000 +164.516129032 35.483870968 7.389705882 +164.516129032 38.709677419 7.057291667 +164.516129032 41.935483871 7.057291667 +164.516129032 45.161290323 6.814516129 +164.516129032 48.387096774 6.814516129 +164.516129032 51.612903226 6.814516129 +164.516129032 54.838709677 6.814516129 +164.516129032 58.064516129 5.677083333 +164.516129032 61.290322581 5.156250000 +164.516129032 64.516129032 4.485294118 +164.516129032 67.741935484 4.314516129 +164.516129032 70.967741935 4.314516129 +164.516129032 74.193548387 4.314516129 +164.516129032 77.419354839 4.314516129 +164.516129032 80.645161290 4.314516129 +164.516129032 83.870967742 4.314516129 +164.516129032 87.096774194 4.314516129 +164.516129032 90.322580645 4.314516129 +164.516129032 93.548387097 4.314516129 +164.516129032 96.774193548 4.314516129 +164.516129032 100.000000000 4.314516129 +174.193548387 0.000000000 7.500000000 +174.193548387 3.225806452 7.500000000 +174.193548387 6.451612903 7.500000000 +174.193548387 9.677419355 7.500000000 +174.193548387 12.903225806 7.500000000 +174.193548387 16.129032258 7.500000000 +174.193548387 19.354838710 7.500000000 +174.193548387 22.580645161 7.500000000 +174.193548387 25.806451613 7.500000000 +174.193548387 29.032258065 7.500000000 +174.193548387 32.258064516 7.500000000 +174.193548387 35.483870968 7.500000000 +174.193548387 38.709677419 7.500000000 +174.193548387 41.935483871 7.500000000 +174.193548387 45.161290323 7.500000000 +174.193548387 48.387096774 7.500000000 +174.193548387 51.612903226 7.500000000 +174.193548387 54.838709677 7.500000000 +174.193548387 58.064516129 6.733870968 +174.193548387 61.290322581 5.927419355 +174.193548387 64.516129032 5.120967742 +174.193548387 67.741935484 5.000000000 +174.193548387 70.967741935 5.000000000 +174.193548387 74.193548387 5.000000000 +174.193548387 77.419354839 5.000000000 +174.193548387 80.645161290 5.000000000 +174.193548387 83.870967742 5.000000000 +174.193548387 87.096774194 5.000000000 +174.193548387 90.322580645 5.000000000 +174.193548387 93.548387097 5.000000000 +174.193548387 96.774193548 5.000000000 +174.193548387 100.000000000 5.000000000 +183.870967742 0.000000000 7.983870968 +183.870967742 3.225806452 7.983870968 +183.870967742 6.451612903 7.983870968 +183.870967742 9.677419355 7.983870968 +183.870967742 12.903225806 7.983870968 +183.870967742 16.129032258 7.983870968 +183.870967742 19.354838710 7.983870968 +183.870967742 22.580645161 7.983870968 +183.870967742 25.806451613 7.983870968 +183.870967742 29.032258065 7.983870968 +183.870967742 32.258064516 7.983870968 +183.870967742 35.483870968 7.941176471 +183.870967742 38.709677419 7.848837209 +183.870967742 41.935483871 7.848837209 +183.870967742 45.161290323 7.500000000 +183.870967742 48.387096774 7.500000000 +183.870967742 51.612903226 7.500000000 +183.870967742 54.838709677 7.500000000 +183.870967742 58.064516129 6.598837209 +183.870967742 61.290322581 6.017441860 +183.870967742 64.516129032 5.220588235 +183.870967742 67.741935484 5.000000000 +183.870967742 70.967741935 5.000000000 +183.870967742 74.193548387 5.000000000 +183.870967742 77.419354839 5.000000000 +183.870967742 80.645161290 5.000000000 +183.870967742 83.870967742 5.000000000 +183.870967742 87.096774194 5.000000000 +183.870967742 90.322580645 5.000000000 +183.870967742 93.548387097 5.000000000 +183.870967742 96.774193548 5.000000000 +183.870967742 100.000000000 5.000000000 +193.548387097 0.000000000 9.193548387 +193.548387097 3.225806452 9.193548387 +193.548387097 6.451612903 9.193548387 +193.548387097 9.677419355 9.193548387 +193.548387097 12.903225806 9.193548387 +193.548387097 16.129032258 9.193548387 +193.548387097 19.354838710 9.193548387 +193.548387097 22.580645161 9.193548387 +193.548387097 25.806451613 9.193548387 +193.548387097 29.032258065 9.193548387 +193.548387097 32.258064516 9.193548387 +193.548387097 35.483870968 9.044117647 +193.548387097 38.709677419 8.455882353 +193.548387097 41.935483871 7.975000000 +193.548387097 45.161290323 7.500000000 +193.548387097 48.387096774 7.500000000 +193.548387097 51.612903226 7.500000000 +193.548387097 54.838709677 7.500000000 +193.548387097 58.064516129 6.550000000 +193.548387097 61.290322581 6.053921569 +193.548387097 64.516129032 5.220588235 +193.548387097 67.741935484 5.000000000 +193.548387097 70.967741935 5.000000000 +193.548387097 74.193548387 5.000000000 +193.548387097 77.419354839 5.000000000 +193.548387097 80.645161290 5.000000000 +193.548387097 83.870967742 5.000000000 +193.548387097 87.096774194 5.000000000 +193.548387097 90.322580645 5.000000000 +193.548387097 93.548387097 5.000000000 +193.548387097 96.774193548 5.000000000 +193.548387097 100.000000000 5.000000000 +203.225806452 0.000000000 10.000000000 +203.225806452 3.225806452 10.000000000 +203.225806452 6.451612903 10.000000000 +203.225806452 9.677419355 10.000000000 +203.225806452 12.903225806 10.000000000 +203.225806452 16.129032258 10.000000000 +203.225806452 19.354838710 10.000000000 +203.225806452 22.580645161 10.000000000 +203.225806452 25.806451613 10.000000000 +203.225806452 29.032258065 10.000000000 +203.225806452 32.258064516 10.000000000 +203.225806452 35.483870968 9.879032258 +203.225806452 38.709677419 9.072580645 +203.225806452 41.935483871 8.266129032 +203.225806452 45.161290323 7.500000000 +203.225806452 48.387096774 7.500000000 +203.225806452 51.612903226 7.500000000 +203.225806452 54.838709677 7.500000000 +203.225806452 58.064516129 6.733870968 +203.225806452 61.290322581 5.927419355 +203.225806452 64.516129032 5.120967742 +203.225806452 67.741935484 5.000000000 +203.225806452 70.967741935 5.000000000 +203.225806452 74.193548387 5.000000000 +203.225806452 77.419354839 5.000000000 +203.225806452 80.645161290 5.000000000 +203.225806452 83.870967742 5.000000000 +203.225806452 87.096774194 5.000000000 +203.225806452 90.322580645 5.000000000 +203.225806452 93.548387097 5.000000000 +203.225806452 96.774193548 5.000000000 +203.225806452 100.000000000 5.000000000 +212.903225806 0.000000000 10.000000000 +212.903225806 3.225806452 10.000000000 +212.903225806 6.451612903 10.000000000 +212.903225806 9.677419355 10.000000000 +212.903225806 12.903225806 10.000000000 +212.903225806 16.129032258 10.000000000 +212.903225806 19.354838710 10.000000000 +212.903225806 22.580645161 10.000000000 +212.903225806 25.806451613 10.000000000 +212.903225806 29.032258065 10.000000000 +212.903225806 32.258064516 10.000000000 +212.903225806 35.483870968 9.879032258 +212.903225806 38.709677419 9.072580645 +212.903225806 41.935483871 8.266129032 +212.903225806 45.161290323 7.500000000 +212.903225806 48.387096774 7.500000000 +212.903225806 51.612903226 7.500000000 +212.903225806 54.838709677 7.500000000 +212.903225806 58.064516129 6.733870968 +212.903225806 61.290322581 5.927419355 +212.903225806 64.516129032 5.120967742 +212.903225806 67.741935484 5.000000000 +212.903225806 70.967741935 5.000000000 +212.903225806 74.193548387 5.000000000 +212.903225806 77.419354839 5.000000000 +212.903225806 80.645161290 5.000000000 +212.903225806 83.870967742 5.000000000 +212.903225806 87.096774194 5.000000000 +212.903225806 90.322580645 5.000000000 +212.903225806 93.548387097 5.000000000 +212.903225806 96.774193548 5.000000000 +212.903225806 100.000000000 5.000000000 +222.580645161 0.000000000 10.000000000 +222.580645161 3.225806452 10.000000000 +222.580645161 6.451612903 10.000000000 +222.580645161 9.677419355 10.000000000 +222.580645161 12.903225806 10.000000000 +222.580645161 16.129032258 10.000000000 +222.580645161 19.354838710 10.000000000 +222.580645161 22.580645161 10.000000000 +222.580645161 25.806451613 10.000000000 +222.580645161 29.032258065 10.000000000 +222.580645161 32.258064516 10.000000000 +222.580645161 35.483870968 9.879032258 +222.580645161 38.709677419 9.072580645 +222.580645161 41.935483871 8.266129032 +222.580645161 45.161290323 7.500000000 +222.580645161 48.387096774 7.500000000 +222.580645161 51.612903226 7.500000000 +222.580645161 54.838709677 7.500000000 +222.580645161 58.064516129 6.733870968 +222.580645161 61.290322581 5.927419355 +222.580645161 64.516129032 5.120967742 +222.580645161 67.741935484 5.000000000 +222.580645161 70.967741935 5.000000000 +222.580645161 74.193548387 5.000000000 +222.580645161 77.419354839 5.000000000 +222.580645161 80.645161290 5.000000000 +222.580645161 83.870967742 5.000000000 +222.580645161 87.096774194 5.000000000 +222.580645161 90.322580645 5.000000000 +222.580645161 93.548387097 5.000000000 +222.580645161 96.774193548 5.000000000 +222.580645161 100.000000000 5.000000000 +232.258064516 0.000000000 10.000000000 +232.258064516 3.225806452 10.000000000 +232.258064516 6.451612903 10.000000000 +232.258064516 9.677419355 10.000000000 +232.258064516 12.903225806 10.000000000 +232.258064516 16.129032258 10.000000000 +232.258064516 19.354838710 10.000000000 +232.258064516 22.580645161 10.000000000 +232.258064516 25.806451613 10.000000000 +232.258064516 29.032258065 10.000000000 +232.258064516 32.258064516 10.000000000 +232.258064516 35.483870968 9.879032258 +232.258064516 38.709677419 9.072580645 +232.258064516 41.935483871 8.266129032 +232.258064516 45.161290323 7.500000000 +232.258064516 48.387096774 7.500000000 +232.258064516 51.612903226 7.500000000 +232.258064516 54.838709677 7.500000000 +232.258064516 58.064516129 6.733870968 +232.258064516 61.290322581 5.927419355 +232.258064516 64.516129032 5.120967742 +232.258064516 67.741935484 5.000000000 +232.258064516 70.967741935 5.000000000 +232.258064516 74.193548387 5.000000000 +232.258064516 77.419354839 5.000000000 +232.258064516 80.645161290 5.000000000 +232.258064516 83.870967742 5.000000000 +232.258064516 87.096774194 5.000000000 +232.258064516 90.322580645 5.000000000 +232.258064516 93.548387097 5.000000000 +232.258064516 96.774193548 5.000000000 +232.258064516 100.000000000 5.000000000 +241.935483871 0.000000000 10.000000000 +241.935483871 3.225806452 10.000000000 +241.935483871 6.451612903 10.000000000 +241.935483871 9.677419355 10.000000000 +241.935483871 12.903225806 10.000000000 +241.935483871 16.129032258 10.000000000 +241.935483871 19.354838710 10.000000000 +241.935483871 22.580645161 10.000000000 +241.935483871 25.806451613 10.000000000 +241.935483871 29.032258065 10.000000000 +241.935483871 32.258064516 10.000000000 +241.935483871 35.483870968 9.879032258 +241.935483871 38.709677419 9.072580645 +241.935483871 41.935483871 8.266129032 +241.935483871 45.161290323 7.500000000 +241.935483871 48.387096774 7.500000000 +241.935483871 51.612903226 7.500000000 +241.935483871 54.838709677 7.500000000 +241.935483871 58.064516129 6.733870968 +241.935483871 61.290322581 5.927419355 +241.935483871 64.516129032 5.120967742 +241.935483871 67.741935484 5.000000000 +241.935483871 70.967741935 5.000000000 +241.935483871 74.193548387 5.000000000 +241.935483871 77.419354839 5.000000000 +241.935483871 80.645161290 5.000000000 +241.935483871 83.870967742 5.000000000 +241.935483871 87.096774194 5.000000000 +241.935483871 90.322580645 5.000000000 +241.935483871 93.548387097 5.000000000 +241.935483871 96.774193548 5.000000000 +241.935483871 100.000000000 5.000000000 +251.612903226 0.000000000 10.000000000 +251.612903226 3.225806452 10.000000000 +251.612903226 6.451612903 10.000000000 +251.612903226 9.677419355 10.000000000 +251.612903226 12.903225806 10.000000000 +251.612903226 16.129032258 10.000000000 +251.612903226 19.354838710 10.000000000 +251.612903226 22.580645161 10.000000000 +251.612903226 25.806451613 10.000000000 +251.612903226 29.032258065 10.000000000 +251.612903226 32.258064516 10.000000000 +251.612903226 35.483870968 9.879032258 +251.612903226 38.709677419 9.072580645 +251.612903226 41.935483871 8.266129032 +251.612903226 45.161290323 7.500000000 +251.612903226 48.387096774 7.500000000 +251.612903226 51.612903226 7.500000000 +251.612903226 54.838709677 7.500000000 +251.612903226 58.064516129 6.733870968 +251.612903226 61.290322581 5.927419355 +251.612903226 64.516129032 5.120967742 +251.612903226 67.741935484 5.000000000 +251.612903226 70.967741935 5.000000000 +251.612903226 74.193548387 5.000000000 +251.612903226 77.419354839 5.000000000 +251.612903226 80.645161290 5.000000000 +251.612903226 83.870967742 5.000000000 +251.612903226 87.096774194 5.000000000 +251.612903226 90.322580645 5.000000000 +251.612903226 93.548387097 5.000000000 +251.612903226 96.774193548 5.000000000 +251.612903226 100.000000000 5.000000000 +261.290322581 0.000000000 10.000000000 +261.290322581 3.225806452 10.000000000 +261.290322581 6.451612903 10.000000000 +261.290322581 9.677419355 10.000000000 +261.290322581 12.903225806 10.000000000 +261.290322581 16.129032258 10.000000000 +261.290322581 19.354838710 10.000000000 +261.290322581 22.580645161 10.000000000 +261.290322581 25.806451613 10.000000000 +261.290322581 29.032258065 10.000000000 +261.290322581 32.258064516 10.000000000 +261.290322581 35.483870968 9.879032258 +261.290322581 38.709677419 9.072580645 +261.290322581 41.935483871 8.266129032 +261.290322581 45.161290323 7.500000000 +261.290322581 48.387096774 7.500000000 +261.290322581 51.612903226 7.500000000 +261.290322581 54.838709677 7.500000000 +261.290322581 58.064516129 6.733870968 +261.290322581 61.290322581 5.927419355 +261.290322581 64.516129032 5.120967742 +261.290322581 67.741935484 5.000000000 +261.290322581 70.967741935 5.000000000 +261.290322581 74.193548387 5.000000000 +261.290322581 77.419354839 5.000000000 +261.290322581 80.645161290 5.000000000 +261.290322581 83.870967742 5.000000000 +261.290322581 87.096774194 5.000000000 +261.290322581 90.322580645 5.000000000 +261.290322581 93.548387097 5.000000000 +261.290322581 96.774193548 5.000000000 +261.290322581 100.000000000 5.000000000 +270.967741935 0.000000000 10.000000000 +270.967741935 3.225806452 10.000000000 +270.967741935 6.451612903 10.000000000 +270.967741935 9.677419355 10.000000000 +270.967741935 12.903225806 10.000000000 +270.967741935 16.129032258 10.000000000 +270.967741935 19.354838710 10.000000000 +270.967741935 22.580645161 10.000000000 +270.967741935 25.806451613 10.000000000 +270.967741935 29.032258065 10.000000000 +270.967741935 32.258064516 10.000000000 +270.967741935 35.483870968 9.879032258 +270.967741935 38.709677419 9.072580645 +270.967741935 41.935483871 8.266129032 +270.967741935 45.161290323 7.500000000 +270.967741935 48.387096774 7.500000000 +270.967741935 51.612903226 7.500000000 +270.967741935 54.838709677 7.500000000 +270.967741935 58.064516129 6.733870968 +270.967741935 61.290322581 5.927419355 +270.967741935 64.516129032 5.120967742 +270.967741935 67.741935484 5.000000000 +270.967741935 70.967741935 5.000000000 +270.967741935 74.193548387 5.000000000 +270.967741935 77.419354839 5.000000000 +270.967741935 80.645161290 5.000000000 +270.967741935 83.870967742 5.000000000 +270.967741935 87.096774194 5.000000000 +270.967741935 90.322580645 5.000000000 +270.967741935 93.548387097 5.000000000 +270.967741935 96.774193548 5.000000000 +270.967741935 100.000000000 5.000000000 +280.645161290 0.000000000 10.000000000 +280.645161290 3.225806452 10.000000000 +280.645161290 6.451612903 10.000000000 +280.645161290 9.677419355 10.000000000 +280.645161290 12.903225806 10.000000000 +280.645161290 16.129032258 10.000000000 +280.645161290 19.354838710 10.000000000 +280.645161290 22.580645161 10.000000000 +280.645161290 25.806451613 10.000000000 +280.645161290 29.032258065 10.000000000 +280.645161290 32.258064516 10.000000000 +280.645161290 35.483870968 9.879032258 +280.645161290 38.709677419 9.072580645 +280.645161290 41.935483871 8.266129032 +280.645161290 45.161290323 7.500000000 +280.645161290 48.387096774 7.500000000 +280.645161290 51.612903226 7.500000000 +280.645161290 54.838709677 7.500000000 +280.645161290 58.064516129 6.733870968 +280.645161290 61.290322581 5.927419355 +280.645161290 64.516129032 5.120967742 +280.645161290 67.741935484 5.000000000 +280.645161290 70.967741935 5.000000000 +280.645161290 74.193548387 5.000000000 +280.645161290 77.419354839 5.000000000 +280.645161290 80.645161290 5.000000000 +280.645161290 83.870967742 5.000000000 +280.645161290 87.096774194 5.000000000 +280.645161290 90.322580645 5.000000000 +280.645161290 93.548387097 5.000000000 +280.645161290 96.774193548 5.000000000 +280.645161290 100.000000000 5.000000000 +290.322580645 0.000000000 10.000000000 +290.322580645 3.225806452 10.000000000 +290.322580645 6.451612903 10.000000000 +290.322580645 9.677419355 10.000000000 +290.322580645 12.903225806 10.000000000 +290.322580645 16.129032258 10.000000000 +290.322580645 19.354838710 10.000000000 +290.322580645 22.580645161 10.000000000 +290.322580645 25.806451613 10.000000000 +290.322580645 29.032258065 10.000000000 +290.322580645 32.258064516 10.000000000 +290.322580645 35.483870968 9.879032258 +290.322580645 38.709677419 9.072580645 +290.322580645 41.935483871 8.266129032 +290.322580645 45.161290323 7.500000000 +290.322580645 48.387096774 7.500000000 +290.322580645 51.612903226 7.500000000 +290.322580645 54.838709677 7.500000000 +290.322580645 58.064516129 6.733870968 +290.322580645 61.290322581 5.927419355 +290.322580645 64.516129032 5.120967742 +290.322580645 67.741935484 5.000000000 +290.322580645 70.967741935 5.000000000 +290.322580645 74.193548387 5.000000000 +290.322580645 77.419354839 5.000000000 +290.322580645 80.645161290 5.000000000 +290.322580645 83.870967742 5.000000000 +290.322580645 87.096774194 5.000000000 +290.322580645 90.322580645 5.000000000 +290.322580645 93.548387097 5.000000000 +290.322580645 96.774193548 5.000000000 +290.322580645 100.000000000 5.000000000 +300.000000000 0.000000000 10.000000000 +300.000000000 3.225806452 10.000000000 +300.000000000 6.451612903 10.000000000 +300.000000000 9.677419355 10.000000000 +300.000000000 12.903225806 10.000000000 +300.000000000 16.129032258 10.000000000 +300.000000000 19.354838710 10.000000000 +300.000000000 22.580645161 10.000000000 +300.000000000 25.806451613 10.000000000 +300.000000000 29.032258065 10.000000000 +300.000000000 32.258064516 10.000000000 +300.000000000 35.483870968 9.879032258 +300.000000000 38.709677419 9.072580645 +300.000000000 41.935483871 8.266129032 +300.000000000 45.161290323 7.500000000 +300.000000000 48.387096774 7.500000000 +300.000000000 51.612903226 7.500000000 +300.000000000 54.838709677 7.500000000 +300.000000000 58.064516129 6.733870968 +300.000000000 61.290322581 5.927419355 +300.000000000 64.516129032 5.120967742 +300.000000000 67.741935484 5.000000000 +300.000000000 70.967741935 5.000000000 +300.000000000 74.193548387 5.000000000 +300.000000000 77.419354839 5.000000000 +300.000000000 80.645161290 5.000000000 +300.000000000 83.870967742 5.000000000 +300.000000000 87.096774194 5.000000000 +300.000000000 90.322580645 5.000000000 +300.000000000 93.548387097 5.000000000 +300.000000000 96.774193548 5.000000000 +300.000000000 100.000000000 5.000000000 diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.fll b/examples/takagi-sugeno/octave/heart_disease_risk.fll new file mode 100644 index 0000000..4ab822f --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.fll @@ -0,0 +1,51 @@ +Engine: heart_disease_risk +InputVariable: LDLLevel + enabled: true + range: 0.000 300.000 + lock-range: false + term: Low Trapezoid -1.000 0.000 90.000 110.000 + term: LowBorderline Trapezoid 90.000 110.000 120.000 140.000 + term: Borderline Trapezoid 120.000 140.000 150.000 170.000 + term: HighBorderline Trapezoid 150.000 170.000 180.000 200.000 + term: High Trapezoid 180.000 200.000 300.000 301.000 +InputVariable: HDLLevel + enabled: true + range: 0.000 100.000 + lock-range: false + term: LowHDL Trapezoid -1.000 0.000 35.000 45.000 + term: ModerateHDL Trapezoid 35.000 45.000 55.000 65.000 + term: HighHDL Trapezoid 55.000 65.000 100.000 101.000 +OutputVariable: HeartDiseaseRisk + enabled: true + range: 0.000 10.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: NoRisk Constant 0.000 + term: LowRisk Constant 2.500 + term: MediumRisk Constant 5.000 + term: HighRisk Constant 7.500 + term: ExtremeRisk Constant 10.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk + rule: if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk + rule: if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk + rule: if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk + rule: if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk + rule: if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk
\ No newline at end of file diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.java b/examples/takagi-sugeno/octave/heart_disease_risk.java new file mode 100644 index 0000000..febd1c7 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.java @@ -0,0 +1,90 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class heart_disease_risk{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("heart_disease_risk"); +engine.setDescription(""); + +InputVariable LDLLevel = new InputVariable(); +LDLLevel.setName("LDLLevel"); +LDLLevel.setDescription(""); +LDLLevel.setEnabled(true); +LDLLevel.setRange(0.000, 300.000); +LDLLevel.setLockValueInRange(false); +LDLLevel.addTerm(new Trapezoid("Low", -1.000, 0.000, 90.000, 110.000)); +LDLLevel.addTerm(new Trapezoid("LowBorderline", 90.000, 110.000, 120.000, 140.000)); +LDLLevel.addTerm(new Trapezoid("Borderline", 120.000, 140.000, 150.000, 170.000)); +LDLLevel.addTerm(new Trapezoid("HighBorderline", 150.000, 170.000, 180.000, 200.000)); +LDLLevel.addTerm(new Trapezoid("High", 180.000, 200.000, 300.000, 301.000)); +engine.addInputVariable(LDLLevel); + +InputVariable HDLLevel = new InputVariable(); +HDLLevel.setName("HDLLevel"); +HDLLevel.setDescription(""); +HDLLevel.setEnabled(true); +HDLLevel.setRange(0.000, 100.000); +HDLLevel.setLockValueInRange(false); +HDLLevel.addTerm(new Trapezoid("LowHDL", -1.000, 0.000, 35.000, 45.000)); +HDLLevel.addTerm(new Trapezoid("ModerateHDL", 35.000, 45.000, 55.000, 65.000)); +HDLLevel.addTerm(new Trapezoid("HighHDL", 55.000, 65.000, 100.000, 101.000)); +engine.addInputVariable(HDLLevel); + +OutputVariable HeartDiseaseRisk = new OutputVariable(); +HeartDiseaseRisk.setName("HeartDiseaseRisk"); +HeartDiseaseRisk.setDescription(""); +HeartDiseaseRisk.setEnabled(true); +HeartDiseaseRisk.setRange(0.000, 10.000); +HeartDiseaseRisk.setLockValueInRange(false); +HeartDiseaseRisk.setAggregation(null); +HeartDiseaseRisk.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +HeartDiseaseRisk.setDefaultValue(Double.NaN); +HeartDiseaseRisk.setLockPreviousValue(false); +HeartDiseaseRisk.addTerm(new Constant("NoRisk", 0.000)); +HeartDiseaseRisk.addTerm(new Constant("LowRisk", 2.500)); +HeartDiseaseRisk.addTerm(new Constant("MediumRisk", 5.000)); +HeartDiseaseRisk.addTerm(new Constant("HighRisk", 7.500)); +HeartDiseaseRisk.addTerm(new Constant("ExtremeRisk", 10.000)); +engine.addOutputVariable(HeartDiseaseRisk); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new Minimum()); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if LDLLevel is Low and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is Low and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is Low and HDLLevel is HighHDL then HeartDiseaseRisk is NoRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is LowBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is LowBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is LowBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is Borderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is Borderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is Borderline and HDLLevel is HighHDL then HeartDiseaseRisk is LowRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is HighBorderline and HDLLevel is LowHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is HighBorderline and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is HighBorderline and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is High and HDLLevel is LowHDL then HeartDiseaseRisk is ExtremeRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is High and HDLLevel is ModerateHDL then HeartDiseaseRisk is HighRisk", engine)); +ruleBlock.addRule(Rule.parse("if LDLLevel is High and HDLLevel is HighHDL then HeartDiseaseRisk is MediumRisk", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/takagi-sugeno/octave/heart_disease_risk.pdf b/examples/takagi-sugeno/octave/heart_disease_risk.pdf Binary files differnew file mode 100644 index 0000000..e712d54 --- /dev/null +++ b/examples/takagi-sugeno/octave/heart_disease_risk.pdf diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.R b/examples/takagi-sugeno/octave/linear_tip_calculator.R new file mode 100644 index 0000000..e6a7058 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.R @@ -0,0 +1,67 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "linear_tip_calculator" +engine.fll = "Engine: linear_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 10.000 20.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: TenPercent Linear 0.000 0.000 10.000 + term: FifteenPercent Linear 0.000 0.000 15.000 + term: TwentyPercent Linear 0.000 0.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is TenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is TwentyPercent" + +engine.fldFile = "linear_tip_calculator.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=Tip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=Tip), color="black") + + ggtitle("(FoodQuality, Service) = Tip") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=Tip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=Tip), color="black") + + ggtitle("(Service, FoodQuality) = Tip") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.cpp b/examples/takagi-sugeno/octave/linear_tip_calculator.cpp new file mode 100644 index 0000000..f0d4a43 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.cpp @@ -0,0 +1,62 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("linear_tip_calculator"); +engine->setDescription(""); + +InputVariable* FoodQuality = new InputVariable; +FoodQuality->setName("FoodQuality"); +FoodQuality->setDescription(""); +FoodQuality->setEnabled(true); +FoodQuality->setRange(1.000, 10.000); +FoodQuality->setLockValueInRange(false); +FoodQuality->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(FoodQuality); + +InputVariable* Service = new InputVariable; +Service->setName("Service"); +Service->setDescription(""); +Service->setEnabled(true); +Service->setRange(1.000, 10.000); +Service->setLockValueInRange(false); +Service->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(Service); + +OutputVariable* Tip = new OutputVariable; +Tip->setName("Tip"); +Tip->setDescription(""); +Tip->setEnabled(true); +Tip->setRange(10.000, 20.000); +Tip->setLockValueInRange(false); +Tip->setAggregation(fl::null); +Tip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +Tip->setDefaultValue(fl::nan); +Tip->setLockPreviousValue(false); +Tip->addTerm(Linear::create("TenPercent", engine, 0.000, 0.000, 10.000)); +Tip->addTerm(Linear::create("FifteenPercent", engine, 0.000, 0.000, 15.000)); +Tip->addTerm(Linear::create("TwentyPercent", engine, 0.000, 0.000, 20.000)); +engine->addOutputVariable(Tip); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new Minimum); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Bad then Tip is TenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Good then Tip is FifteenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Bad then Tip is FifteenPercent", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Good then Tip is TwentyPercent", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.fcl b/examples/takagi-sugeno/octave/linear_tip_calculator.fcl new file mode 100644 index 0000000..9b28c0e --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.fcl @@ -0,0 +1,43 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK linear_tip_calculator + +VAR_INPUT + FoodQuality: REAL; + Service: REAL; +END_VAR + +VAR_OUTPUT + Tip: REAL; +END_VAR + +FUZZIFY FoodQuality + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +FUZZIFY Service + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +DEFUZZIFY Tip + RANGE := (10.000 .. 20.000); + TERM TenPercent := Linear 0.000 0.000 10.000; + TERM FifteenPercent := Linear 0.000 0.000 15.000; + TERM TwentyPercent := Linear 0.000 0.000 20.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : MIN; + RULE 1 : if FoodQuality is Bad and Service is Bad then Tip is TenPercent + RULE 2 : if FoodQuality is Bad and Service is Good then Tip is FifteenPercent + RULE 3 : if FoodQuality is Good and Service is Bad then Tip is FifteenPercent + RULE 4 : if FoodQuality is Good and Service is Good then Tip is TwentyPercent +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.fis b/examples/takagi-sugeno/octave/linear_tip_calculator.fis new file mode 100644 index 0000000..58b4016 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.fis @@ -0,0 +1,42 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='linear_tip_calculator' +Type='sugeno' +Version=6.0 +NumInputs=2 +NumOutputs=1 +NumRules=4 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='FoodQuality' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Input2] +Name='Service' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Output1] +Name='Tip' +Range=[10.000 20.000] +NumMFs=3 +MF1='TenPercent':'linear',[0.000 0.000 10.000] +MF2='FifteenPercent':'linear',[0.000 0.000 15.000] +MF3='TwentyPercent':'linear',[0.000 0.000 20.000] + +[Rules] +1.000 1.000 , 1.000 (1.000) : 1 +1.000 2.000 , 2.000 (1.000) : 1 +2.000 1.000 , 2.000 (1.000) : 1 +2.000 2.000 , 3.000 (1.000) : 1 diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.fld b/examples/takagi-sugeno/octave/linear_tip_calculator.fld new file mode 100644 index 0000000..60f4542 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.fld @@ -0,0 +1,1025 @@ +FoodQuality Service Tip +1.000000000 1.000000000 10.000000000 +1.000000000 1.290322581 10.000000000 +1.000000000 1.580645161 10.000000000 +1.000000000 1.870967742 10.000000000 +1.000000000 2.161290323 10.000000000 +1.000000000 2.451612903 10.000000000 +1.000000000 2.741935484 10.000000000 +1.000000000 3.032258065 10.040322581 +1.000000000 3.322580645 10.403225806 +1.000000000 3.612903226 10.766129032 +1.000000000 3.903225806 11.129032258 +1.000000000 4.193548387 11.491935484 +1.000000000 4.483870968 11.854838710 +1.000000000 4.774193548 12.217741935 +1.000000000 5.064516129 12.580645161 +1.000000000 5.354838710 12.943548387 +1.000000000 5.645161290 13.306451613 +1.000000000 5.935483871 13.669354839 +1.000000000 6.225806452 14.032258065 +1.000000000 6.516129032 14.395161290 +1.000000000 6.806451613 14.758064516 +1.000000000 7.096774194 15.000000000 +1.000000000 7.387096774 15.000000000 +1.000000000 7.677419355 15.000000000 +1.000000000 7.967741935 15.000000000 +1.000000000 8.258064516 15.000000000 +1.000000000 8.548387097 15.000000000 +1.000000000 8.838709677 15.000000000 +1.000000000 9.129032258 15.000000000 +1.000000000 9.419354839 15.000000000 +1.000000000 9.709677419 15.000000000 +1.000000000 10.000000000 15.000000000 +1.290322581 1.000000000 10.000000000 +1.290322581 1.290322581 10.000000000 +1.290322581 1.580645161 10.000000000 +1.290322581 1.870967742 10.000000000 +1.290322581 2.161290323 10.000000000 +1.290322581 2.451612903 10.000000000 +1.290322581 2.741935484 10.000000000 +1.290322581 3.032258065 10.040322581 +1.290322581 3.322580645 10.403225806 +1.290322581 3.612903226 10.766129032 +1.290322581 3.903225806 11.129032258 +1.290322581 4.193548387 11.491935484 +1.290322581 4.483870968 11.854838710 +1.290322581 4.774193548 12.217741935 +1.290322581 5.064516129 12.580645161 +1.290322581 5.354838710 12.943548387 +1.290322581 5.645161290 13.306451613 +1.290322581 5.935483871 13.669354839 +1.290322581 6.225806452 14.032258065 +1.290322581 6.516129032 14.395161290 +1.290322581 6.806451613 14.758064516 +1.290322581 7.096774194 15.000000000 +1.290322581 7.387096774 15.000000000 +1.290322581 7.677419355 15.000000000 +1.290322581 7.967741935 15.000000000 +1.290322581 8.258064516 15.000000000 +1.290322581 8.548387097 15.000000000 +1.290322581 8.838709677 15.000000000 +1.290322581 9.129032258 15.000000000 +1.290322581 9.419354839 15.000000000 +1.290322581 9.709677419 15.000000000 +1.290322581 10.000000000 15.000000000 +1.580645161 1.000000000 10.000000000 +1.580645161 1.290322581 10.000000000 +1.580645161 1.580645161 10.000000000 +1.580645161 1.870967742 10.000000000 +1.580645161 2.161290323 10.000000000 +1.580645161 2.451612903 10.000000000 +1.580645161 2.741935484 10.000000000 +1.580645161 3.032258065 10.040322581 +1.580645161 3.322580645 10.403225806 +1.580645161 3.612903226 10.766129032 +1.580645161 3.903225806 11.129032258 +1.580645161 4.193548387 11.491935484 +1.580645161 4.483870968 11.854838710 +1.580645161 4.774193548 12.217741935 +1.580645161 5.064516129 12.580645161 +1.580645161 5.354838710 12.943548387 +1.580645161 5.645161290 13.306451613 +1.580645161 5.935483871 13.669354839 +1.580645161 6.225806452 14.032258065 +1.580645161 6.516129032 14.395161290 +1.580645161 6.806451613 14.758064516 +1.580645161 7.096774194 15.000000000 +1.580645161 7.387096774 15.000000000 +1.580645161 7.677419355 15.000000000 +1.580645161 7.967741935 15.000000000 +1.580645161 8.258064516 15.000000000 +1.580645161 8.548387097 15.000000000 +1.580645161 8.838709677 15.000000000 +1.580645161 9.129032258 15.000000000 +1.580645161 9.419354839 15.000000000 +1.580645161 9.709677419 15.000000000 +1.580645161 10.000000000 15.000000000 +1.870967742 1.000000000 10.000000000 +1.870967742 1.290322581 10.000000000 +1.870967742 1.580645161 10.000000000 +1.870967742 1.870967742 10.000000000 +1.870967742 2.161290323 10.000000000 +1.870967742 2.451612903 10.000000000 +1.870967742 2.741935484 10.000000000 +1.870967742 3.032258065 10.040322581 +1.870967742 3.322580645 10.403225806 +1.870967742 3.612903226 10.766129032 +1.870967742 3.903225806 11.129032258 +1.870967742 4.193548387 11.491935484 +1.870967742 4.483870968 11.854838710 +1.870967742 4.774193548 12.217741935 +1.870967742 5.064516129 12.580645161 +1.870967742 5.354838710 12.943548387 +1.870967742 5.645161290 13.306451613 +1.870967742 5.935483871 13.669354839 +1.870967742 6.225806452 14.032258065 +1.870967742 6.516129032 14.395161290 +1.870967742 6.806451613 14.758064516 +1.870967742 7.096774194 15.000000000 +1.870967742 7.387096774 15.000000000 +1.870967742 7.677419355 15.000000000 +1.870967742 7.967741935 15.000000000 +1.870967742 8.258064516 15.000000000 +1.870967742 8.548387097 15.000000000 +1.870967742 8.838709677 15.000000000 +1.870967742 9.129032258 15.000000000 +1.870967742 9.419354839 15.000000000 +1.870967742 9.709677419 15.000000000 +1.870967742 10.000000000 15.000000000 +2.161290323 1.000000000 10.000000000 +2.161290323 1.290322581 10.000000000 +2.161290323 1.580645161 10.000000000 +2.161290323 1.870967742 10.000000000 +2.161290323 2.161290323 10.000000000 +2.161290323 2.451612903 10.000000000 +2.161290323 2.741935484 10.000000000 +2.161290323 3.032258065 10.040322581 +2.161290323 3.322580645 10.403225806 +2.161290323 3.612903226 10.766129032 +2.161290323 3.903225806 11.129032258 +2.161290323 4.193548387 11.491935484 +2.161290323 4.483870968 11.854838710 +2.161290323 4.774193548 12.217741935 +2.161290323 5.064516129 12.580645161 +2.161290323 5.354838710 12.943548387 +2.161290323 5.645161290 13.306451613 +2.161290323 5.935483871 13.669354839 +2.161290323 6.225806452 14.032258065 +2.161290323 6.516129032 14.395161290 +2.161290323 6.806451613 14.758064516 +2.161290323 7.096774194 15.000000000 +2.161290323 7.387096774 15.000000000 +2.161290323 7.677419355 15.000000000 +2.161290323 7.967741935 15.000000000 +2.161290323 8.258064516 15.000000000 +2.161290323 8.548387097 15.000000000 +2.161290323 8.838709677 15.000000000 +2.161290323 9.129032258 15.000000000 +2.161290323 9.419354839 15.000000000 +2.161290323 9.709677419 15.000000000 +2.161290323 10.000000000 15.000000000 +2.451612903 1.000000000 10.000000000 +2.451612903 1.290322581 10.000000000 +2.451612903 1.580645161 10.000000000 +2.451612903 1.870967742 10.000000000 +2.451612903 2.161290323 10.000000000 +2.451612903 2.451612903 10.000000000 +2.451612903 2.741935484 10.000000000 +2.451612903 3.032258065 10.040322581 +2.451612903 3.322580645 10.403225806 +2.451612903 3.612903226 10.766129032 +2.451612903 3.903225806 11.129032258 +2.451612903 4.193548387 11.491935484 +2.451612903 4.483870968 11.854838710 +2.451612903 4.774193548 12.217741935 +2.451612903 5.064516129 12.580645161 +2.451612903 5.354838710 12.943548387 +2.451612903 5.645161290 13.306451613 +2.451612903 5.935483871 13.669354839 +2.451612903 6.225806452 14.032258065 +2.451612903 6.516129032 14.395161290 +2.451612903 6.806451613 14.758064516 +2.451612903 7.096774194 15.000000000 +2.451612903 7.387096774 15.000000000 +2.451612903 7.677419355 15.000000000 +2.451612903 7.967741935 15.000000000 +2.451612903 8.258064516 15.000000000 +2.451612903 8.548387097 15.000000000 +2.451612903 8.838709677 15.000000000 +2.451612903 9.129032258 15.000000000 +2.451612903 9.419354839 15.000000000 +2.451612903 9.709677419 15.000000000 +2.451612903 10.000000000 15.000000000 +2.741935484 1.000000000 10.000000000 +2.741935484 1.290322581 10.000000000 +2.741935484 1.580645161 10.000000000 +2.741935484 1.870967742 10.000000000 +2.741935484 2.161290323 10.000000000 +2.741935484 2.451612903 10.000000000 +2.741935484 2.741935484 10.000000000 +2.741935484 3.032258065 10.040322581 +2.741935484 3.322580645 10.403225806 +2.741935484 3.612903226 10.766129032 +2.741935484 3.903225806 11.129032258 +2.741935484 4.193548387 11.491935484 +2.741935484 4.483870968 11.854838710 +2.741935484 4.774193548 12.217741935 +2.741935484 5.064516129 12.580645161 +2.741935484 5.354838710 12.943548387 +2.741935484 5.645161290 13.306451613 +2.741935484 5.935483871 13.669354839 +2.741935484 6.225806452 14.032258065 +2.741935484 6.516129032 14.395161290 +2.741935484 6.806451613 14.758064516 +2.741935484 7.096774194 15.000000000 +2.741935484 7.387096774 15.000000000 +2.741935484 7.677419355 15.000000000 +2.741935484 7.967741935 15.000000000 +2.741935484 8.258064516 15.000000000 +2.741935484 8.548387097 15.000000000 +2.741935484 8.838709677 15.000000000 +2.741935484 9.129032258 15.000000000 +2.741935484 9.419354839 15.000000000 +2.741935484 9.709677419 15.000000000 +2.741935484 10.000000000 15.000000000 +3.032258065 1.000000000 10.040322581 +3.032258065 1.290322581 10.040322581 +3.032258065 1.580645161 10.040322581 +3.032258065 1.870967742 10.040322581 +3.032258065 2.161290323 10.040322581 +3.032258065 2.451612903 10.040322581 +3.032258065 2.741935484 10.040322581 +3.032258065 3.032258065 10.158730159 +3.032258065 3.322580645 10.515873016 +3.032258065 3.612903226 10.873015873 +3.032258065 3.903225806 11.230158730 +3.032258065 4.193548387 11.587301587 +3.032258065 4.483870968 11.944444444 +3.032258065 4.774193548 12.301587302 +3.032258065 5.064516129 12.658730159 +3.032258065 5.354838710 13.015873016 +3.032258065 5.645161290 13.373015873 +3.032258065 5.935483871 13.730158730 +3.032258065 6.225806452 14.087301587 +3.032258065 6.516129032 14.444444444 +3.032258065 6.806451613 14.801587302 +3.032258065 7.096774194 15.040322581 +3.032258065 7.387096774 15.040322581 +3.032258065 7.677419355 15.040322581 +3.032258065 7.967741935 15.040322581 +3.032258065 8.258064516 15.040322581 +3.032258065 8.548387097 15.040322581 +3.032258065 8.838709677 15.040322581 +3.032258065 9.129032258 15.040322581 +3.032258065 9.419354839 15.040322581 +3.032258065 9.709677419 15.040322581 +3.032258065 10.000000000 15.040322581 +3.322580645 1.000000000 10.403225806 +3.322580645 1.290322581 10.403225806 +3.322580645 1.580645161 10.403225806 +3.322580645 1.870967742 10.403225806 +3.322580645 2.161290323 10.403225806 +3.322580645 2.451612903 10.403225806 +3.322580645 2.741935484 10.403225806 +3.322580645 3.032258065 10.515873016 +3.322580645 3.322580645 11.388888889 +3.322580645 3.612903226 11.701388889 +3.322580645 3.903225806 12.013888889 +3.322580645 4.193548387 12.326388889 +3.322580645 4.483870968 12.638888889 +3.322580645 4.774193548 12.951388889 +3.322580645 5.064516129 13.263888889 +3.322580645 5.354838710 13.576388889 +3.322580645 5.645161290 13.888888889 +3.322580645 5.935483871 14.201388889 +3.322580645 6.225806452 14.513888889 +3.322580645 6.516129032 14.826388889 +3.322580645 6.806451613 15.147058824 +3.322580645 7.096774194 15.403225806 +3.322580645 7.387096774 15.403225806 +3.322580645 7.677419355 15.403225806 +3.322580645 7.967741935 15.403225806 +3.322580645 8.258064516 15.403225806 +3.322580645 8.548387097 15.403225806 +3.322580645 8.838709677 15.403225806 +3.322580645 9.129032258 15.403225806 +3.322580645 9.419354839 15.403225806 +3.322580645 9.709677419 15.403225806 +3.322580645 10.000000000 15.403225806 +3.612903226 1.000000000 10.766129032 +3.612903226 1.290322581 10.766129032 +3.612903226 1.580645161 10.766129032 +3.612903226 1.870967742 10.766129032 +3.612903226 2.161290323 10.766129032 +3.612903226 2.451612903 10.766129032 +3.612903226 2.741935484 10.766129032 +3.612903226 3.032258065 10.873015873 +3.612903226 3.322580645 11.701388889 +3.612903226 3.612903226 12.345679012 +3.612903226 3.903225806 12.623456790 +3.612903226 4.193548387 12.901234568 +3.612903226 4.483870968 13.179012346 +3.612903226 4.774193548 13.456790123 +3.612903226 5.064516129 13.734567901 +3.612903226 5.354838710 14.012345679 +3.612903226 5.645161290 14.290123457 +3.612903226 5.935483871 14.567901235 +3.612903226 6.225806452 14.845679012 +3.612903226 6.516129032 15.129870130 +3.612903226 6.806451613 15.477941176 +3.612903226 7.096774194 15.766129032 +3.612903226 7.387096774 15.766129032 +3.612903226 7.677419355 15.766129032 +3.612903226 7.967741935 15.766129032 +3.612903226 8.258064516 15.766129032 +3.612903226 8.548387097 15.766129032 +3.612903226 8.838709677 15.766129032 +3.612903226 9.129032258 15.766129032 +3.612903226 9.419354839 15.766129032 +3.612903226 9.709677419 15.766129032 +3.612903226 10.000000000 15.766129032 +3.903225806 1.000000000 11.129032258 +3.903225806 1.290322581 11.129032258 +3.903225806 1.580645161 11.129032258 +3.903225806 1.870967742 11.129032258 +3.903225806 2.161290323 11.129032258 +3.903225806 2.451612903 11.129032258 +3.903225806 2.741935484 11.129032258 +3.903225806 3.032258065 11.230158730 +3.903225806 3.322580645 12.013888889 +3.903225806 3.612903226 12.623456790 +3.903225806 3.903225806 13.111111111 +3.903225806 4.193548387 13.361111111 +3.903225806 4.483870968 13.611111111 +3.903225806 4.774193548 13.861111111 +3.903225806 5.064516129 14.111111111 +3.903225806 5.354838710 14.361111111 +3.903225806 5.645161290 14.611111111 +3.903225806 5.935483871 14.861111111 +3.903225806 6.225806452 15.116279070 +3.903225806 6.516129032 15.422077922 +3.903225806 6.806451613 15.808823529 +3.903225806 7.096774194 16.129032258 +3.903225806 7.387096774 16.129032258 +3.903225806 7.677419355 16.129032258 +3.903225806 7.967741935 16.129032258 +3.903225806 8.258064516 16.129032258 +3.903225806 8.548387097 16.129032258 +3.903225806 8.838709677 16.129032258 +3.903225806 9.129032258 16.129032258 +3.903225806 9.419354839 16.129032258 +3.903225806 9.709677419 16.129032258 +3.903225806 10.000000000 16.129032258 +4.193548387 1.000000000 11.491935484 +4.193548387 1.290322581 11.491935484 +4.193548387 1.580645161 11.491935484 +4.193548387 1.870967742 11.491935484 +4.193548387 2.161290323 11.491935484 +4.193548387 2.451612903 11.491935484 +4.193548387 2.741935484 11.491935484 +4.193548387 3.032258065 11.587301587 +4.193548387 3.322580645 12.326388889 +4.193548387 3.612903226 12.901234568 +4.193548387 3.903225806 13.361111111 +4.193548387 4.193548387 13.737373737 +4.193548387 4.483870968 13.964646465 +4.193548387 4.774193548 14.191919192 +4.193548387 5.064516129 14.419191919 +4.193548387 5.354838710 14.646464646 +4.193548387 5.645161290 14.873737374 +4.193548387 5.935483871 15.105263158 +4.193548387 6.225806452 15.377906977 +4.193548387 6.516129032 15.714285714 +4.193548387 6.806451613 16.139705882 +4.193548387 7.096774194 16.491935484 +4.193548387 7.387096774 16.491935484 +4.193548387 7.677419355 16.491935484 +4.193548387 7.967741935 16.491935484 +4.193548387 8.258064516 16.491935484 +4.193548387 8.548387097 16.491935484 +4.193548387 8.838709677 16.491935484 +4.193548387 9.129032258 16.491935484 +4.193548387 9.419354839 16.491935484 +4.193548387 9.709677419 16.491935484 +4.193548387 10.000000000 16.491935484 +4.483870968 1.000000000 11.854838710 +4.483870968 1.290322581 11.854838710 +4.483870968 1.580645161 11.854838710 +4.483870968 1.870967742 11.854838710 +4.483870968 2.161290323 11.854838710 +4.483870968 2.451612903 11.854838710 +4.483870968 2.741935484 11.854838710 +4.483870968 3.032258065 11.944444444 +4.483870968 3.322580645 12.638888889 +4.483870968 3.612903226 13.179012346 +4.483870968 3.903225806 13.611111111 +4.483870968 4.193548387 13.964646465 +4.483870968 4.483870968 14.259259259 +4.483870968 4.774193548 14.467592593 +4.483870968 5.064516129 14.675925926 +4.483870968 5.354838710 14.884259259 +4.483870968 5.645161290 15.096153846 +4.483870968 5.935483871 15.342105263 +4.483870968 6.225806452 15.639534884 +4.483870968 6.516129032 16.006493506 +4.483870968 6.806451613 16.470588235 +4.483870968 7.096774194 16.854838710 +4.483870968 7.387096774 16.854838710 +4.483870968 7.677419355 16.854838710 +4.483870968 7.967741935 16.854838710 +4.483870968 8.258064516 16.854838710 +4.483870968 8.548387097 16.854838710 +4.483870968 8.838709677 16.854838710 +4.483870968 9.129032258 16.854838710 +4.483870968 9.419354839 16.854838710 +4.483870968 9.709677419 16.854838710 +4.483870968 10.000000000 16.854838710 +4.774193548 1.000000000 12.217741935 +4.774193548 1.290322581 12.217741935 +4.774193548 1.580645161 12.217741935 +4.774193548 1.870967742 12.217741935 +4.774193548 2.161290323 12.217741935 +4.774193548 2.451612903 12.217741935 +4.774193548 2.741935484 12.217741935 +4.774193548 3.032258065 12.301587302 +4.774193548 3.322580645 12.951388889 +4.774193548 3.612903226 13.456790123 +4.774193548 3.903225806 13.861111111 +4.774193548 4.193548387 14.191919192 +4.774193548 4.483870968 14.467592593 +4.774193548 4.774193548 14.700854701 +4.774193548 5.064516129 14.893162393 +4.774193548 5.354838710 15.088495575 +4.774193548 5.645161290 15.312500000 +4.774193548 5.935483871 15.578947368 +4.774193548 6.225806452 15.901162791 +4.774193548 6.516129032 16.298701299 +4.774193548 6.806451613 16.801470588 +4.774193548 7.096774194 17.217741935 +4.774193548 7.387096774 17.217741935 +4.774193548 7.677419355 17.217741935 +4.774193548 7.967741935 17.217741935 +4.774193548 8.258064516 17.217741935 +4.774193548 8.548387097 17.217741935 +4.774193548 8.838709677 17.217741935 +4.774193548 9.129032258 17.217741935 +4.774193548 9.419354839 17.217741935 +4.774193548 9.709677419 17.217741935 +4.774193548 10.000000000 17.217741935 +5.064516129 1.000000000 12.580645161 +5.064516129 1.290322581 12.580645161 +5.064516129 1.580645161 12.580645161 +5.064516129 1.870967742 12.580645161 +5.064516129 2.161290323 12.580645161 +5.064516129 2.451612903 12.580645161 +5.064516129 2.741935484 12.580645161 +5.064516129 3.032258065 12.658730159 +5.064516129 3.322580645 13.263888889 +5.064516129 3.612903226 13.734567901 +5.064516129 3.903225806 14.111111111 +5.064516129 4.193548387 14.419191919 +5.064516129 4.483870968 14.675925926 +5.064516129 4.774193548 14.893162393 +5.064516129 5.064516129 15.081967213 +5.064516129 5.354838710 15.287610619 +5.064516129 5.645161290 15.528846154 +5.064516129 5.935483871 15.815789474 +5.064516129 6.225806452 16.162790698 +5.064516129 6.516129032 16.590909091 +5.064516129 6.806451613 17.132352941 +5.064516129 7.096774194 17.580645161 +5.064516129 7.387096774 17.580645161 +5.064516129 7.677419355 17.580645161 +5.064516129 7.967741935 17.580645161 +5.064516129 8.258064516 17.580645161 +5.064516129 8.548387097 17.580645161 +5.064516129 8.838709677 17.580645161 +5.064516129 9.129032258 17.580645161 +5.064516129 9.419354839 17.580645161 +5.064516129 9.709677419 17.580645161 +5.064516129 10.000000000 17.580645161 +5.354838710 1.000000000 12.943548387 +5.354838710 1.290322581 12.943548387 +5.354838710 1.580645161 12.943548387 +5.354838710 1.870967742 12.943548387 +5.354838710 2.161290323 12.943548387 +5.354838710 2.451612903 12.943548387 +5.354838710 2.741935484 12.943548387 +5.354838710 3.032258065 13.015873016 +5.354838710 3.322580645 13.576388889 +5.354838710 3.612903226 14.012345679 +5.354838710 3.903225806 14.361111111 +5.354838710 4.193548387 14.646464646 +5.354838710 4.483870968 14.884259259 +5.354838710 4.774193548 15.088495575 +5.354838710 5.064516129 15.287610619 +5.354838710 5.354838710 15.486725664 +5.354838710 5.645161290 15.745192308 +5.354838710 5.935483871 16.052631579 +5.354838710 6.225806452 16.424418605 +5.354838710 6.516129032 16.883116883 +5.354838710 6.806451613 17.463235294 +5.354838710 7.096774194 17.943548387 +5.354838710 7.387096774 17.943548387 +5.354838710 7.677419355 17.943548387 +5.354838710 7.967741935 17.943548387 +5.354838710 8.258064516 17.943548387 +5.354838710 8.548387097 17.943548387 +5.354838710 8.838709677 17.943548387 +5.354838710 9.129032258 17.943548387 +5.354838710 9.419354839 17.943548387 +5.354838710 9.709677419 17.943548387 +5.354838710 10.000000000 17.943548387 +5.645161290 1.000000000 13.306451613 +5.645161290 1.290322581 13.306451613 +5.645161290 1.580645161 13.306451613 +5.645161290 1.870967742 13.306451613 +5.645161290 2.161290323 13.306451613 +5.645161290 2.451612903 13.306451613 +5.645161290 2.741935484 13.306451613 +5.645161290 3.032258065 13.373015873 +5.645161290 3.322580645 13.888888889 +5.645161290 3.612903226 14.290123457 +5.645161290 3.903225806 14.611111111 +5.645161290 4.193548387 14.873737374 +5.645161290 4.483870968 15.096153846 +5.645161290 4.774193548 15.312500000 +5.645161290 5.064516129 15.528846154 +5.645161290 5.354838710 15.745192308 +5.645161290 5.645161290 15.961538462 +5.645161290 5.935483871 16.289473684 +5.645161290 6.225806452 16.686046512 +5.645161290 6.516129032 17.175324675 +5.645161290 6.806451613 17.794117647 +5.645161290 7.096774194 18.306451613 +5.645161290 7.387096774 18.306451613 +5.645161290 7.677419355 18.306451613 +5.645161290 7.967741935 18.306451613 +5.645161290 8.258064516 18.306451613 +5.645161290 8.548387097 18.306451613 +5.645161290 8.838709677 18.306451613 +5.645161290 9.129032258 18.306451613 +5.645161290 9.419354839 18.306451613 +5.645161290 9.709677419 18.306451613 +5.645161290 10.000000000 18.306451613 +5.935483871 1.000000000 13.669354839 +5.935483871 1.290322581 13.669354839 +5.935483871 1.580645161 13.669354839 +5.935483871 1.870967742 13.669354839 +5.935483871 2.161290323 13.669354839 +5.935483871 2.451612903 13.669354839 +5.935483871 2.741935484 13.669354839 +5.935483871 3.032258065 13.730158730 +5.935483871 3.322580645 14.201388889 +5.935483871 3.612903226 14.567901235 +5.935483871 3.903225806 14.861111111 +5.935483871 4.193548387 15.105263158 +5.935483871 4.483870968 15.342105263 +5.935483871 4.774193548 15.578947368 +5.935483871 5.064516129 15.815789474 +5.935483871 5.354838710 16.052631579 +5.935483871 5.645161290 16.289473684 +5.935483871 5.935483871 16.526315789 +5.935483871 6.225806452 16.947674419 +5.935483871 6.516129032 17.467532468 +5.935483871 6.806451613 18.125000000 +5.935483871 7.096774194 18.669354839 +5.935483871 7.387096774 18.669354839 +5.935483871 7.677419355 18.669354839 +5.935483871 7.967741935 18.669354839 +5.935483871 8.258064516 18.669354839 +5.935483871 8.548387097 18.669354839 +5.935483871 8.838709677 18.669354839 +5.935483871 9.129032258 18.669354839 +5.935483871 9.419354839 18.669354839 +5.935483871 9.709677419 18.669354839 +5.935483871 10.000000000 18.669354839 +6.225806452 1.000000000 14.032258065 +6.225806452 1.290322581 14.032258065 +6.225806452 1.580645161 14.032258065 +6.225806452 1.870967742 14.032258065 +6.225806452 2.161290323 14.032258065 +6.225806452 2.451612903 14.032258065 +6.225806452 2.741935484 14.032258065 +6.225806452 3.032258065 14.087301587 +6.225806452 3.322580645 14.513888889 +6.225806452 3.612903226 14.845679012 +6.225806452 3.903225806 15.116279070 +6.225806452 4.193548387 15.377906977 +6.225806452 4.483870968 15.639534884 +6.225806452 4.774193548 15.901162791 +6.225806452 5.064516129 16.162790698 +6.225806452 5.354838710 16.424418605 +6.225806452 5.645161290 16.686046512 +6.225806452 5.935483871 16.947674419 +6.225806452 6.225806452 17.209302326 +6.225806452 6.516129032 17.759740260 +6.225806452 6.806451613 18.455882353 +6.225806452 7.096774194 19.032258065 +6.225806452 7.387096774 19.032258065 +6.225806452 7.677419355 19.032258065 +6.225806452 7.967741935 19.032258065 +6.225806452 8.258064516 19.032258065 +6.225806452 8.548387097 19.032258065 +6.225806452 8.838709677 19.032258065 +6.225806452 9.129032258 19.032258065 +6.225806452 9.419354839 19.032258065 +6.225806452 9.709677419 19.032258065 +6.225806452 10.000000000 19.032258065 +6.516129032 1.000000000 14.395161290 +6.516129032 1.290322581 14.395161290 +6.516129032 1.580645161 14.395161290 +6.516129032 1.870967742 14.395161290 +6.516129032 2.161290323 14.395161290 +6.516129032 2.451612903 14.395161290 +6.516129032 2.741935484 14.395161290 +6.516129032 3.032258065 14.444444444 +6.516129032 3.322580645 14.826388889 +6.516129032 3.612903226 15.129870130 +6.516129032 3.903225806 15.422077922 +6.516129032 4.193548387 15.714285714 +6.516129032 4.483870968 16.006493506 +6.516129032 4.774193548 16.298701299 +6.516129032 5.064516129 16.590909091 +6.516129032 5.354838710 16.883116883 +6.516129032 5.645161290 17.175324675 +6.516129032 5.935483871 17.467532468 +6.516129032 6.225806452 17.759740260 +6.516129032 6.516129032 18.051948052 +6.516129032 6.806451613 18.786764706 +6.516129032 7.096774194 19.395161290 +6.516129032 7.387096774 19.395161290 +6.516129032 7.677419355 19.395161290 +6.516129032 7.967741935 19.395161290 +6.516129032 8.258064516 19.395161290 +6.516129032 8.548387097 19.395161290 +6.516129032 8.838709677 19.395161290 +6.516129032 9.129032258 19.395161290 +6.516129032 9.419354839 19.395161290 +6.516129032 9.709677419 19.395161290 +6.516129032 10.000000000 19.395161290 +6.806451613 1.000000000 14.758064516 +6.806451613 1.290322581 14.758064516 +6.806451613 1.580645161 14.758064516 +6.806451613 1.870967742 14.758064516 +6.806451613 2.161290323 14.758064516 +6.806451613 2.451612903 14.758064516 +6.806451613 2.741935484 14.758064516 +6.806451613 3.032258065 14.801587302 +6.806451613 3.322580645 15.147058824 +6.806451613 3.612903226 15.477941176 +6.806451613 3.903225806 15.808823529 +6.806451613 4.193548387 16.139705882 +6.806451613 4.483870968 16.470588235 +6.806451613 4.774193548 16.801470588 +6.806451613 5.064516129 17.132352941 +6.806451613 5.354838710 17.463235294 +6.806451613 5.645161290 17.794117647 +6.806451613 5.935483871 18.125000000 +6.806451613 6.225806452 18.455882353 +6.806451613 6.516129032 18.786764706 +6.806451613 6.806451613 19.117647059 +6.806451613 7.096774194 19.758064516 +6.806451613 7.387096774 19.758064516 +6.806451613 7.677419355 19.758064516 +6.806451613 7.967741935 19.758064516 +6.806451613 8.258064516 19.758064516 +6.806451613 8.548387097 19.758064516 +6.806451613 8.838709677 19.758064516 +6.806451613 9.129032258 19.758064516 +6.806451613 9.419354839 19.758064516 +6.806451613 9.709677419 19.758064516 +6.806451613 10.000000000 19.758064516 +7.096774194 1.000000000 15.000000000 +7.096774194 1.290322581 15.000000000 +7.096774194 1.580645161 15.000000000 +7.096774194 1.870967742 15.000000000 +7.096774194 2.161290323 15.000000000 +7.096774194 2.451612903 15.000000000 +7.096774194 2.741935484 15.000000000 +7.096774194 3.032258065 15.040322581 +7.096774194 3.322580645 15.403225806 +7.096774194 3.612903226 15.766129032 +7.096774194 3.903225806 16.129032258 +7.096774194 4.193548387 16.491935484 +7.096774194 4.483870968 16.854838710 +7.096774194 4.774193548 17.217741935 +7.096774194 5.064516129 17.580645161 +7.096774194 5.354838710 17.943548387 +7.096774194 5.645161290 18.306451613 +7.096774194 5.935483871 18.669354839 +7.096774194 6.225806452 19.032258065 +7.096774194 6.516129032 19.395161290 +7.096774194 6.806451613 19.758064516 +7.096774194 7.096774194 20.000000000 +7.096774194 7.387096774 20.000000000 +7.096774194 7.677419355 20.000000000 +7.096774194 7.967741935 20.000000000 +7.096774194 8.258064516 20.000000000 +7.096774194 8.548387097 20.000000000 +7.096774194 8.838709677 20.000000000 +7.096774194 9.129032258 20.000000000 +7.096774194 9.419354839 20.000000000 +7.096774194 9.709677419 20.000000000 +7.096774194 10.000000000 20.000000000 +7.387096774 1.000000000 15.000000000 +7.387096774 1.290322581 15.000000000 +7.387096774 1.580645161 15.000000000 +7.387096774 1.870967742 15.000000000 +7.387096774 2.161290323 15.000000000 +7.387096774 2.451612903 15.000000000 +7.387096774 2.741935484 15.000000000 +7.387096774 3.032258065 15.040322581 +7.387096774 3.322580645 15.403225806 +7.387096774 3.612903226 15.766129032 +7.387096774 3.903225806 16.129032258 +7.387096774 4.193548387 16.491935484 +7.387096774 4.483870968 16.854838710 +7.387096774 4.774193548 17.217741935 +7.387096774 5.064516129 17.580645161 +7.387096774 5.354838710 17.943548387 +7.387096774 5.645161290 18.306451613 +7.387096774 5.935483871 18.669354839 +7.387096774 6.225806452 19.032258065 +7.387096774 6.516129032 19.395161290 +7.387096774 6.806451613 19.758064516 +7.387096774 7.096774194 20.000000000 +7.387096774 7.387096774 20.000000000 +7.387096774 7.677419355 20.000000000 +7.387096774 7.967741935 20.000000000 +7.387096774 8.258064516 20.000000000 +7.387096774 8.548387097 20.000000000 +7.387096774 8.838709677 20.000000000 +7.387096774 9.129032258 20.000000000 +7.387096774 9.419354839 20.000000000 +7.387096774 9.709677419 20.000000000 +7.387096774 10.000000000 20.000000000 +7.677419355 1.000000000 15.000000000 +7.677419355 1.290322581 15.000000000 +7.677419355 1.580645161 15.000000000 +7.677419355 1.870967742 15.000000000 +7.677419355 2.161290323 15.000000000 +7.677419355 2.451612903 15.000000000 +7.677419355 2.741935484 15.000000000 +7.677419355 3.032258065 15.040322581 +7.677419355 3.322580645 15.403225806 +7.677419355 3.612903226 15.766129032 +7.677419355 3.903225806 16.129032258 +7.677419355 4.193548387 16.491935484 +7.677419355 4.483870968 16.854838710 +7.677419355 4.774193548 17.217741935 +7.677419355 5.064516129 17.580645161 +7.677419355 5.354838710 17.943548387 +7.677419355 5.645161290 18.306451613 +7.677419355 5.935483871 18.669354839 +7.677419355 6.225806452 19.032258065 +7.677419355 6.516129032 19.395161290 +7.677419355 6.806451613 19.758064516 +7.677419355 7.096774194 20.000000000 +7.677419355 7.387096774 20.000000000 +7.677419355 7.677419355 20.000000000 +7.677419355 7.967741935 20.000000000 +7.677419355 8.258064516 20.000000000 +7.677419355 8.548387097 20.000000000 +7.677419355 8.838709677 20.000000000 +7.677419355 9.129032258 20.000000000 +7.677419355 9.419354839 20.000000000 +7.677419355 9.709677419 20.000000000 +7.677419355 10.000000000 20.000000000 +7.967741935 1.000000000 15.000000000 +7.967741935 1.290322581 15.000000000 +7.967741935 1.580645161 15.000000000 +7.967741935 1.870967742 15.000000000 +7.967741935 2.161290323 15.000000000 +7.967741935 2.451612903 15.000000000 +7.967741935 2.741935484 15.000000000 +7.967741935 3.032258065 15.040322581 +7.967741935 3.322580645 15.403225806 +7.967741935 3.612903226 15.766129032 +7.967741935 3.903225806 16.129032258 +7.967741935 4.193548387 16.491935484 +7.967741935 4.483870968 16.854838710 +7.967741935 4.774193548 17.217741935 +7.967741935 5.064516129 17.580645161 +7.967741935 5.354838710 17.943548387 +7.967741935 5.645161290 18.306451613 +7.967741935 5.935483871 18.669354839 +7.967741935 6.225806452 19.032258065 +7.967741935 6.516129032 19.395161290 +7.967741935 6.806451613 19.758064516 +7.967741935 7.096774194 20.000000000 +7.967741935 7.387096774 20.000000000 +7.967741935 7.677419355 20.000000000 +7.967741935 7.967741935 20.000000000 +7.967741935 8.258064516 20.000000000 +7.967741935 8.548387097 20.000000000 +7.967741935 8.838709677 20.000000000 +7.967741935 9.129032258 20.000000000 +7.967741935 9.419354839 20.000000000 +7.967741935 9.709677419 20.000000000 +7.967741935 10.000000000 20.000000000 +8.258064516 1.000000000 15.000000000 +8.258064516 1.290322581 15.000000000 +8.258064516 1.580645161 15.000000000 +8.258064516 1.870967742 15.000000000 +8.258064516 2.161290323 15.000000000 +8.258064516 2.451612903 15.000000000 +8.258064516 2.741935484 15.000000000 +8.258064516 3.032258065 15.040322581 +8.258064516 3.322580645 15.403225806 +8.258064516 3.612903226 15.766129032 +8.258064516 3.903225806 16.129032258 +8.258064516 4.193548387 16.491935484 +8.258064516 4.483870968 16.854838710 +8.258064516 4.774193548 17.217741935 +8.258064516 5.064516129 17.580645161 +8.258064516 5.354838710 17.943548387 +8.258064516 5.645161290 18.306451613 +8.258064516 5.935483871 18.669354839 +8.258064516 6.225806452 19.032258065 +8.258064516 6.516129032 19.395161290 +8.258064516 6.806451613 19.758064516 +8.258064516 7.096774194 20.000000000 +8.258064516 7.387096774 20.000000000 +8.258064516 7.677419355 20.000000000 +8.258064516 7.967741935 20.000000000 +8.258064516 8.258064516 20.000000000 +8.258064516 8.548387097 20.000000000 +8.258064516 8.838709677 20.000000000 +8.258064516 9.129032258 20.000000000 +8.258064516 9.419354839 20.000000000 +8.258064516 9.709677419 20.000000000 +8.258064516 10.000000000 20.000000000 +8.548387097 1.000000000 15.000000000 +8.548387097 1.290322581 15.000000000 +8.548387097 1.580645161 15.000000000 +8.548387097 1.870967742 15.000000000 +8.548387097 2.161290323 15.000000000 +8.548387097 2.451612903 15.000000000 +8.548387097 2.741935484 15.000000000 +8.548387097 3.032258065 15.040322581 +8.548387097 3.322580645 15.403225806 +8.548387097 3.612903226 15.766129032 +8.548387097 3.903225806 16.129032258 +8.548387097 4.193548387 16.491935484 +8.548387097 4.483870968 16.854838710 +8.548387097 4.774193548 17.217741935 +8.548387097 5.064516129 17.580645161 +8.548387097 5.354838710 17.943548387 +8.548387097 5.645161290 18.306451613 +8.548387097 5.935483871 18.669354839 +8.548387097 6.225806452 19.032258065 +8.548387097 6.516129032 19.395161290 +8.548387097 6.806451613 19.758064516 +8.548387097 7.096774194 20.000000000 +8.548387097 7.387096774 20.000000000 +8.548387097 7.677419355 20.000000000 +8.548387097 7.967741935 20.000000000 +8.548387097 8.258064516 20.000000000 +8.548387097 8.548387097 20.000000000 +8.548387097 8.838709677 20.000000000 +8.548387097 9.129032258 20.000000000 +8.548387097 9.419354839 20.000000000 +8.548387097 9.709677419 20.000000000 +8.548387097 10.000000000 20.000000000 +8.838709677 1.000000000 15.000000000 +8.838709677 1.290322581 15.000000000 +8.838709677 1.580645161 15.000000000 +8.838709677 1.870967742 15.000000000 +8.838709677 2.161290323 15.000000000 +8.838709677 2.451612903 15.000000000 +8.838709677 2.741935484 15.000000000 +8.838709677 3.032258065 15.040322581 +8.838709677 3.322580645 15.403225806 +8.838709677 3.612903226 15.766129032 +8.838709677 3.903225806 16.129032258 +8.838709677 4.193548387 16.491935484 +8.838709677 4.483870968 16.854838710 +8.838709677 4.774193548 17.217741935 +8.838709677 5.064516129 17.580645161 +8.838709677 5.354838710 17.943548387 +8.838709677 5.645161290 18.306451613 +8.838709677 5.935483871 18.669354839 +8.838709677 6.225806452 19.032258065 +8.838709677 6.516129032 19.395161290 +8.838709677 6.806451613 19.758064516 +8.838709677 7.096774194 20.000000000 +8.838709677 7.387096774 20.000000000 +8.838709677 7.677419355 20.000000000 +8.838709677 7.967741935 20.000000000 +8.838709677 8.258064516 20.000000000 +8.838709677 8.548387097 20.000000000 +8.838709677 8.838709677 20.000000000 +8.838709677 9.129032258 20.000000000 +8.838709677 9.419354839 20.000000000 +8.838709677 9.709677419 20.000000000 +8.838709677 10.000000000 20.000000000 +9.129032258 1.000000000 15.000000000 +9.129032258 1.290322581 15.000000000 +9.129032258 1.580645161 15.000000000 +9.129032258 1.870967742 15.000000000 +9.129032258 2.161290323 15.000000000 +9.129032258 2.451612903 15.000000000 +9.129032258 2.741935484 15.000000000 +9.129032258 3.032258065 15.040322581 +9.129032258 3.322580645 15.403225806 +9.129032258 3.612903226 15.766129032 +9.129032258 3.903225806 16.129032258 +9.129032258 4.193548387 16.491935484 +9.129032258 4.483870968 16.854838710 +9.129032258 4.774193548 17.217741935 +9.129032258 5.064516129 17.580645161 +9.129032258 5.354838710 17.943548387 +9.129032258 5.645161290 18.306451613 +9.129032258 5.935483871 18.669354839 +9.129032258 6.225806452 19.032258065 +9.129032258 6.516129032 19.395161290 +9.129032258 6.806451613 19.758064516 +9.129032258 7.096774194 20.000000000 +9.129032258 7.387096774 20.000000000 +9.129032258 7.677419355 20.000000000 +9.129032258 7.967741935 20.000000000 +9.129032258 8.258064516 20.000000000 +9.129032258 8.548387097 20.000000000 +9.129032258 8.838709677 20.000000000 +9.129032258 9.129032258 20.000000000 +9.129032258 9.419354839 20.000000000 +9.129032258 9.709677419 20.000000000 +9.129032258 10.000000000 20.000000000 +9.419354839 1.000000000 15.000000000 +9.419354839 1.290322581 15.000000000 +9.419354839 1.580645161 15.000000000 +9.419354839 1.870967742 15.000000000 +9.419354839 2.161290323 15.000000000 +9.419354839 2.451612903 15.000000000 +9.419354839 2.741935484 15.000000000 +9.419354839 3.032258065 15.040322581 +9.419354839 3.322580645 15.403225806 +9.419354839 3.612903226 15.766129032 +9.419354839 3.903225806 16.129032258 +9.419354839 4.193548387 16.491935484 +9.419354839 4.483870968 16.854838710 +9.419354839 4.774193548 17.217741935 +9.419354839 5.064516129 17.580645161 +9.419354839 5.354838710 17.943548387 +9.419354839 5.645161290 18.306451613 +9.419354839 5.935483871 18.669354839 +9.419354839 6.225806452 19.032258065 +9.419354839 6.516129032 19.395161290 +9.419354839 6.806451613 19.758064516 +9.419354839 7.096774194 20.000000000 +9.419354839 7.387096774 20.000000000 +9.419354839 7.677419355 20.000000000 +9.419354839 7.967741935 20.000000000 +9.419354839 8.258064516 20.000000000 +9.419354839 8.548387097 20.000000000 +9.419354839 8.838709677 20.000000000 +9.419354839 9.129032258 20.000000000 +9.419354839 9.419354839 20.000000000 +9.419354839 9.709677419 20.000000000 +9.419354839 10.000000000 20.000000000 +9.709677419 1.000000000 15.000000000 +9.709677419 1.290322581 15.000000000 +9.709677419 1.580645161 15.000000000 +9.709677419 1.870967742 15.000000000 +9.709677419 2.161290323 15.000000000 +9.709677419 2.451612903 15.000000000 +9.709677419 2.741935484 15.000000000 +9.709677419 3.032258065 15.040322581 +9.709677419 3.322580645 15.403225806 +9.709677419 3.612903226 15.766129032 +9.709677419 3.903225806 16.129032258 +9.709677419 4.193548387 16.491935484 +9.709677419 4.483870968 16.854838710 +9.709677419 4.774193548 17.217741935 +9.709677419 5.064516129 17.580645161 +9.709677419 5.354838710 17.943548387 +9.709677419 5.645161290 18.306451613 +9.709677419 5.935483871 18.669354839 +9.709677419 6.225806452 19.032258065 +9.709677419 6.516129032 19.395161290 +9.709677419 6.806451613 19.758064516 +9.709677419 7.096774194 20.000000000 +9.709677419 7.387096774 20.000000000 +9.709677419 7.677419355 20.000000000 +9.709677419 7.967741935 20.000000000 +9.709677419 8.258064516 20.000000000 +9.709677419 8.548387097 20.000000000 +9.709677419 8.838709677 20.000000000 +9.709677419 9.129032258 20.000000000 +9.709677419 9.419354839 20.000000000 +9.709677419 9.709677419 20.000000000 +9.709677419 10.000000000 20.000000000 +10.000000000 1.000000000 15.000000000 +10.000000000 1.290322581 15.000000000 +10.000000000 1.580645161 15.000000000 +10.000000000 1.870967742 15.000000000 +10.000000000 2.161290323 15.000000000 +10.000000000 2.451612903 15.000000000 +10.000000000 2.741935484 15.000000000 +10.000000000 3.032258065 15.040322581 +10.000000000 3.322580645 15.403225806 +10.000000000 3.612903226 15.766129032 +10.000000000 3.903225806 16.129032258 +10.000000000 4.193548387 16.491935484 +10.000000000 4.483870968 16.854838710 +10.000000000 4.774193548 17.217741935 +10.000000000 5.064516129 17.580645161 +10.000000000 5.354838710 17.943548387 +10.000000000 5.645161290 18.306451613 +10.000000000 5.935483871 18.669354839 +10.000000000 6.225806452 19.032258065 +10.000000000 6.516129032 19.395161290 +10.000000000 6.806451613 19.758064516 +10.000000000 7.096774194 20.000000000 +10.000000000 7.387096774 20.000000000 +10.000000000 7.677419355 20.000000000 +10.000000000 7.967741935 20.000000000 +10.000000000 8.258064516 20.000000000 +10.000000000 8.548387097 20.000000000 +10.000000000 8.838709677 20.000000000 +10.000000000 9.129032258 20.000000000 +10.000000000 9.419354839 20.000000000 +10.000000000 9.709677419 20.000000000 +10.000000000 10.000000000 20.000000000 diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.fll b/examples/takagi-sugeno/octave/linear_tip_calculator.fll new file mode 100644 index 0000000..510d8a4 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.fll @@ -0,0 +1,34 @@ +Engine: linear_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: Tip + enabled: true + range: 10.000 20.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: TenPercent Linear 0.000 0.000 10.000 + term: FifteenPercent Linear 0.000 0.000 15.000 + term: TwentyPercent Linear 0.000 0.000 20.000 +RuleBlock: + enabled: true + conjunction: Minimum + disjunction: none + implication: none + activation: General + rule: if FoodQuality is Bad and Service is Bad then Tip is TenPercent + rule: if FoodQuality is Bad and Service is Good then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Bad then Tip is FifteenPercent + rule: if FoodQuality is Good and Service is Good then Tip is TwentyPercent
\ No newline at end of file diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.java b/examples/takagi-sugeno/octave/linear_tip_calculator.java new file mode 100644 index 0000000..7046734 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.java @@ -0,0 +1,73 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class linear_tip_calculator{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("linear_tip_calculator"); +engine.setDescription(""); + +InputVariable FoodQuality = new InputVariable(); +FoodQuality.setName("FoodQuality"); +FoodQuality.setDescription(""); +FoodQuality.setEnabled(true); +FoodQuality.setRange(1.000, 10.000); +FoodQuality.setLockValueInRange(false); +FoodQuality.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(FoodQuality); + +InputVariable Service = new InputVariable(); +Service.setName("Service"); +Service.setDescription(""); +Service.setEnabled(true); +Service.setRange(1.000, 10.000); +Service.setLockValueInRange(false); +Service.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(Service); + +OutputVariable Tip = new OutputVariable(); +Tip.setName("Tip"); +Tip.setDescription(""); +Tip.setEnabled(true); +Tip.setRange(10.000, 20.000); +Tip.setLockValueInRange(false); +Tip.setAggregation(null); +Tip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +Tip.setDefaultValue(Double.NaN); +Tip.setLockPreviousValue(false); +Tip.addTerm(Linear.create("TenPercent", engine, 0.000, 0.000, 10.000)); +Tip.addTerm(Linear.create("FifteenPercent", engine, 0.000, 0.000, 15.000)); +Tip.addTerm(Linear.create("TwentyPercent", engine, 0.000, 0.000, 20.000)); +engine.addOutputVariable(Tip); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new Minimum()); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Bad then Tip is TenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Good then Tip is FifteenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Bad then Tip is FifteenPercent", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Good then Tip is TwentyPercent", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/takagi-sugeno/octave/linear_tip_calculator.pdf b/examples/takagi-sugeno/octave/linear_tip_calculator.pdf Binary files differnew file mode 100644 index 0000000..357f529 --- /dev/null +++ b/examples/takagi-sugeno/octave/linear_tip_calculator.pdf diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.R b/examples/takagi-sugeno/octave/sugeno_tip_calculator.R new file mode 100644 index 0000000..1491a96 --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.R @@ -0,0 +1,119 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "sugeno_tip_calculator" +engine.fll = "Engine: sugeno_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: CheapTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: AverageTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: GenerousTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: none + implication: none + activation: General + rule: if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low + rule: if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High" + +engine.fldFile = "sugeno_tip_calculator.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1i2_o1 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=CheapTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=CheapTip), color="black") + + ggtitle("(FoodQuality, Service) = CheapTip") + +engine.plot.i2i1_o1 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=CheapTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=CheapTip), color="black") + + ggtitle("(Service, FoodQuality) = CheapTip") + +engine.plot.i1i2_o2 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=AverageTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=AverageTip), color="black") + + ggtitle("(FoodQuality, Service) = AverageTip") + +engine.plot.i2i1_o2 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=AverageTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=AverageTip), color="black") + + ggtitle("(Service, FoodQuality) = AverageTip") + +engine.plot.i1i2_o3 = ggplot(engine.df, aes(FoodQuality, Service)) + + geom_tile(aes(fill=GenerousTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=FoodQuality, y=Service, z=GenerousTip), color="black") + + ggtitle("(FoodQuality, Service) = GenerousTip") + +engine.plot.i2i1_o3 = ggplot(engine.df, aes(Service, FoodQuality)) + + geom_tile(aes(fill=GenerousTip)) + + scale_fill_gradient(low="yellow", high="red") + + stat_contour(aes(x=Service, y=FoodQuality, z=GenerousTip), color="black") + + ggtitle("(Service, FoodQuality) = GenerousTip") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1i2_o1, engine.plot.i2i1_o1, engine.plot.i1i2_o2, engine.plot.i2i1_o2, engine.plot.i1i2_o3, engine.plot.i2i1_o3, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.cpp b/examples/takagi-sugeno/octave/sugeno_tip_calculator.cpp new file mode 100644 index 0000000..96536fa --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.cpp @@ -0,0 +1,98 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("sugeno_tip_calculator"); +engine->setDescription(""); + +InputVariable* FoodQuality = new InputVariable; +FoodQuality->setName("FoodQuality"); +FoodQuality->setDescription(""); +FoodQuality->setEnabled(true); +FoodQuality->setRange(1.000, 10.000); +FoodQuality->setLockValueInRange(false); +FoodQuality->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(FoodQuality); + +InputVariable* Service = new InputVariable; +Service->setName("Service"); +Service->setDescription(""); +Service->setEnabled(true); +Service->setRange(1.000, 10.000); +Service->setLockValueInRange(false); +Service->addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service->addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine->addInputVariable(Service); + +OutputVariable* CheapTip = new OutputVariable; +CheapTip->setName("CheapTip"); +CheapTip->setDescription(""); +CheapTip->setEnabled(true); +CheapTip->setRange(5.000, 25.000); +CheapTip->setLockValueInRange(false); +CheapTip->setAggregation(fl::null); +CheapTip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +CheapTip->setDefaultValue(fl::nan); +CheapTip->setLockPreviousValue(false); +CheapTip->addTerm(new Constant("Low", 10.000)); +CheapTip->addTerm(new Constant("Medium", 15.000)); +CheapTip->addTerm(new Constant("High", 20.000)); +engine->addOutputVariable(CheapTip); + +OutputVariable* AverageTip = new OutputVariable; +AverageTip->setName("AverageTip"); +AverageTip->setDescription(""); +AverageTip->setEnabled(true); +AverageTip->setRange(5.000, 25.000); +AverageTip->setLockValueInRange(false); +AverageTip->setAggregation(fl::null); +AverageTip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +AverageTip->setDefaultValue(fl::nan); +AverageTip->setLockPreviousValue(false); +AverageTip->addTerm(new Constant("Low", 10.000)); +AverageTip->addTerm(new Constant("Medium", 15.000)); +AverageTip->addTerm(new Constant("High", 20.000)); +engine->addOutputVariable(AverageTip); + +OutputVariable* GenerousTip = new OutputVariable; +GenerousTip->setName("GenerousTip"); +GenerousTip->setDescription(""); +GenerousTip->setEnabled(true); +GenerousTip->setRange(5.000, 25.000); +GenerousTip->setLockValueInRange(false); +GenerousTip->setAggregation(fl::null); +GenerousTip->setDefuzzifier(new WeightedAverage("TakagiSugeno")); +GenerousTip->setDefaultValue(fl::nan); +GenerousTip->setLockPreviousValue(false); +GenerousTip->addTerm(new Constant("Low", 10.000)); +GenerousTip->addTerm(new Constant("Medium", 15.000)); +GenerousTip->addTerm(new Constant("High", 20.000)); +engine->addOutputVariable(GenerousTip); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(new EinsteinProduct); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock->addRule(Rule::parse("if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.fcl b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fcl new file mode 100644 index 0000000..fcb857c --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fcl @@ -0,0 +1,69 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK sugeno_tip_calculator + +VAR_INPUT + FoodQuality: REAL; + Service: REAL; +END_VAR + +VAR_OUTPUT + CheapTip: REAL; + AverageTip: REAL; + GenerousTip: REAL; +END_VAR + +FUZZIFY FoodQuality + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +FUZZIFY Service + RANGE := (1.000 .. 10.000); + TERM Bad := Trapezoid 0.000 1.000 3.000 7.000; + TERM Good := Trapezoid 3.000 7.000 10.000 11.000; +END_FUZZIFY + +DEFUZZIFY CheapTip + RANGE := (5.000 .. 25.000); + TERM Low := 10.000; + TERM Medium := 15.000; + TERM High := 20.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY AverageTip + RANGE := (5.000 .. 25.000); + TERM Low := 10.000; + TERM Medium := 15.000; + TERM High := 20.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY GenerousTip + RANGE := (5.000 .. 25.000); + TERM Low := 10.000; + TERM Medium := 15.000; + TERM High := 20.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + AND : EPROD; + RULE 1 : if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low + RULE 2 : if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + RULE 3 : if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + RULE 4 : if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + RULE 5 : if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + RULE 6 : if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High + RULE 7 : if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + RULE 8 : if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High + RULE 9 : if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + RULE 10 : if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.fis b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fis new file mode 100644 index 0000000..3d28f10 --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fis @@ -0,0 +1,64 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='sugeno_tip_calculator' +Type='sugeno' +Version=6.0 +NumInputs=2 +NumOutputs=3 +NumRules=10 +AndMethod='einstein_product' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='FoodQuality' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Input2] +Name='Service' +Range=[1.000 10.000] +NumMFs=2 +MF1='Bad':'trapmf',[0.000 1.000 3.000 7.000] +MF2='Good':'trapmf',[3.000 7.000 10.000 11.000] + +[Output1] +Name='CheapTip' +Range=[5.000 25.000] +NumMFs=3 +MF1='Low':'constant',[10.000] +MF2='Medium':'constant',[15.000] +MF3='High':'constant',[20.000] + +[Output2] +Name='AverageTip' +Range=[5.000 25.000] +NumMFs=3 +MF1='Low':'constant',[10.000] +MF2='Medium':'constant',[15.000] +MF3='High':'constant',[20.000] + +[Output3] +Name='GenerousTip' +Range=[5.000 25.000] +NumMFs=3 +MF1='Low':'constant',[10.000] +MF2='Medium':'constant',[15.000] +MF3='High':'constant',[20.000] + +[Rules] +1.300 1.300 , 1.300 1.200 1.000 (1.000) : 1 +2.000 1.300 , 1.000 1.000 2.000 (1.000) : 1 +2.200 1.200 , 1.000 2.000 3.000 (1.000) : 1 +1.000 1.000 , 1.000 1.000 2.000 (1.000) : 1 +2.000 1.000 , 1.000 2.000 3.000 (1.000) : 1 +2.300 1.000 , 1.000 2.000 3.200 (1.000) : 1 +1.000 2.000 , 1.000 2.000 3.000 (1.000) : 1 +2.000 2.000 , 2.000 2.000 3.200 (1.000) : 1 +1.200 2.200 , 1.000 2.000 3.000 (1.000) : 1 +2.400 2.400 , 3.000 3.200 3.300 (1.000) : 1 diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.fld b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fld new file mode 100644 index 0000000..ce942fd --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fld @@ -0,0 +1,1025 @@ +FoodQuality Service CheapTip AverageTip GenerousTip +1.000000000 1.000000000 10.000000000 10.000000000 12.500000000 +1.000000000 1.290322581 10.000000000 10.000000000 12.500000000 +1.000000000 1.580645161 10.000000000 10.000000000 12.500000000 +1.000000000 1.870967742 10.000000000 10.000000000 12.500000000 +1.000000000 2.161290323 10.000000000 10.000000000 12.500000000 +1.000000000 2.451612903 10.000000000 10.000000000 12.500000000 +1.000000000 2.741935484 10.000000000 10.000000000 12.500000000 +1.000000000 3.032258065 10.000000000 10.020323221 12.520404599 +1.000000000 3.322580645 10.000000000 10.217239082 12.726188365 +1.000000000 3.612903226 10.000000000 10.438541426 12.978595315 +1.000000000 3.903225806 10.000000000 10.688605148 13.303233716 +1.000000000 4.193548387 10.000000000 10.985194151 13.754553905 +1.000000000 4.483870968 10.000000000 11.368962007 14.431095437 +1.000000000 4.774193548 10.000000000 11.913195856 15.489093970 +1.000000000 5.064516129 10.000000000 12.682234786 17.023032304 +1.000000000 5.354838710 10.000000000 13.342744072 18.155449447 +1.000000000 5.645161290 10.000000000 13.792466240 18.754193916 +1.000000000 5.935483871 10.000000000 14.130816184 19.125588403 +1.000000000 6.225806452 10.000000000 14.413282130 19.412900315 +1.000000000 6.516129032 10.000000000 14.658795531 19.658787254 +1.000000000 6.806451613 10.000000000 14.873037538 19.873037533 +1.000000000 7.096774194 10.000000000 15.000000000 20.000000000 +1.000000000 7.387096774 10.000000000 15.000000000 20.000000000 +1.000000000 7.677419355 10.000000000 15.000000000 20.000000000 +1.000000000 7.967741935 10.000000000 15.000000000 20.000000000 +1.000000000 8.258064516 10.000000000 15.000000000 20.000000000 +1.000000000 8.548387097 10.000000000 15.000000000 20.000000000 +1.000000000 8.838709677 10.000000000 15.000000000 20.000000000 +1.000000000 9.129032258 10.000000000 15.000000000 20.000000000 +1.000000000 9.419354839 10.000000000 15.000000000 20.000000000 +1.000000000 9.709677419 10.000000000 15.000000000 20.000000000 +1.000000000 10.000000000 10.000000000 15.000000000 20.000000000 +1.290322581 1.000000000 10.000000000 10.000000000 12.500000000 +1.290322581 1.290322581 10.000000000 10.000000000 12.500000000 +1.290322581 1.580645161 10.000000000 10.000000000 12.500000000 +1.290322581 1.870967742 10.000000000 10.000000000 12.500000000 +1.290322581 2.161290323 10.000000000 10.000000000 12.500000000 +1.290322581 2.451612903 10.000000000 10.000000000 12.500000000 +1.290322581 2.741935484 10.000000000 10.000000000 12.500000000 +1.290322581 3.032258065 10.000000000 10.020323221 12.520404599 +1.290322581 3.322580645 10.000000000 10.217239082 12.726188365 +1.290322581 3.612903226 10.000000000 10.438541426 12.978595315 +1.290322581 3.903225806 10.000000000 10.688605148 13.303233716 +1.290322581 4.193548387 10.000000000 10.985194151 13.754553905 +1.290322581 4.483870968 10.000000000 11.368962007 14.431095437 +1.290322581 4.774193548 10.000000000 11.913195856 15.489093970 +1.290322581 5.064516129 10.000000000 12.682234786 17.023032304 +1.290322581 5.354838710 10.000000000 13.342744072 18.155449447 +1.290322581 5.645161290 10.000000000 13.792466240 18.754193916 +1.290322581 5.935483871 10.000000000 14.130816184 19.125588403 +1.290322581 6.225806452 10.000000000 14.413282130 19.412900315 +1.290322581 6.516129032 10.000000000 14.658795531 19.658787254 +1.290322581 6.806451613 10.000000000 14.873037538 19.873037533 +1.290322581 7.096774194 10.000000000 15.000000000 20.000000000 +1.290322581 7.387096774 10.000000000 15.000000000 20.000000000 +1.290322581 7.677419355 10.000000000 15.000000000 20.000000000 +1.290322581 7.967741935 10.000000000 15.000000000 20.000000000 +1.290322581 8.258064516 10.000000000 15.000000000 20.000000000 +1.290322581 8.548387097 10.000000000 15.000000000 20.000000000 +1.290322581 8.838709677 10.000000000 15.000000000 20.000000000 +1.290322581 9.129032258 10.000000000 15.000000000 20.000000000 +1.290322581 9.419354839 10.000000000 15.000000000 20.000000000 +1.290322581 9.709677419 10.000000000 15.000000000 20.000000000 +1.290322581 10.000000000 10.000000000 15.000000000 20.000000000 +1.580645161 1.000000000 10.000000000 10.000000000 12.500000000 +1.580645161 1.290322581 10.000000000 10.000000000 12.500000000 +1.580645161 1.580645161 10.000000000 10.000000000 12.500000000 +1.580645161 1.870967742 10.000000000 10.000000000 12.500000000 +1.580645161 2.161290323 10.000000000 10.000000000 12.500000000 +1.580645161 2.451612903 10.000000000 10.000000000 12.500000000 +1.580645161 2.741935484 10.000000000 10.000000000 12.500000000 +1.580645161 3.032258065 10.000000000 10.020323221 12.520404599 +1.580645161 3.322580645 10.000000000 10.217239082 12.726188365 +1.580645161 3.612903226 10.000000000 10.438541426 12.978595315 +1.580645161 3.903225806 10.000000000 10.688605148 13.303233716 +1.580645161 4.193548387 10.000000000 10.985194151 13.754553905 +1.580645161 4.483870968 10.000000000 11.368962007 14.431095437 +1.580645161 4.774193548 10.000000000 11.913195856 15.489093970 +1.580645161 5.064516129 10.000000000 12.682234786 17.023032304 +1.580645161 5.354838710 10.000000000 13.342744072 18.155449447 +1.580645161 5.645161290 10.000000000 13.792466240 18.754193916 +1.580645161 5.935483871 10.000000000 14.130816184 19.125588403 +1.580645161 6.225806452 10.000000000 14.413282130 19.412900315 +1.580645161 6.516129032 10.000000000 14.658795531 19.658787254 +1.580645161 6.806451613 10.000000000 14.873037538 19.873037533 +1.580645161 7.096774194 10.000000000 15.000000000 20.000000000 +1.580645161 7.387096774 10.000000000 15.000000000 20.000000000 +1.580645161 7.677419355 10.000000000 15.000000000 20.000000000 +1.580645161 7.967741935 10.000000000 15.000000000 20.000000000 +1.580645161 8.258064516 10.000000000 15.000000000 20.000000000 +1.580645161 8.548387097 10.000000000 15.000000000 20.000000000 +1.580645161 8.838709677 10.000000000 15.000000000 20.000000000 +1.580645161 9.129032258 10.000000000 15.000000000 20.000000000 +1.580645161 9.419354839 10.000000000 15.000000000 20.000000000 +1.580645161 9.709677419 10.000000000 15.000000000 20.000000000 +1.580645161 10.000000000 10.000000000 15.000000000 20.000000000 +1.870967742 1.000000000 10.000000000 10.000000000 12.500000000 +1.870967742 1.290322581 10.000000000 10.000000000 12.500000000 +1.870967742 1.580645161 10.000000000 10.000000000 12.500000000 +1.870967742 1.870967742 10.000000000 10.000000000 12.500000000 +1.870967742 2.161290323 10.000000000 10.000000000 12.500000000 +1.870967742 2.451612903 10.000000000 10.000000000 12.500000000 +1.870967742 2.741935484 10.000000000 10.000000000 12.500000000 +1.870967742 3.032258065 10.000000000 10.020323221 12.520404599 +1.870967742 3.322580645 10.000000000 10.217239082 12.726188365 +1.870967742 3.612903226 10.000000000 10.438541426 12.978595315 +1.870967742 3.903225806 10.000000000 10.688605148 13.303233716 +1.870967742 4.193548387 10.000000000 10.985194151 13.754553905 +1.870967742 4.483870968 10.000000000 11.368962007 14.431095437 +1.870967742 4.774193548 10.000000000 11.913195856 15.489093970 +1.870967742 5.064516129 10.000000000 12.682234786 17.023032304 +1.870967742 5.354838710 10.000000000 13.342744072 18.155449447 +1.870967742 5.645161290 10.000000000 13.792466240 18.754193916 +1.870967742 5.935483871 10.000000000 14.130816184 19.125588403 +1.870967742 6.225806452 10.000000000 14.413282130 19.412900315 +1.870967742 6.516129032 10.000000000 14.658795531 19.658787254 +1.870967742 6.806451613 10.000000000 14.873037538 19.873037533 +1.870967742 7.096774194 10.000000000 15.000000000 20.000000000 +1.870967742 7.387096774 10.000000000 15.000000000 20.000000000 +1.870967742 7.677419355 10.000000000 15.000000000 20.000000000 +1.870967742 7.967741935 10.000000000 15.000000000 20.000000000 +1.870967742 8.258064516 10.000000000 15.000000000 20.000000000 +1.870967742 8.548387097 10.000000000 15.000000000 20.000000000 +1.870967742 8.838709677 10.000000000 15.000000000 20.000000000 +1.870967742 9.129032258 10.000000000 15.000000000 20.000000000 +1.870967742 9.419354839 10.000000000 15.000000000 20.000000000 +1.870967742 9.709677419 10.000000000 15.000000000 20.000000000 +1.870967742 10.000000000 10.000000000 15.000000000 20.000000000 +2.161290323 1.000000000 10.000000000 10.000000000 12.500000000 +2.161290323 1.290322581 10.000000000 10.000000000 12.500000000 +2.161290323 1.580645161 10.000000000 10.000000000 12.500000000 +2.161290323 1.870967742 10.000000000 10.000000000 12.500000000 +2.161290323 2.161290323 10.000000000 10.000000000 12.500000000 +2.161290323 2.451612903 10.000000000 10.000000000 12.500000000 +2.161290323 2.741935484 10.000000000 10.000000000 12.500000000 +2.161290323 3.032258065 10.000000000 10.020323221 12.520404599 +2.161290323 3.322580645 10.000000000 10.217239082 12.726188365 +2.161290323 3.612903226 10.000000000 10.438541426 12.978595315 +2.161290323 3.903225806 10.000000000 10.688605148 13.303233716 +2.161290323 4.193548387 10.000000000 10.985194151 13.754553905 +2.161290323 4.483870968 10.000000000 11.368962007 14.431095437 +2.161290323 4.774193548 10.000000000 11.913195856 15.489093970 +2.161290323 5.064516129 10.000000000 12.682234786 17.023032304 +2.161290323 5.354838710 10.000000000 13.342744072 18.155449447 +2.161290323 5.645161290 10.000000000 13.792466240 18.754193916 +2.161290323 5.935483871 10.000000000 14.130816184 19.125588403 +2.161290323 6.225806452 10.000000000 14.413282130 19.412900315 +2.161290323 6.516129032 10.000000000 14.658795531 19.658787254 +2.161290323 6.806451613 10.000000000 14.873037538 19.873037533 +2.161290323 7.096774194 10.000000000 15.000000000 20.000000000 +2.161290323 7.387096774 10.000000000 15.000000000 20.000000000 +2.161290323 7.677419355 10.000000000 15.000000000 20.000000000 +2.161290323 7.967741935 10.000000000 15.000000000 20.000000000 +2.161290323 8.258064516 10.000000000 15.000000000 20.000000000 +2.161290323 8.548387097 10.000000000 15.000000000 20.000000000 +2.161290323 8.838709677 10.000000000 15.000000000 20.000000000 +2.161290323 9.129032258 10.000000000 15.000000000 20.000000000 +2.161290323 9.419354839 10.000000000 15.000000000 20.000000000 +2.161290323 9.709677419 10.000000000 15.000000000 20.000000000 +2.161290323 10.000000000 10.000000000 15.000000000 20.000000000 +2.451612903 1.000000000 10.000000000 10.000000000 12.500000000 +2.451612903 1.290322581 10.000000000 10.000000000 12.500000000 +2.451612903 1.580645161 10.000000000 10.000000000 12.500000000 +2.451612903 1.870967742 10.000000000 10.000000000 12.500000000 +2.451612903 2.161290323 10.000000000 10.000000000 12.500000000 +2.451612903 2.451612903 10.000000000 10.000000000 12.500000000 +2.451612903 2.741935484 10.000000000 10.000000000 12.500000000 +2.451612903 3.032258065 10.000000000 10.020323221 12.520404599 +2.451612903 3.322580645 10.000000000 10.217239082 12.726188365 +2.451612903 3.612903226 10.000000000 10.438541426 12.978595315 +2.451612903 3.903225806 10.000000000 10.688605148 13.303233716 +2.451612903 4.193548387 10.000000000 10.985194151 13.754553905 +2.451612903 4.483870968 10.000000000 11.368962007 14.431095437 +2.451612903 4.774193548 10.000000000 11.913195856 15.489093970 +2.451612903 5.064516129 10.000000000 12.682234786 17.023032304 +2.451612903 5.354838710 10.000000000 13.342744072 18.155449447 +2.451612903 5.645161290 10.000000000 13.792466240 18.754193916 +2.451612903 5.935483871 10.000000000 14.130816184 19.125588403 +2.451612903 6.225806452 10.000000000 14.413282130 19.412900315 +2.451612903 6.516129032 10.000000000 14.658795531 19.658787254 +2.451612903 6.806451613 10.000000000 14.873037538 19.873037533 +2.451612903 7.096774194 10.000000000 15.000000000 20.000000000 +2.451612903 7.387096774 10.000000000 15.000000000 20.000000000 +2.451612903 7.677419355 10.000000000 15.000000000 20.000000000 +2.451612903 7.967741935 10.000000000 15.000000000 20.000000000 +2.451612903 8.258064516 10.000000000 15.000000000 20.000000000 +2.451612903 8.548387097 10.000000000 15.000000000 20.000000000 +2.451612903 8.838709677 10.000000000 15.000000000 20.000000000 +2.451612903 9.129032258 10.000000000 15.000000000 20.000000000 +2.451612903 9.419354839 10.000000000 15.000000000 20.000000000 +2.451612903 9.709677419 10.000000000 15.000000000 20.000000000 +2.451612903 10.000000000 10.000000000 15.000000000 20.000000000 +2.741935484 1.000000000 10.000000000 10.000000000 12.500000000 +2.741935484 1.290322581 10.000000000 10.000000000 12.500000000 +2.741935484 1.580645161 10.000000000 10.000000000 12.500000000 +2.741935484 1.870967742 10.000000000 10.000000000 12.500000000 +2.741935484 2.161290323 10.000000000 10.000000000 12.500000000 +2.741935484 2.451612903 10.000000000 10.000000000 12.500000000 +2.741935484 2.741935484 10.000000000 10.000000000 12.500000000 +2.741935484 3.032258065 10.000000000 10.020323221 12.520404599 +2.741935484 3.322580645 10.000000000 10.217239082 12.726188365 +2.741935484 3.612903226 10.000000000 10.438541426 12.978595315 +2.741935484 3.903225806 10.000000000 10.688605148 13.303233716 +2.741935484 4.193548387 10.000000000 10.985194151 13.754553905 +2.741935484 4.483870968 10.000000000 11.368962007 14.431095437 +2.741935484 4.774193548 10.000000000 11.913195856 15.489093970 +2.741935484 5.064516129 10.000000000 12.682234786 17.023032304 +2.741935484 5.354838710 10.000000000 13.342744072 18.155449447 +2.741935484 5.645161290 10.000000000 13.792466240 18.754193916 +2.741935484 5.935483871 10.000000000 14.130816184 19.125588403 +2.741935484 6.225806452 10.000000000 14.413282130 19.412900315 +2.741935484 6.516129032 10.000000000 14.658795531 19.658787254 +2.741935484 6.806451613 10.000000000 14.873037538 19.873037533 +2.741935484 7.096774194 10.000000000 15.000000000 20.000000000 +2.741935484 7.387096774 10.000000000 15.000000000 20.000000000 +2.741935484 7.677419355 10.000000000 15.000000000 20.000000000 +2.741935484 7.967741935 10.000000000 15.000000000 20.000000000 +2.741935484 8.258064516 10.000000000 15.000000000 20.000000000 +2.741935484 8.548387097 10.000000000 15.000000000 20.000000000 +2.741935484 8.838709677 10.000000000 15.000000000 20.000000000 +2.741935484 9.129032258 10.000000000 15.000000000 20.000000000 +2.741935484 9.419354839 10.000000000 15.000000000 20.000000000 +2.741935484 9.709677419 10.000000000 15.000000000 20.000000000 +2.741935484 10.000000000 10.000000000 15.000000000 20.000000000 +3.032258065 1.000000000 10.000000000 10.020564138 12.530362554 +3.032258065 1.290322581 10.000000000 10.020564138 12.530362554 +3.032258065 1.580645161 10.000000000 10.020564138 12.530362554 +3.032258065 1.870967742 10.000000000 10.020564138 12.530362554 +3.032258065 2.161290323 10.000000000 10.020564138 12.530362554 +3.032258065 2.451612903 10.000000000 10.020564138 12.530362554 +3.032258065 2.741935484 10.000000000 10.020564138 12.530362554 +3.032258065 3.032258065 10.000081623 10.040234008 12.549713610 +3.032258065 3.322580645 10.000845356 10.231330430 12.745817533 +3.032258065 3.612903226 10.001660504 10.447099078 12.988462480 +3.032258065 3.903225806 10.002536324 10.692131028 13.303660935 +3.032258065 4.193548387 10.003506957 10.984311315 13.746235339 +3.032258065 4.483870968 10.004651223 11.364421081 14.415312194 +3.032258065 4.774193548 10.006135391 11.906301747 15.468939718 +3.032258065 5.064516129 10.008304662 12.675977549 17.006125822 +3.032258065 5.354838710 10.010797104 13.339232540 18.145674121 +3.032258065 5.645161290 10.013072877 13.791275308 18.749121698 +3.032258065 5.935483871 10.014992751 14.131144375 19.123168222 +3.032258065 6.225806452 10.016597454 14.414457255 19.412112587 +3.032258065 6.516129032 10.018017808 14.660147444 19.658914932 +3.032258065 6.806451613 10.019388331 14.873835282 19.873347530 +3.032258065 7.096774194 10.020324537 15.000000000 20.000000000 +3.032258065 7.387096774 10.020324537 15.000000000 20.000000000 +3.032258065 7.677419355 10.020324537 15.000000000 20.000000000 +3.032258065 7.967741935 10.020324537 15.000000000 20.000000000 +3.032258065 8.258064516 10.020324537 15.000000000 20.000000000 +3.032258065 8.548387097 10.020324537 15.000000000 20.000000000 +3.032258065 8.838709677 10.020324537 15.000000000 20.000000000 +3.032258065 9.129032258 10.020324537 15.000000000 20.000000000 +3.032258065 9.419354839 10.020324537 15.000000000 20.000000000 +3.032258065 9.709677419 10.020324537 15.000000000 20.000000000 +3.032258065 10.000000000 10.020324537 15.000000000 20.000000000 +3.322580645 1.000000000 10.000000000 10.238526001 12.814657118 +3.322580645 1.290322581 10.000000000 10.238526001 12.814657118 +3.322580645 1.580645161 10.000000000 10.238526001 12.814657118 +3.322580645 1.870967742 10.000000000 10.238526001 12.814657118 +3.322580645 2.161290323 10.000000000 10.238526001 12.814657118 +3.322580645 2.451612903 10.000000000 10.238526001 12.814657118 +3.322580645 2.741935484 10.000000000 10.238526001 12.814657118 +3.322580645 3.032258065 10.000810912 10.252160009 12.825094452 +3.322580645 3.322580645 10.008475729 10.390248102 12.941315539 +3.322580645 3.612903226 10.016826559 10.556788308 13.106528324 +3.322580645 3.903225806 10.026007885 10.758435372 13.349926281 +3.322580645 4.193548387 10.036425250 11.014648689 13.729800083 +3.322580645 4.483870968 10.048985641 11.367796303 14.350555384 +3.322580645 4.774193548 10.065636239 11.895433538 15.382805064 +3.322580645 5.064516129 10.090431587 12.665305783 16.934330737 +3.322580645 5.354838710 10.119058291 13.330507836 18.087258535 +3.322580645 5.645161290 10.145318864 13.790875134 18.711237499 +3.322580645 5.935483871 10.167053939 14.138887104 19.103029349 +3.322580645 6.225806452 10.184333797 14.427106637 19.405311407 +3.322580645 6.516129032 10.198472326 14.672873177 19.660047640 +3.322580645 6.806451613 10.210901210 14.880935703 19.876073110 +3.322580645 7.096774194 10.218749520 15.000000005 20.000000000 +3.322580645 7.387096774 10.218749520 15.000000005 20.000000000 +3.322580645 7.677419355 10.218749520 15.000000005 20.000000000 +3.322580645 7.967741935 10.218749520 15.000000005 20.000000000 +3.322580645 8.258064516 10.218749520 15.000000005 20.000000000 +3.322580645 8.548387097 10.218749520 15.000000005 20.000000000 +3.322580645 8.838709677 10.218749520 15.000000005 20.000000000 +3.322580645 9.129032258 10.218749520 15.000000005 20.000000000 +3.322580645 9.419354839 10.218749520 15.000000005 20.000000000 +3.322580645 9.709677419 10.218749520 15.000000005 20.000000000 +3.322580645 10.000000000 10.218749520 15.000000005 20.000000000 +3.612903226 1.000000000 10.000000000 10.504908296 13.128455463 +3.612903226 1.290322581 10.000000000 10.504908296 13.128455463 +3.612903226 1.580645161 10.000000000 10.504908296 13.128455463 +3.612903226 1.870967742 10.000000000 10.504908296 13.128455463 +3.612903226 2.161290323 10.000000000 10.504908296 13.128455463 +3.612903226 2.451612903 10.000000000 10.504908296 13.128455463 +3.612903226 2.741935484 10.000000000 10.504908296 13.128455463 +3.612903226 3.032258065 10.001516539 10.512626733 13.130885405 +3.612903226 3.322580645 10.016001683 10.599926822 13.179304000 +3.612903226 3.612903226 10.032129555 10.721202126 13.285286198 +3.612903226 3.903225806 10.050319022 10.885336976 13.480541261 +3.612903226 4.193548387 10.071543600 11.114258924 13.827219367 +3.612903226 4.483870968 10.097850290 11.452875842 14.435424511 +3.612903226 4.774193548 10.133668269 11.980021902 15.481437354 +3.612903226 5.064516129 10.187198497 12.733746068 17.004065185 +3.612903226 5.354838710 10.247964197 13.361747553 18.081408199 +3.612903226 5.645161290 10.304036539 13.808753893 18.687360629 +3.612903226 5.935483871 10.350251618 14.155213729 19.086063787 +3.612903226 6.225806452 10.386088635 14.443553815 19.399366077 +3.612903226 6.516129032 10.413832571 14.686735031 19.661496202 +3.612903226 6.806451613 10.436235155 14.888005490 19.878875276 +3.612903226 7.096774194 10.449261329 15.000000885 20.000000000 +3.612903226 7.387096774 10.449261329 15.000000885 20.000000000 +3.612903226 7.677419355 10.449261329 15.000000885 20.000000000 +3.612903226 7.967741935 10.449261329 15.000000885 20.000000000 +3.612903226 8.258064516 10.449261329 15.000000885 20.000000000 +3.612903226 8.548387097 10.449261329 15.000000885 20.000000000 +3.612903226 8.838709677 10.449261329 15.000000885 20.000000000 +3.612903226 9.129032258 10.449261329 15.000000885 20.000000000 +3.612903226 9.419354839 10.449261329 15.000000885 20.000000000 +3.612903226 9.709677419 10.449261329 15.000000885 20.000000000 +3.612903226 10.000000000 10.449261329 15.000000885 20.000000000 +3.903225806 1.000000000 10.000000000 10.810170511 13.504826188 +3.903225806 1.290322581 10.000000000 10.810170511 13.504826188 +3.903225806 1.580645161 10.000000000 10.810170511 13.504826188 +3.903225806 1.870967742 10.000000000 10.810170511 13.504826188 +3.903225806 2.161290323 10.000000000 10.810170511 13.504826188 +3.903225806 2.451612903 10.000000000 10.810170511 13.504826188 +3.903225806 2.741935484 10.000000000 10.810170511 13.504826188 +3.903225806 3.032258065 10.002191475 10.812567996 13.499944985 +3.903225806 3.322580645 10.023341607 10.855521242 13.491036767 +3.903225806 3.612903226 10.047419391 10.939710572 13.555284598 +3.903225806 3.903225806 10.075341637 11.076302955 13.726499490 +3.903225806 4.193548387 10.108936013 11.290254243 14.070909786 +3.903225806 4.483870968 10.151939277 11.629038311 14.703300699 +3.903225806 4.774193548 10.212336488 12.166773063 15.791280803 +3.903225806 5.064516129 10.300093175 12.865867633 17.184787504 +3.903225806 5.354838710 10.397549799 13.425616094 18.115533442 +3.903225806 5.645161290 10.488260676 13.842905617 18.675012612 +3.903225806 5.935483871 10.563899084 14.179759717 19.072515315 +3.903225806 6.225806452 10.622764862 14.463818768 19.394943387 +3.903225806 6.516129032 10.667486100 14.701882692 19.663850989 +3.903225806 6.806451613 10.701911006 14.895189653 19.882050715 +3.903225806 7.096774194 10.721003908 15.000021130 20.000000000 +3.903225806 7.387096774 10.721003908 15.000021130 20.000000000 +3.903225806 7.677419355 10.721003908 15.000021130 20.000000000 +3.903225806 7.967741935 10.721003908 15.000021130 20.000000000 +3.903225806 8.258064516 10.721003908 15.000021130 20.000000000 +3.903225806 8.548387097 10.721003908 15.000021130 20.000000000 +3.903225806 8.838709677 10.721003908 15.000021130 20.000000000 +3.903225806 9.129032258 10.721003908 15.000021130 20.000000000 +3.903225806 9.419354839 10.721003908 15.000021130 20.000000000 +3.903225806 9.709677419 10.721003908 15.000021130 20.000000000 +3.903225806 10.000000000 10.721003908 15.000021130 20.000000000 +4.193548387 1.000000000 10.000000000 11.157523904 14.002629729 +4.193548387 1.290322581 10.000000000 11.157523904 14.002629729 +4.193548387 1.580645161 10.000000000 11.157523904 14.002629729 +4.193548387 1.870967742 10.000000000 11.157523904 14.002629729 +4.193548387 2.161290323 10.000000000 11.157523904 14.002629729 +4.193548387 2.451612903 10.000000000 11.157523904 14.002629729 +4.193548387 2.741935484 10.000000000 11.157523904 14.002629729 +4.193548387 3.032258065 10.002847967 11.155500895 13.991050173 +4.193548387 3.322580645 10.030611301 11.163431904 13.934544815 +4.193548387 3.612903226 10.062937365 11.222007768 13.974464175 +4.193548387 3.903225806 10.101503669 11.344539784 14.146530424 +4.193548387 4.193548387 10.149476613 11.558492423 14.519820638 +4.193548387 4.483870968 10.213067693 11.910494416 15.206102473 +4.193548387 4.774193548 10.304552071 12.447025439 16.305510232 +4.193548387 5.064516129 10.428253360 13.034623096 17.419899680 +4.193548387 5.354838710 10.564830507 13.510543286 18.168936315 +4.193548387 5.645161290 10.693996106 13.890105622 18.670596691 +4.193548387 5.935483871 10.804889687 14.211826878 19.062949046 +4.193548387 6.225806452 10.893985831 14.487804439 19.393012538 +4.193548387 6.516129032 10.963155502 14.718426145 19.667836719 +4.193548387 6.806451613 11.016887401 14.902672746 19.885926843 +4.193548387 7.096774194 11.047340520 15.000210546 20.000000000 +4.193548387 7.387096774 11.047340520 15.000210546 20.000000000 +4.193548387 7.677419355 11.047340520 15.000210546 20.000000000 +4.193548387 7.967741935 11.047340520 15.000210546 20.000000000 +4.193548387 8.258064516 11.047340520 15.000210546 20.000000000 +4.193548387 8.548387097 11.047340520 15.000210546 20.000000000 +4.193548387 8.838709677 11.047340520 15.000210546 20.000000000 +4.193548387 9.129032258 11.047340520 15.000210546 20.000000000 +4.193548387 9.419354839 11.047340520 15.000210546 20.000000000 +4.193548387 9.709677419 11.047340520 15.000210546 20.000000000 +4.193548387 10.000000000 11.047340520 15.000210546 20.000000000 +4.483870968 1.000000000 10.000000000 11.565284816 14.705763295 +4.483870968 1.290322581 10.000000000 11.565284816 14.705763295 +4.483870968 1.580645161 10.000000000 11.565284816 14.705763295 +4.483870968 1.870967742 10.000000000 11.565284816 14.705763295 +4.483870968 2.161290323 10.000000000 11.565284816 14.705763295 +4.483870968 2.451612903 10.000000000 11.565284816 14.705763295 +4.483870968 2.741935484 10.000000000 11.565284816 14.705763295 +4.483870968 3.032258065 10.003518332 11.559971097 14.688531488 +4.483870968 3.322580645 10.038148789 11.544067577 14.596697135 +4.483870968 3.612903226 10.079373052 11.590123754 14.630573226 +4.483870968 3.903225806 10.129999142 11.712651674 14.826642427 +4.483870968 4.193548387 10.195142637 11.937986529 15.249393001 +4.483870968 4.483870968 10.284538090 12.299658730 15.978123106 +4.483870968 4.774193548 10.407288688 12.751308571 16.856785744 +4.483870968 5.064516129 10.566265451 13.210391988 17.648137186 +4.483870968 5.354838710 10.742013612 13.605608156 18.224568495 +4.483870968 5.645161290 10.912944832 13.947123303 18.672577283 +4.483870968 5.935483871 11.066669588 14.250519401 19.058798213 +4.483870968 6.225806452 11.197095817 14.515307747 19.394892563 +4.483870968 6.516129032 11.303930141 14.736513059 19.674293402 +4.483870968 6.806451613 11.391719855 14.910904783 19.890847813 +4.483870968 7.096774194 11.445068797 15.001284580 20.000000000 +4.483870968 7.387096774 11.445068797 15.001284580 20.000000000 +4.483870968 7.677419355 11.445068797 15.001284580 20.000000000 +4.483870968 7.967741935 11.445068797 15.001284580 20.000000000 +4.483870968 8.258064516 11.445068797 15.001284580 20.000000000 +4.483870968 8.548387097 11.445068797 15.001284580 20.000000000 +4.483870968 8.838709677 11.445068797 15.001284580 20.000000000 +4.483870968 9.129032258 11.445068797 15.001284580 20.000000000 +4.483870968 9.419354839 11.445068797 15.001284580 20.000000000 +4.483870968 9.709677419 11.445068797 15.001284580 20.000000000 +4.483870968 10.000000000 11.445068797 15.001284580 20.000000000 +4.774193548 1.000000000 10.000000000 12.058980464 15.701021693 +4.774193548 1.290322581 10.000000000 12.058980464 15.701021693 +4.774193548 1.580645161 10.000000000 12.058980464 15.701021693 +4.774193548 1.870967742 10.000000000 12.058980464 15.701021693 +4.774193548 2.161290323 10.000000000 12.058980464 15.701021693 +4.774193548 2.451612903 10.000000000 12.058980464 15.701021693 +4.774193548 2.741935484 10.000000000 12.058980464 15.701021693 +4.774193548 3.032258065 10.004257800 12.051831158 15.680761274 +4.774193548 3.322580645 10.046560497 12.024384078 15.574111451 +4.774193548 3.612903226 10.098020591 12.068331239 15.617253641 +4.774193548 3.903225806 10.163026519 12.195621174 15.840037790 +4.774193548 4.193548387 10.248842025 12.415213380 16.258998150 +4.774193548 4.483870968 10.362811901 12.699044498 16.776643149 +4.774193548 4.774193548 10.512690124 13.024422676 17.317616013 +4.774193548 5.064516129 10.703263743 13.373149036 17.833118921 +4.774193548 5.354838710 10.916444195 13.703982825 18.277985683 +4.774193548 5.645161290 11.132588599 14.011409556 18.683389813 +4.774193548 5.935483871 11.338852711 14.294853866 19.062628031 +4.774193548 6.225806452 11.526117376 14.546111577 19.402210670 +4.774193548 6.516129032 11.690681294 14.756568825 19.684098329 +4.774193548 6.806451613 11.836523788 14.921219044 19.897134924 +4.774193548 7.096774194 11.931844472 15.005712815 20.000000000 +4.774193548 7.387096774 11.931844472 15.005712815 20.000000000 +4.774193548 7.677419355 11.931844472 15.005712815 20.000000000 +4.774193548 7.967741935 11.931844472 15.005712815 20.000000000 +4.774193548 8.258064516 11.931844472 15.005712815 20.000000000 +4.774193548 8.548387097 11.931844472 15.005712815 20.000000000 +4.774193548 8.838709677 11.931844472 15.005712815 20.000000000 +4.774193548 9.129032258 11.931844472 15.005712815 20.000000000 +4.774193548 9.419354839 11.931844472 15.005712815 20.000000000 +4.774193548 9.709677419 11.931844472 15.005712815 20.000000000 +4.774193548 10.000000000 11.931844472 15.005712815 20.000000000 +5.064516129 1.000000000 10.000000000 12.621619769 16.933368673 +5.064516129 1.290322581 10.000000000 12.621619769 16.933368673 +5.064516129 1.580645161 10.000000000 12.621619769 16.933368673 +5.064516129 1.870967742 10.000000000 12.621619769 16.933368673 +5.064516129 2.161290323 10.000000000 12.621619769 16.933368673 +5.064516129 2.451612903 10.000000000 12.621619769 16.933368673 +5.064516129 2.741935484 10.000000000 12.621619769 16.933368673 +5.064516129 3.032258065 10.005146712 12.614366006 16.914980770 +5.064516129 3.322580645 10.056698295 12.581893441 16.810593662 +5.064516129 3.612903226 10.120169544 12.609005731 16.817436387 +5.064516129 3.903225806 10.200300484 12.693292869 16.924650571 +5.064516129 4.193548387 10.303330308 12.829792446 17.110642790 +5.064516129 4.483870968 10.436761057 13.013559654 17.353140381 +5.064516129 4.774193548 10.608584137 13.242465682 17.640746773 +5.064516129 5.064516129 10.825065934 13.517238305 17.978395774 +5.064516129 5.354838710 11.073354364 13.802678770 18.337797480 +5.064516129 5.645161290 11.338339319 14.080820782 18.709018123 +5.064516129 5.935483871 11.608136235 14.343723093 19.077915408 +5.064516129 6.225806452 11.871234576 14.580152615 19.416716601 +5.064516129 6.516129032 12.120142764 14.779818162 19.698008481 +5.064516129 6.806451613 12.357520482 14.937194312 19.905017104 +5.064516129 7.096774194 12.521102945 15.020319196 20.000000000 +5.064516129 7.387096774 12.521102945 15.020319196 20.000000000 +5.064516129 7.677419355 12.521102945 15.020319196 20.000000000 +5.064516129 7.967741935 12.521102945 15.020319196 20.000000000 +5.064516129 8.258064516 12.521102945 15.020319196 20.000000000 +5.064516129 8.548387097 12.521102945 15.020319196 20.000000000 +5.064516129 8.838709677 12.521102945 15.020319196 20.000000000 +5.064516129 9.129032258 12.521102945 15.020319196 20.000000000 +5.064516129 9.419354839 12.521102945 15.020319196 20.000000000 +5.064516129 9.709677419 12.521102945 15.020319196 20.000000000 +5.064516129 10.000000000 12.521102945 15.020319196 20.000000000 +5.354838710 1.000000000 10.000000000 13.013861899 17.722526667 +5.354838710 1.290322581 10.000000000 13.013861899 17.722526667 +5.354838710 1.580645161 10.000000000 13.013861899 17.722526667 +5.354838710 1.870967742 10.000000000 13.013861899 17.722526667 +5.354838710 2.161290323 10.000000000 13.013861899 17.722526667 +5.354838710 2.451612903 10.000000000 13.013861899 17.722526667 +5.354838710 2.741935484 10.000000000 13.013861899 17.722526667 +5.354838710 3.032258065 10.006014949 13.006869691 17.706851286 +5.354838710 3.322580645 10.066342933 12.965471340 17.593850801 +5.354838710 3.612903226 10.140231454 12.964403129 17.534521084 +5.354838710 3.903225806 10.232270564 13.004888418 17.529033919 +5.354838710 4.193548387 10.348580620 13.088107989 17.575956320 +5.354838710 4.483870968 10.496818921 13.216786998 17.677894459 +5.354838710 4.774193548 10.686051524 13.396186129 17.845882749 +5.354838710 5.064516129 10.925829268 13.632559211 18.099001135 +5.354838710 5.354838710 11.209919760 13.890101018 18.408558307 +5.354838710 5.645161290 11.528570742 14.146225018 18.751087862 +5.354838710 5.935483871 11.872594688 14.391880702 19.105790086 +5.354838710 6.225806452 12.230155222 14.615966067 19.439094903 +5.354838710 6.516129032 12.591079681 14.808684323 19.716275926 +5.354838710 6.806451613 12.955941737 14.967165018 19.914536590 +5.354838710 7.096774194 13.214762751 15.060950730 20.000000000 +5.354838710 7.387096774 13.214762751 15.060950730 20.000000000 +5.354838710 7.677419355 13.214762751 15.060950730 20.000000000 +5.354838710 7.967741935 13.214762751 15.060950730 20.000000000 +5.354838710 8.258064516 13.214762751 15.060950730 20.000000000 +5.354838710 8.548387097 13.214762751 15.060950730 20.000000000 +5.354838710 8.838709677 13.214762751 15.060950730 20.000000000 +5.354838710 9.129032258 13.214762751 15.060950730 20.000000000 +5.354838710 9.419354839 13.214762751 15.060950730 20.000000000 +5.354838710 9.709677419 13.214762751 15.060950730 20.000000000 +5.354838710 10.000000000 13.214762751 15.060950730 20.000000000 +5.645161290 1.000000000 10.000000000 13.244783448 18.109489138 +5.645161290 1.290322581 10.000000000 13.244783448 18.109489138 +5.645161290 1.580645161 10.000000000 13.244783448 18.109489138 +5.645161290 1.870967742 10.000000000 13.244783448 18.109489138 +5.645161290 2.161290323 10.000000000 13.244783448 18.109489138 +5.645161290 2.451612903 10.000000000 13.244783448 18.109489138 +5.645161290 2.741935484 10.000000000 13.244783448 18.109489138 +5.645161290 3.032258065 10.006766298 13.237774154 18.095072669 +5.645161290 3.322580645 10.074459191 13.190872866 17.979911424 +5.645161290 3.612903226 10.156682138 13.175344657 17.894934931 +5.645161290 3.903225806 10.257906448 13.194481414 17.845569901 +5.645161290 4.193548387 10.384363399 13.252314383 17.838705930 +5.645161290 4.483870968 10.544408861 13.354390862 17.885141400 +5.645161290 4.774193548 10.749033088 13.508424871 18.001992097 +5.645161290 5.064516129 11.011983915 13.723146199 18.212857917 +5.645161290 5.354838710 11.333589940 13.962485123 18.489219169 +5.645161290 5.645161290 11.710068477 14.202955697 18.806280615 +5.645161290 5.935483871 12.136994407 14.436640443 19.144415713 +5.645161290 6.225806452 12.604720729 14.654339717 19.468510328 +5.645161290 6.516129032 13.101632560 14.849606989 19.738417145 +5.645161290 6.806451613 13.623727732 15.028577014 19.925489144 +5.645161290 7.096774194 13.996146922 15.158825640 20.000000000 +5.645161290 7.387096774 13.996146922 15.158825640 20.000000000 +5.645161290 7.677419355 13.996146922 15.158825640 20.000000000 +5.645161290 7.967741935 13.996146922 15.158825640 20.000000000 +5.645161290 8.258064516 13.996146922 15.158825640 20.000000000 +5.645161290 8.548387097 13.996146922 15.158825640 20.000000000 +5.645161290 8.838709677 13.996146922 15.158825640 20.000000000 +5.645161290 9.129032258 13.996146922 15.158825640 20.000000000 +5.645161290 9.419354839 13.996146922 15.158825640 20.000000000 +5.645161290 9.709677419 13.996146922 15.158825640 20.000000000 +5.645161290 10.000000000 13.996146922 15.158825640 20.000000000 +5.935483871 1.000000000 10.000000000 13.401208666 18.333970891 +5.935483871 1.290322581 10.000000000 13.401208666 18.333970891 +5.935483871 1.580645161 10.000000000 13.401208666 18.333970891 +5.935483871 1.870967742 10.000000000 13.401208666 18.333970891 +5.935483871 2.161290323 10.000000000 13.401208666 18.333970891 +5.935483871 2.451612903 10.000000000 13.401208666 18.333970891 +5.935483871 2.741935484 10.000000000 13.401208666 18.333970891 +5.935483871 3.032258065 10.007443801 13.394073286 18.320194702 +5.935483871 3.322580645 10.081521395 13.343529838 18.205985651 +5.935483871 3.612903226 10.170606472 13.320092774 18.113408216 +5.935483871 3.903225806 10.279237154 13.327710961 18.049128779 +5.935483871 4.193548387 10.414061629 13.371284478 18.021975049 +5.935483871 4.483870968 10.584551085 13.457309453 18.044566871 +5.935483871 4.774193548 10.804081039 13.594715896 18.135620170 +5.935483871 5.064516129 11.090993693 13.794308290 18.321130673 +5.935483871 5.354838710 11.452089024 14.020655377 18.573380719 +5.935483871 5.645161290 11.890263995 14.250754084 18.868697334 +5.935483871 5.935483871 12.407459638 14.478989354 19.190114288 +5.935483871 6.225806452 12.997671406 14.700310557 19.502878399 +5.935483871 6.516129032 13.647127791 14.916608672 19.763270216 +5.935483871 6.806451613 14.340979512 15.153493506 19.937484405 +5.935483871 7.096774194 14.827685905 15.364218694 20.000000000 +5.935483871 7.387096774 14.827685905 15.364218694 20.000000000 +5.935483871 7.677419355 14.827685905 15.364218694 20.000000000 +5.935483871 7.967741935 14.827685905 15.364218694 20.000000000 +5.935483871 8.258064516 14.827685905 15.364218694 20.000000000 +5.935483871 8.548387097 14.827685905 15.364218694 20.000000000 +5.935483871 8.838709677 14.827685905 15.364218694 20.000000000 +5.935483871 9.129032258 14.827685905 15.364218694 20.000000000 +5.935483871 9.419354839 14.827685905 15.364218694 20.000000000 +5.935483871 9.709677419 14.827685905 15.364218694 20.000000000 +5.935483871 10.000000000 14.827685905 15.364218694 20.000000000 +6.225806452 1.000000000 10.000000000 13.521407226 18.490281826 +6.225806452 1.290322581 10.000000000 13.521407226 18.490281826 +6.225806452 1.580645161 10.000000000 13.521407226 18.490281826 +6.225806452 1.870967742 10.000000000 13.521407226 18.490281826 +6.225806452 2.161290323 10.000000000 13.521407226 18.490281826 +6.225806452 2.451612903 10.000000000 13.521407226 18.490281826 +6.225806452 2.741935484 10.000000000 13.521407226 18.490281826 +6.225806452 3.032258065 10.008103023 13.514140641 18.476969515 +6.225806452 3.322580645 10.088153003 13.460835310 18.364877707 +6.225806452 3.612903226 10.183352044 13.431824922 18.270567249 +6.225806452 3.903225806 10.298530841 13.431203100 18.200721216 +6.225806452 4.193548387 10.441056619 13.464145973 18.164351799 +6.225806452 4.483870968 10.621870428 13.537643724 18.174340531 +6.225806452 4.774193548 10.857112400 13.661628176 18.249929499 +6.225806452 5.064516129 11.170105930 13.849038003 18.418640731 +6.225806452 5.354838710 11.574291401 14.066015685 18.653507307 +6.225806452 5.645161290 12.079699400 14.291251628 18.931644662 +6.225806452 5.935483871 12.694889781 14.523401908 19.238162865 +6.225806452 6.225806452 13.416217710 14.765821293 19.539326380 +6.225806452 6.516129032 14.222918735 15.036827937 19.789435643 +6.225806452 6.806451613 15.078771212 15.391913006 19.950218302 +6.225806452 7.096774194 15.657216132 15.735413612 20.000000000 +6.225806452 7.387096774 15.657216132 15.735413612 20.000000000 +6.225806452 7.677419355 15.657216132 15.735413612 20.000000000 +6.225806452 7.967741935 15.657216132 15.735413612 20.000000000 +6.225806452 8.258064516 15.657216132 15.735413612 20.000000000 +6.225806452 8.548387097 15.657216132 15.735413612 20.000000000 +6.225806452 8.838709677 15.657216132 15.735413612 20.000000000 +6.225806452 9.129032258 15.657216132 15.735413612 20.000000000 +6.225806452 9.419354839 15.657216132 15.735413612 20.000000000 +6.225806452 9.709677419 15.657216132 15.735413612 20.000000000 +6.225806452 10.000000000 15.657216132 15.735413612 20.000000000 +6.516129032 1.000000000 10.000000000 13.619720941 18.608806194 +6.516129032 1.290322581 10.000000000 13.619720941 18.608806194 +6.516129032 1.580645161 10.000000000 13.619720941 18.608806194 +6.516129032 1.870967742 10.000000000 13.619720941 18.608806194 +6.516129032 2.161290323 10.000000000 13.619720941 18.608806194 +6.516129032 2.451612903 10.000000000 13.619720941 18.608806194 +6.516129032 2.741935484 10.000000000 13.619720941 18.608806194 +6.516129032 3.032258065 10.008796065 13.612346679 18.595858277 +6.516129032 3.322580645 10.094914486 13.556805241 18.485913330 +6.516129032 3.612903226 10.196067943 13.523172782 18.391481322 +6.516129032 3.903225806 10.317633610 13.515503749 18.319021613 +6.516129032 4.193548387 10.468057112 13.539104368 18.277428362 +6.516129032 4.483870968 10.660217177 13.601388696 18.279576799 +6.516129032 4.774193548 10.913601861 13.713341965 18.344952152 +6.516129032 5.064516129 11.257202098 13.890353256 18.502068098 +6.516129032 5.354838710 11.711560991 14.101549313 18.724649911 +6.516129032 5.645161290 12.293650185 14.329635734 18.990008501 +6.516129032 5.935483871 13.016511933 14.581790143 19.284476712 +6.516129032 6.225806452 13.873035372 14.877229146 19.575567933 +6.516129032 6.516129032 14.825313064 15.258980220 19.816607913 +6.516129032 6.806451613 15.804467725 15.803140508 19.963873617 +6.516129032 7.096774194 16.431600988 16.299972993 20.000000000 +6.516129032 7.387096774 16.431600988 16.299972993 20.000000000 +6.516129032 7.677419355 16.431600988 16.299972993 20.000000000 +6.516129032 7.967741935 16.431600988 16.299972993 20.000000000 +6.516129032 8.258064516 16.431600988 16.299972993 20.000000000 +6.516129032 8.548387097 16.431600988 16.299972993 20.000000000 +6.516129032 8.838709677 16.431600988 16.299972993 20.000000000 +6.516129032 9.129032258 16.431600988 16.299972993 20.000000000 +6.516129032 9.419354839 16.431600988 16.299972993 20.000000000 +6.516129032 9.709677419 16.431600988 16.299972993 20.000000000 +6.516129032 10.000000000 16.431600988 16.299972993 20.000000000 +6.806451613 1.000000000 10.000000000 13.702140588 18.700568553 +6.806451613 1.290322581 10.000000000 13.702140588 18.700568553 +6.806451613 1.580645161 10.000000000 13.702140588 18.700568553 +6.806451613 1.870967742 10.000000000 13.702140588 18.700568553 +6.806451613 2.161290323 10.000000000 13.702140588 18.700568553 +6.806451613 2.451612903 10.000000000 13.702140588 18.700568553 +6.806451613 2.741935484 10.000000000 13.702140588 18.700568553 +6.806451613 3.032258065 10.009566877 13.694695654 18.687889031 +6.806451613 3.322580645 10.102239226 13.637457673 18.579757963 +6.806451613 3.612903226 10.209597091 13.599971487 18.485773947 +6.806451613 3.903225806 10.337931790 13.586088799 18.412087907 +6.806451613 4.193548387 10.497359572 13.601147106 18.367393881 +6.806451613 4.483870968 10.703550229 13.652988131 18.364466144 +6.806451613 4.774193548 10.980458810 13.753895322 18.422857042 +6.806451613 5.064516129 11.363992774 13.922588347 18.571664806 +6.806451613 5.354838710 11.882332702 14.133990028 18.785431300 +6.806451613 5.645161290 12.557491974 14.380014720 19.041563761 +6.806451613 5.935483871 13.400370731 14.684815949 19.327600979 +6.806451613 6.225806452 14.388065262 15.092179113 19.613100661 +6.806451613 6.516129032 15.452078155 15.660637661 19.848761837 +6.806451613 6.806451613 16.488227443 16.421596031 19.978526735 +6.806451613 7.096774194 17.110750392 17.007626023 20.000000000 +6.806451613 7.387096774 17.110750392 17.007626023 20.000000000 +6.806451613 7.677419355 17.110750392 17.007626023 20.000000000 +6.806451613 7.967741935 17.110750392 17.007626023 20.000000000 +6.806451613 8.258064516 17.110750392 17.007626023 20.000000000 +6.806451613 8.548387097 17.110750392 17.007626023 20.000000000 +6.806451613 8.838709677 17.110750392 17.007626023 20.000000000 +6.806451613 9.129032258 17.110750392 17.007626023 20.000000000 +6.806451613 9.419354839 17.110750392 17.007626023 20.000000000 +6.806451613 9.709677419 17.110750392 17.007626023 20.000000000 +6.806451613 10.000000000 17.110750392 17.007626023 20.000000000 +7.096774194 1.000000000 10.000000000 13.750000000 18.750000000 +7.096774194 1.290322581 10.000000000 13.750000000 18.750000000 +7.096774194 1.580645161 10.000000000 13.750000000 18.750000000 +7.096774194 1.870967742 10.000000000 13.750000000 18.750000000 +7.096774194 2.161290323 10.000000000 13.750000000 18.750000000 +7.096774194 2.451612903 10.000000000 13.750000000 18.750000000 +7.096774194 2.741935484 10.000000000 13.750000000 18.750000000 +7.096774194 3.032258065 10.010142154 13.742536520 18.737455859 +7.096774194 3.322580645 10.107593677 13.684557246 18.630423796 +7.096774194 3.612903226 10.219378581 13.645030600 18.537086952 +7.096774194 3.903225806 10.352768137 13.627557695 18.463319088 +7.096774194 4.193548387 10.519625429 13.637427439 18.417599484 +7.096774194 4.483870968 10.738408418 13.682818578 18.412535791 +7.096774194 4.774193548 11.037217342 13.777278068 18.467583744 +7.096774194 5.064516129 11.457663040 13.943032824 18.612009655 +7.096774194 5.354838710 12.032834518 14.162291151 18.821124666 +7.096774194 5.645161290 12.784673825 14.439131521 19.073000135 +7.096774194 5.935483871 13.714623381 14.815969959 19.357395690 +7.096774194 6.225806452 14.778744019 15.350155064 19.645850060 +7.096774194 6.516129032 15.883198672 16.075414380 19.878699414 +7.096774194 6.806451613 16.909538446 16.932414748 19.986611801 +7.096774194 7.096774194 17.500000000 17.500000000 20.000000000 +7.096774194 7.387096774 17.500000000 17.500000000 20.000000000 +7.096774194 7.677419355 17.500000000 17.500000000 20.000000000 +7.096774194 7.967741935 17.500000000 17.500000000 20.000000000 +7.096774194 8.258064516 17.500000000 17.500000000 20.000000000 +7.096774194 8.548387097 17.500000000 17.500000000 20.000000000 +7.096774194 8.838709677 17.500000000 17.500000000 20.000000000 +7.096774194 9.129032258 17.500000000 17.500000000 20.000000000 +7.096774194 9.419354839 17.500000000 17.500000000 20.000000000 +7.096774194 9.709677419 17.500000000 17.500000000 20.000000000 +7.096774194 10.000000000 17.500000000 17.500000000 20.000000000 +7.387096774 1.000000000 10.000000000 13.750000000 18.750000000 +7.387096774 1.290322581 10.000000000 13.750000000 18.750000000 +7.387096774 1.580645161 10.000000000 13.750000000 18.750000000 +7.387096774 1.870967742 10.000000000 13.750000000 18.750000000 +7.387096774 2.161290323 10.000000000 13.750000000 18.750000000 +7.387096774 2.451612903 10.000000000 13.750000000 18.750000000 +7.387096774 2.741935484 10.000000000 13.750000000 18.750000000 +7.387096774 3.032258065 10.010142154 13.742536520 18.737455859 +7.387096774 3.322580645 10.107593677 13.684557246 18.630423796 +7.387096774 3.612903226 10.219378581 13.645030600 18.537086952 +7.387096774 3.903225806 10.352768137 13.627557695 18.463319088 +7.387096774 4.193548387 10.519625429 13.637427439 18.417599484 +7.387096774 4.483870968 10.738408418 13.682818578 18.412535791 +7.387096774 4.774193548 11.037217342 13.777278068 18.467583744 +7.387096774 5.064516129 11.457663040 13.943032824 18.612009655 +7.387096774 5.354838710 12.032834518 14.162291151 18.821124666 +7.387096774 5.645161290 12.784673825 14.439131521 19.073000135 +7.387096774 5.935483871 13.714623381 14.815969959 19.357395690 +7.387096774 6.225806452 14.778744019 15.350155064 19.645850060 +7.387096774 6.516129032 15.883198672 16.075414380 19.878699414 +7.387096774 6.806451613 16.909538446 16.932414748 19.986611801 +7.387096774 7.096774194 17.500000000 17.500000000 20.000000000 +7.387096774 7.387096774 17.500000000 17.500000000 20.000000000 +7.387096774 7.677419355 17.500000000 17.500000000 20.000000000 +7.387096774 7.967741935 17.500000000 17.500000000 20.000000000 +7.387096774 8.258064516 17.500000000 17.500000000 20.000000000 +7.387096774 8.548387097 17.500000000 17.500000000 20.000000000 +7.387096774 8.838709677 17.500000000 17.500000000 20.000000000 +7.387096774 9.129032258 17.500000000 17.500000000 20.000000000 +7.387096774 9.419354839 17.500000000 17.500000000 20.000000000 +7.387096774 9.709677419 17.500000000 17.500000000 20.000000000 +7.387096774 10.000000000 17.500000000 17.500000000 20.000000000 +7.677419355 1.000000000 10.000000000 13.750000000 18.750000000 +7.677419355 1.290322581 10.000000000 13.750000000 18.750000000 +7.677419355 1.580645161 10.000000000 13.750000000 18.750000000 +7.677419355 1.870967742 10.000000000 13.750000000 18.750000000 +7.677419355 2.161290323 10.000000000 13.750000000 18.750000000 +7.677419355 2.451612903 10.000000000 13.750000000 18.750000000 +7.677419355 2.741935484 10.000000000 13.750000000 18.750000000 +7.677419355 3.032258065 10.010142154 13.742536520 18.737455859 +7.677419355 3.322580645 10.107593677 13.684557246 18.630423796 +7.677419355 3.612903226 10.219378581 13.645030600 18.537086952 +7.677419355 3.903225806 10.352768137 13.627557695 18.463319088 +7.677419355 4.193548387 10.519625429 13.637427439 18.417599484 +7.677419355 4.483870968 10.738408418 13.682818578 18.412535791 +7.677419355 4.774193548 11.037217342 13.777278068 18.467583744 +7.677419355 5.064516129 11.457663040 13.943032824 18.612009655 +7.677419355 5.354838710 12.032834518 14.162291151 18.821124666 +7.677419355 5.645161290 12.784673825 14.439131521 19.073000135 +7.677419355 5.935483871 13.714623381 14.815969959 19.357395690 +7.677419355 6.225806452 14.778744019 15.350155064 19.645850060 +7.677419355 6.516129032 15.883198672 16.075414380 19.878699414 +7.677419355 6.806451613 16.909538446 16.932414748 19.986611801 +7.677419355 7.096774194 17.500000000 17.500000000 20.000000000 +7.677419355 7.387096774 17.500000000 17.500000000 20.000000000 +7.677419355 7.677419355 17.500000000 17.500000000 20.000000000 +7.677419355 7.967741935 17.500000000 17.500000000 20.000000000 +7.677419355 8.258064516 17.500000000 17.500000000 20.000000000 +7.677419355 8.548387097 17.500000000 17.500000000 20.000000000 +7.677419355 8.838709677 17.500000000 17.500000000 20.000000000 +7.677419355 9.129032258 17.500000000 17.500000000 20.000000000 +7.677419355 9.419354839 17.500000000 17.500000000 20.000000000 +7.677419355 9.709677419 17.500000000 17.500000000 20.000000000 +7.677419355 10.000000000 17.500000000 17.500000000 20.000000000 +7.967741935 1.000000000 10.000000000 13.750000000 18.750000000 +7.967741935 1.290322581 10.000000000 13.750000000 18.750000000 +7.967741935 1.580645161 10.000000000 13.750000000 18.750000000 +7.967741935 1.870967742 10.000000000 13.750000000 18.750000000 +7.967741935 2.161290323 10.000000000 13.750000000 18.750000000 +7.967741935 2.451612903 10.000000000 13.750000000 18.750000000 +7.967741935 2.741935484 10.000000000 13.750000000 18.750000000 +7.967741935 3.032258065 10.010142154 13.742536520 18.737455859 +7.967741935 3.322580645 10.107593677 13.684557246 18.630423796 +7.967741935 3.612903226 10.219378581 13.645030600 18.537086952 +7.967741935 3.903225806 10.352768137 13.627557695 18.463319088 +7.967741935 4.193548387 10.519625429 13.637427439 18.417599484 +7.967741935 4.483870968 10.738408418 13.682818578 18.412535791 +7.967741935 4.774193548 11.037217342 13.777278068 18.467583744 +7.967741935 5.064516129 11.457663040 13.943032824 18.612009655 +7.967741935 5.354838710 12.032834518 14.162291151 18.821124666 +7.967741935 5.645161290 12.784673825 14.439131521 19.073000135 +7.967741935 5.935483871 13.714623381 14.815969959 19.357395690 +7.967741935 6.225806452 14.778744019 15.350155064 19.645850060 +7.967741935 6.516129032 15.883198672 16.075414380 19.878699414 +7.967741935 6.806451613 16.909538446 16.932414748 19.986611801 +7.967741935 7.096774194 17.500000000 17.500000000 20.000000000 +7.967741935 7.387096774 17.500000000 17.500000000 20.000000000 +7.967741935 7.677419355 17.500000000 17.500000000 20.000000000 +7.967741935 7.967741935 17.500000000 17.500000000 20.000000000 +7.967741935 8.258064516 17.500000000 17.500000000 20.000000000 +7.967741935 8.548387097 17.500000000 17.500000000 20.000000000 +7.967741935 8.838709677 17.500000000 17.500000000 20.000000000 +7.967741935 9.129032258 17.500000000 17.500000000 20.000000000 +7.967741935 9.419354839 17.500000000 17.500000000 20.000000000 +7.967741935 9.709677419 17.500000000 17.500000000 20.000000000 +7.967741935 10.000000000 17.500000000 17.500000000 20.000000000 +8.258064516 1.000000000 10.000000000 13.750000000 18.750000000 +8.258064516 1.290322581 10.000000000 13.750000000 18.750000000 +8.258064516 1.580645161 10.000000000 13.750000000 18.750000000 +8.258064516 1.870967742 10.000000000 13.750000000 18.750000000 +8.258064516 2.161290323 10.000000000 13.750000000 18.750000000 +8.258064516 2.451612903 10.000000000 13.750000000 18.750000000 +8.258064516 2.741935484 10.000000000 13.750000000 18.750000000 +8.258064516 3.032258065 10.010142154 13.742536520 18.737455859 +8.258064516 3.322580645 10.107593677 13.684557246 18.630423796 +8.258064516 3.612903226 10.219378581 13.645030600 18.537086952 +8.258064516 3.903225806 10.352768137 13.627557695 18.463319088 +8.258064516 4.193548387 10.519625429 13.637427439 18.417599484 +8.258064516 4.483870968 10.738408418 13.682818578 18.412535791 +8.258064516 4.774193548 11.037217342 13.777278068 18.467583744 +8.258064516 5.064516129 11.457663040 13.943032824 18.612009655 +8.258064516 5.354838710 12.032834518 14.162291151 18.821124666 +8.258064516 5.645161290 12.784673825 14.439131521 19.073000135 +8.258064516 5.935483871 13.714623381 14.815969959 19.357395690 +8.258064516 6.225806452 14.778744019 15.350155064 19.645850060 +8.258064516 6.516129032 15.883198672 16.075414380 19.878699414 +8.258064516 6.806451613 16.909538446 16.932414748 19.986611801 +8.258064516 7.096774194 17.500000000 17.500000000 20.000000000 +8.258064516 7.387096774 17.500000000 17.500000000 20.000000000 +8.258064516 7.677419355 17.500000000 17.500000000 20.000000000 +8.258064516 7.967741935 17.500000000 17.500000000 20.000000000 +8.258064516 8.258064516 17.500000000 17.500000000 20.000000000 +8.258064516 8.548387097 17.500000000 17.500000000 20.000000000 +8.258064516 8.838709677 17.500000000 17.500000000 20.000000000 +8.258064516 9.129032258 17.500000000 17.500000000 20.000000000 +8.258064516 9.419354839 17.500000000 17.500000000 20.000000000 +8.258064516 9.709677419 17.500000000 17.500000000 20.000000000 +8.258064516 10.000000000 17.500000000 17.500000000 20.000000000 +8.548387097 1.000000000 10.000000000 13.750000000 18.750000000 +8.548387097 1.290322581 10.000000000 13.750000000 18.750000000 +8.548387097 1.580645161 10.000000000 13.750000000 18.750000000 +8.548387097 1.870967742 10.000000000 13.750000000 18.750000000 +8.548387097 2.161290323 10.000000000 13.750000000 18.750000000 +8.548387097 2.451612903 10.000000000 13.750000000 18.750000000 +8.548387097 2.741935484 10.000000000 13.750000000 18.750000000 +8.548387097 3.032258065 10.010142154 13.742536520 18.737455859 +8.548387097 3.322580645 10.107593677 13.684557246 18.630423796 +8.548387097 3.612903226 10.219378581 13.645030600 18.537086952 +8.548387097 3.903225806 10.352768137 13.627557695 18.463319088 +8.548387097 4.193548387 10.519625429 13.637427439 18.417599484 +8.548387097 4.483870968 10.738408418 13.682818578 18.412535791 +8.548387097 4.774193548 11.037217342 13.777278068 18.467583744 +8.548387097 5.064516129 11.457663040 13.943032824 18.612009655 +8.548387097 5.354838710 12.032834518 14.162291151 18.821124666 +8.548387097 5.645161290 12.784673825 14.439131521 19.073000135 +8.548387097 5.935483871 13.714623381 14.815969959 19.357395690 +8.548387097 6.225806452 14.778744019 15.350155064 19.645850060 +8.548387097 6.516129032 15.883198672 16.075414380 19.878699414 +8.548387097 6.806451613 16.909538446 16.932414748 19.986611801 +8.548387097 7.096774194 17.500000000 17.500000000 20.000000000 +8.548387097 7.387096774 17.500000000 17.500000000 20.000000000 +8.548387097 7.677419355 17.500000000 17.500000000 20.000000000 +8.548387097 7.967741935 17.500000000 17.500000000 20.000000000 +8.548387097 8.258064516 17.500000000 17.500000000 20.000000000 +8.548387097 8.548387097 17.500000000 17.500000000 20.000000000 +8.548387097 8.838709677 17.500000000 17.500000000 20.000000000 +8.548387097 9.129032258 17.500000000 17.500000000 20.000000000 +8.548387097 9.419354839 17.500000000 17.500000000 20.000000000 +8.548387097 9.709677419 17.500000000 17.500000000 20.000000000 +8.548387097 10.000000000 17.500000000 17.500000000 20.000000000 +8.838709677 1.000000000 10.000000000 13.750000000 18.750000000 +8.838709677 1.290322581 10.000000000 13.750000000 18.750000000 +8.838709677 1.580645161 10.000000000 13.750000000 18.750000000 +8.838709677 1.870967742 10.000000000 13.750000000 18.750000000 +8.838709677 2.161290323 10.000000000 13.750000000 18.750000000 +8.838709677 2.451612903 10.000000000 13.750000000 18.750000000 +8.838709677 2.741935484 10.000000000 13.750000000 18.750000000 +8.838709677 3.032258065 10.010142154 13.742536520 18.737455859 +8.838709677 3.322580645 10.107593677 13.684557246 18.630423796 +8.838709677 3.612903226 10.219378581 13.645030600 18.537086952 +8.838709677 3.903225806 10.352768137 13.627557695 18.463319088 +8.838709677 4.193548387 10.519625429 13.637427439 18.417599484 +8.838709677 4.483870968 10.738408418 13.682818578 18.412535791 +8.838709677 4.774193548 11.037217342 13.777278068 18.467583744 +8.838709677 5.064516129 11.457663040 13.943032824 18.612009655 +8.838709677 5.354838710 12.032834518 14.162291151 18.821124666 +8.838709677 5.645161290 12.784673825 14.439131521 19.073000135 +8.838709677 5.935483871 13.714623381 14.815969959 19.357395690 +8.838709677 6.225806452 14.778744019 15.350155064 19.645850060 +8.838709677 6.516129032 15.883198672 16.075414380 19.878699414 +8.838709677 6.806451613 16.909538446 16.932414748 19.986611801 +8.838709677 7.096774194 17.500000000 17.500000000 20.000000000 +8.838709677 7.387096774 17.500000000 17.500000000 20.000000000 +8.838709677 7.677419355 17.500000000 17.500000000 20.000000000 +8.838709677 7.967741935 17.500000000 17.500000000 20.000000000 +8.838709677 8.258064516 17.500000000 17.500000000 20.000000000 +8.838709677 8.548387097 17.500000000 17.500000000 20.000000000 +8.838709677 8.838709677 17.500000000 17.500000000 20.000000000 +8.838709677 9.129032258 17.500000000 17.500000000 20.000000000 +8.838709677 9.419354839 17.500000000 17.500000000 20.000000000 +8.838709677 9.709677419 17.500000000 17.500000000 20.000000000 +8.838709677 10.000000000 17.500000000 17.500000000 20.000000000 +9.129032258 1.000000000 10.000000000 13.750000000 18.750000000 +9.129032258 1.290322581 10.000000000 13.750000000 18.750000000 +9.129032258 1.580645161 10.000000000 13.750000000 18.750000000 +9.129032258 1.870967742 10.000000000 13.750000000 18.750000000 +9.129032258 2.161290323 10.000000000 13.750000000 18.750000000 +9.129032258 2.451612903 10.000000000 13.750000000 18.750000000 +9.129032258 2.741935484 10.000000000 13.750000000 18.750000000 +9.129032258 3.032258065 10.010142154 13.742536520 18.737455859 +9.129032258 3.322580645 10.107593677 13.684557246 18.630423796 +9.129032258 3.612903226 10.219378581 13.645030600 18.537086952 +9.129032258 3.903225806 10.352768137 13.627557695 18.463319088 +9.129032258 4.193548387 10.519625429 13.637427439 18.417599484 +9.129032258 4.483870968 10.738408418 13.682818578 18.412535791 +9.129032258 4.774193548 11.037217342 13.777278068 18.467583744 +9.129032258 5.064516129 11.457663040 13.943032824 18.612009655 +9.129032258 5.354838710 12.032834518 14.162291151 18.821124666 +9.129032258 5.645161290 12.784673825 14.439131521 19.073000135 +9.129032258 5.935483871 13.714623381 14.815969959 19.357395690 +9.129032258 6.225806452 14.778744019 15.350155064 19.645850060 +9.129032258 6.516129032 15.883198672 16.075414380 19.878699414 +9.129032258 6.806451613 16.909538446 16.932414748 19.986611801 +9.129032258 7.096774194 17.500000000 17.500000000 20.000000000 +9.129032258 7.387096774 17.500000000 17.500000000 20.000000000 +9.129032258 7.677419355 17.500000000 17.500000000 20.000000000 +9.129032258 7.967741935 17.500000000 17.500000000 20.000000000 +9.129032258 8.258064516 17.500000000 17.500000000 20.000000000 +9.129032258 8.548387097 17.500000000 17.500000000 20.000000000 +9.129032258 8.838709677 17.500000000 17.500000000 20.000000000 +9.129032258 9.129032258 17.500000000 17.500000000 20.000000000 +9.129032258 9.419354839 17.500000000 17.500000000 20.000000000 +9.129032258 9.709677419 17.500000000 17.500000000 20.000000000 +9.129032258 10.000000000 17.500000000 17.500000000 20.000000000 +9.419354839 1.000000000 10.000000000 13.750000000 18.750000000 +9.419354839 1.290322581 10.000000000 13.750000000 18.750000000 +9.419354839 1.580645161 10.000000000 13.750000000 18.750000000 +9.419354839 1.870967742 10.000000000 13.750000000 18.750000000 +9.419354839 2.161290323 10.000000000 13.750000000 18.750000000 +9.419354839 2.451612903 10.000000000 13.750000000 18.750000000 +9.419354839 2.741935484 10.000000000 13.750000000 18.750000000 +9.419354839 3.032258065 10.010142154 13.742536520 18.737455859 +9.419354839 3.322580645 10.107593677 13.684557246 18.630423796 +9.419354839 3.612903226 10.219378581 13.645030600 18.537086952 +9.419354839 3.903225806 10.352768137 13.627557695 18.463319088 +9.419354839 4.193548387 10.519625429 13.637427439 18.417599484 +9.419354839 4.483870968 10.738408418 13.682818578 18.412535791 +9.419354839 4.774193548 11.037217342 13.777278068 18.467583744 +9.419354839 5.064516129 11.457663040 13.943032824 18.612009655 +9.419354839 5.354838710 12.032834518 14.162291151 18.821124666 +9.419354839 5.645161290 12.784673825 14.439131521 19.073000135 +9.419354839 5.935483871 13.714623381 14.815969959 19.357395690 +9.419354839 6.225806452 14.778744019 15.350155064 19.645850060 +9.419354839 6.516129032 15.883198672 16.075414380 19.878699414 +9.419354839 6.806451613 16.909538446 16.932414748 19.986611801 +9.419354839 7.096774194 17.500000000 17.500000000 20.000000000 +9.419354839 7.387096774 17.500000000 17.500000000 20.000000000 +9.419354839 7.677419355 17.500000000 17.500000000 20.000000000 +9.419354839 7.967741935 17.500000000 17.500000000 20.000000000 +9.419354839 8.258064516 17.500000000 17.500000000 20.000000000 +9.419354839 8.548387097 17.500000000 17.500000000 20.000000000 +9.419354839 8.838709677 17.500000000 17.500000000 20.000000000 +9.419354839 9.129032258 17.500000000 17.500000000 20.000000000 +9.419354839 9.419354839 17.500000000 17.500000000 20.000000000 +9.419354839 9.709677419 17.500000000 17.500000000 20.000000000 +9.419354839 10.000000000 17.500000000 17.500000000 20.000000000 +9.709677419 1.000000000 10.000000000 13.750000000 18.750000000 +9.709677419 1.290322581 10.000000000 13.750000000 18.750000000 +9.709677419 1.580645161 10.000000000 13.750000000 18.750000000 +9.709677419 1.870967742 10.000000000 13.750000000 18.750000000 +9.709677419 2.161290323 10.000000000 13.750000000 18.750000000 +9.709677419 2.451612903 10.000000000 13.750000000 18.750000000 +9.709677419 2.741935484 10.000000000 13.750000000 18.750000000 +9.709677419 3.032258065 10.010142154 13.742536520 18.737455859 +9.709677419 3.322580645 10.107593677 13.684557246 18.630423796 +9.709677419 3.612903226 10.219378581 13.645030600 18.537086952 +9.709677419 3.903225806 10.352768137 13.627557695 18.463319088 +9.709677419 4.193548387 10.519625429 13.637427439 18.417599484 +9.709677419 4.483870968 10.738408418 13.682818578 18.412535791 +9.709677419 4.774193548 11.037217342 13.777278068 18.467583744 +9.709677419 5.064516129 11.457663040 13.943032824 18.612009655 +9.709677419 5.354838710 12.032834518 14.162291151 18.821124666 +9.709677419 5.645161290 12.784673825 14.439131521 19.073000135 +9.709677419 5.935483871 13.714623381 14.815969959 19.357395690 +9.709677419 6.225806452 14.778744019 15.350155064 19.645850060 +9.709677419 6.516129032 15.883198672 16.075414380 19.878699414 +9.709677419 6.806451613 16.909538446 16.932414748 19.986611801 +9.709677419 7.096774194 17.500000000 17.500000000 20.000000000 +9.709677419 7.387096774 17.500000000 17.500000000 20.000000000 +9.709677419 7.677419355 17.500000000 17.500000000 20.000000000 +9.709677419 7.967741935 17.500000000 17.500000000 20.000000000 +9.709677419 8.258064516 17.500000000 17.500000000 20.000000000 +9.709677419 8.548387097 17.500000000 17.500000000 20.000000000 +9.709677419 8.838709677 17.500000000 17.500000000 20.000000000 +9.709677419 9.129032258 17.500000000 17.500000000 20.000000000 +9.709677419 9.419354839 17.500000000 17.500000000 20.000000000 +9.709677419 9.709677419 17.500000000 17.500000000 20.000000000 +9.709677419 10.000000000 17.500000000 17.500000000 20.000000000 +10.000000000 1.000000000 10.000000000 13.750000000 18.750000000 +10.000000000 1.290322581 10.000000000 13.750000000 18.750000000 +10.000000000 1.580645161 10.000000000 13.750000000 18.750000000 +10.000000000 1.870967742 10.000000000 13.750000000 18.750000000 +10.000000000 2.161290323 10.000000000 13.750000000 18.750000000 +10.000000000 2.451612903 10.000000000 13.750000000 18.750000000 +10.000000000 2.741935484 10.000000000 13.750000000 18.750000000 +10.000000000 3.032258065 10.010142154 13.742536520 18.737455859 +10.000000000 3.322580645 10.107593677 13.684557246 18.630423796 +10.000000000 3.612903226 10.219378581 13.645030600 18.537086952 +10.000000000 3.903225806 10.352768137 13.627557695 18.463319088 +10.000000000 4.193548387 10.519625429 13.637427439 18.417599484 +10.000000000 4.483870968 10.738408418 13.682818578 18.412535791 +10.000000000 4.774193548 11.037217342 13.777278068 18.467583744 +10.000000000 5.064516129 11.457663040 13.943032824 18.612009655 +10.000000000 5.354838710 12.032834518 14.162291151 18.821124666 +10.000000000 5.645161290 12.784673825 14.439131521 19.073000135 +10.000000000 5.935483871 13.714623381 14.815969959 19.357395690 +10.000000000 6.225806452 14.778744019 15.350155064 19.645850060 +10.000000000 6.516129032 15.883198672 16.075414380 19.878699414 +10.000000000 6.806451613 16.909538446 16.932414748 19.986611801 +10.000000000 7.096774194 17.500000000 17.500000000 20.000000000 +10.000000000 7.387096774 17.500000000 17.500000000 20.000000000 +10.000000000 7.677419355 17.500000000 17.500000000 20.000000000 +10.000000000 7.967741935 17.500000000 17.500000000 20.000000000 +10.000000000 8.258064516 17.500000000 17.500000000 20.000000000 +10.000000000 8.548387097 17.500000000 17.500000000 20.000000000 +10.000000000 8.838709677 17.500000000 17.500000000 20.000000000 +10.000000000 9.129032258 17.500000000 17.500000000 20.000000000 +10.000000000 9.419354839 17.500000000 17.500000000 20.000000000 +10.000000000 9.709677419 17.500000000 17.500000000 20.000000000 +10.000000000 10.000000000 17.500000000 17.500000000 20.000000000 diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.fll b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fll new file mode 100644 index 0000000..1b51806 --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.fll @@ -0,0 +1,62 @@ +Engine: sugeno_tip_calculator +InputVariable: FoodQuality + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +InputVariable: Service + enabled: true + range: 1.000 10.000 + lock-range: false + term: Bad Trapezoid 0.000 1.000 3.000 7.000 + term: Good Trapezoid 3.000 7.000 10.000 11.000 +OutputVariable: CheapTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: AverageTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +OutputVariable: GenerousTip + enabled: true + range: 5.000 25.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage TakagiSugeno + default: nan + lock-previous: false + term: Low Constant 10.000 + term: Medium Constant 15.000 + term: High Constant 20.000 +RuleBlock: + enabled: true + conjunction: EinsteinProduct + disjunction: none + implication: none + activation: General + rule: if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low + rule: if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium + rule: if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High + rule: if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High + rule: if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High
\ No newline at end of file diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.java b/examples/takagi-sugeno/octave/sugeno_tip_calculator.java new file mode 100644 index 0000000..d64e722 --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.java @@ -0,0 +1,109 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class sugeno_tip_calculator{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("sugeno_tip_calculator"); +engine.setDescription(""); + +InputVariable FoodQuality = new InputVariable(); +FoodQuality.setName("FoodQuality"); +FoodQuality.setDescription(""); +FoodQuality.setEnabled(true); +FoodQuality.setRange(1.000, 10.000); +FoodQuality.setLockValueInRange(false); +FoodQuality.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +FoodQuality.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(FoodQuality); + +InputVariable Service = new InputVariable(); +Service.setName("Service"); +Service.setDescription(""); +Service.setEnabled(true); +Service.setRange(1.000, 10.000); +Service.setLockValueInRange(false); +Service.addTerm(new Trapezoid("Bad", 0.000, 1.000, 3.000, 7.000)); +Service.addTerm(new Trapezoid("Good", 3.000, 7.000, 10.000, 11.000)); +engine.addInputVariable(Service); + +OutputVariable CheapTip = new OutputVariable(); +CheapTip.setName("CheapTip"); +CheapTip.setDescription(""); +CheapTip.setEnabled(true); +CheapTip.setRange(5.000, 25.000); +CheapTip.setLockValueInRange(false); +CheapTip.setAggregation(null); +CheapTip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +CheapTip.setDefaultValue(Double.NaN); +CheapTip.setLockPreviousValue(false); +CheapTip.addTerm(new Constant("Low", 10.000)); +CheapTip.addTerm(new Constant("Medium", 15.000)); +CheapTip.addTerm(new Constant("High", 20.000)); +engine.addOutputVariable(CheapTip); + +OutputVariable AverageTip = new OutputVariable(); +AverageTip.setName("AverageTip"); +AverageTip.setDescription(""); +AverageTip.setEnabled(true); +AverageTip.setRange(5.000, 25.000); +AverageTip.setLockValueInRange(false); +AverageTip.setAggregation(null); +AverageTip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +AverageTip.setDefaultValue(Double.NaN); +AverageTip.setLockPreviousValue(false); +AverageTip.addTerm(new Constant("Low", 10.000)); +AverageTip.addTerm(new Constant("Medium", 15.000)); +AverageTip.addTerm(new Constant("High", 20.000)); +engine.addOutputVariable(AverageTip); + +OutputVariable GenerousTip = new OutputVariable(); +GenerousTip.setName("GenerousTip"); +GenerousTip.setDescription(""); +GenerousTip.setEnabled(true); +GenerousTip.setRange(5.000, 25.000); +GenerousTip.setLockValueInRange(false); +GenerousTip.setAggregation(null); +GenerousTip.setDefuzzifier(new WeightedAverage("TakagiSugeno")); +GenerousTip.setDefaultValue(Double.NaN); +GenerousTip.setLockPreviousValue(false); +GenerousTip.addTerm(new Constant("Low", 10.000)); +GenerousTip.addTerm(new Constant("Medium", 15.000)); +GenerousTip.addTerm(new Constant("High", 20.000)); +engine.addOutputVariable(GenerousTip); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(new EinsteinProduct()); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if FoodQuality is extremely Bad and Service is extremely Bad then CheapTip is extremely Low and AverageTip is very Low and GenerousTip is Low", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is extremely Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is very Good and Service is very Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Bad then CheapTip is Low and AverageTip is Low and GenerousTip is Medium", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is extremely Good and Service is Bad then CheapTip is Low and AverageTip is Medium and GenerousTip is very High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Bad and Service is Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is Good and Service is Good then CheapTip is Medium and AverageTip is Medium and GenerousTip is very High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is very Bad and Service is very Good then CheapTip is Low and AverageTip is Medium and GenerousTip is High", engine)); +ruleBlock.addRule(Rule.parse("if FoodQuality is very very Good and Service is very very Good then CheapTip is High and AverageTip is very High and GenerousTip is extremely High", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/takagi-sugeno/octave/sugeno_tip_calculator.pdf b/examples/takagi-sugeno/octave/sugeno_tip_calculator.pdf Binary files differnew file mode 100644 index 0000000..f138223 --- /dev/null +++ b/examples/takagi-sugeno/octave/sugeno_tip_calculator.pdf diff --git a/examples/tsukamoto/tsukamoto.R b/examples/tsukamoto/tsukamoto.R new file mode 100644 index 0000000..51fbdd4 --- /dev/null +++ b/examples/tsukamoto/tsukamoto.R @@ -0,0 +1,126 @@ +#Code automatically generated with fuzzylite 6.0. + +library(ggplot2); + +engine.name = "tsukamoto" +engine.fll = "Engine: tsukamoto +InputVariable: X + enabled: true + range: -10.000 10.000 + lock-range: false + term: small Bell -10.000 5.000 3.000 + term: medium Bell 0.000 5.000 3.000 + term: large Bell 10.000 5.000 3.000 +OutputVariable: Ramps + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Ramp 0.600 0.400 + term: a Ramp 0.000 0.250 + term: c Ramp 0.700 1.000 +OutputVariable: Sigmoids + enabled: true + range: 0.020 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Sigmoid 0.500 -30.000 + term: a Sigmoid 0.130 30.000 + term: c Sigmoid 0.830 30.000 +OutputVariable: ZSShapes + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b ZShape 0.300 0.600 + term: a SShape 0.000 0.250 + term: c SShape 0.700 1.000 +OutputVariable: Concaves + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Concave 0.500 0.400 + term: a Concave 0.240 0.250 + term: c Concave 0.900 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a + rule: if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b + rule: if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c" + +engine.fldFile = "tsukamoto.fld" +if (require(data.table)) { + engine.df = data.table::fread(engine.fldFile, sep="auto", header="auto") +} else { + engine.df = read.table(engine.fldFile, header=TRUE) +} + +engine.plot.i1_o1 = ggplot(engine.df, aes(X, Ramps)) + + geom_line(aes(color=Ramps), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("X vs Ramps") + +engine.plot.o1_i1 = ggplot(engine.df, aes(X, Ramps)) + + geom_line(aes(color=Ramps), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Ramps vs X") + +engine.plot.i1_o2 = ggplot(engine.df, aes(X, Sigmoids)) + + geom_line(aes(color=Sigmoids), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("X vs Sigmoids") + +engine.plot.o2_i1 = ggplot(engine.df, aes(X, Sigmoids)) + + geom_line(aes(color=Sigmoids), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Sigmoids vs X") + +engine.plot.i1_o3 = ggplot(engine.df, aes(X, ZSShapes)) + + geom_line(aes(color=ZSShapes), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("X vs ZSShapes") + +engine.plot.o3_i1 = ggplot(engine.df, aes(X, ZSShapes)) + + geom_line(aes(color=ZSShapes), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("ZSShapes vs X") + +engine.plot.i1_o4 = ggplot(engine.df, aes(X, Concaves)) + + geom_line(aes(color=Concaves), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + ggtitle("X vs Concaves") + +engine.plot.o4_i1 = ggplot(engine.df, aes(X, Concaves)) + + geom_line(aes(color=Concaves), size=3, lineend="round", linejoin="mitre") + + scale_color_gradient(low="yellow", high="red") + + coord_flip() + + ggtitle("Concaves vs X") + +if (require(gridExtra)) { + engine.plots = arrangeGrob(engine.plot.i1_o1, engine.plot.o1_i1, engine.plot.i1_o2, engine.plot.o2_i1, engine.plot.i1_o3, engine.plot.o3_i1, engine.plot.i1_o4, engine.plot.o4_i1, ncol=2, top=engine.name) + ggsave(paste0(engine.name, ".pdf"), engine.plots) + if (require(grid)) { + grid.newpage() + grid.draw(engine.plots) + } +} diff --git a/examples/tsukamoto/tsukamoto.cpp b/examples/tsukamoto/tsukamoto.cpp new file mode 100644 index 0000000..a50c53d --- /dev/null +++ b/examples/tsukamoto/tsukamoto.cpp @@ -0,0 +1,97 @@ +#include <fl/Headers.h> + +int main(int argc, char** argv){ +//Code automatically generated with fuzzylite 6.0. + +using namespace fl; + +Engine* engine = new Engine; +engine->setName("tsukamoto"); +engine->setDescription(""); + +InputVariable* X = new InputVariable; +X->setName("X"); +X->setDescription(""); +X->setEnabled(true); +X->setRange(-10.000, 10.000); +X->setLockValueInRange(false); +X->addTerm(new Bell("small", -10.000, 5.000, 3.000)); +X->addTerm(new Bell("medium", 0.000, 5.000, 3.000)); +X->addTerm(new Bell("large", 10.000, 5.000, 3.000)); +engine->addInputVariable(X); + +OutputVariable* Ramps = new OutputVariable; +Ramps->setName("Ramps"); +Ramps->setDescription(""); +Ramps->setEnabled(true); +Ramps->setRange(0.000, 1.000); +Ramps->setLockValueInRange(false); +Ramps->setAggregation(fl::null); +Ramps->setDefuzzifier(new WeightedAverage("Automatic")); +Ramps->setDefaultValue(fl::nan); +Ramps->setLockPreviousValue(false); +Ramps->addTerm(new Ramp("b", 0.600, 0.400)); +Ramps->addTerm(new Ramp("a", 0.000, 0.250)); +Ramps->addTerm(new Ramp("c", 0.700, 1.000)); +engine->addOutputVariable(Ramps); + +OutputVariable* Sigmoids = new OutputVariable; +Sigmoids->setName("Sigmoids"); +Sigmoids->setDescription(""); +Sigmoids->setEnabled(true); +Sigmoids->setRange(0.020, 1.000); +Sigmoids->setLockValueInRange(false); +Sigmoids->setAggregation(fl::null); +Sigmoids->setDefuzzifier(new WeightedAverage("Automatic")); +Sigmoids->setDefaultValue(fl::nan); +Sigmoids->setLockPreviousValue(false); +Sigmoids->addTerm(new Sigmoid("b", 0.500, -30.000)); +Sigmoids->addTerm(new Sigmoid("a", 0.130, 30.000)); +Sigmoids->addTerm(new Sigmoid("c", 0.830, 30.000)); +engine->addOutputVariable(Sigmoids); + +OutputVariable* ZSShapes = new OutputVariable; +ZSShapes->setName("ZSShapes"); +ZSShapes->setDescription(""); +ZSShapes->setEnabled(true); +ZSShapes->setRange(0.000, 1.000); +ZSShapes->setLockValueInRange(false); +ZSShapes->setAggregation(fl::null); +ZSShapes->setDefuzzifier(new WeightedAverage("Automatic")); +ZSShapes->setDefaultValue(fl::nan); +ZSShapes->setLockPreviousValue(false); +ZSShapes->addTerm(new ZShape("b", 0.300, 0.600)); +ZSShapes->addTerm(new SShape("a", 0.000, 0.250)); +ZSShapes->addTerm(new SShape("c", 0.700, 1.000)); +engine->addOutputVariable(ZSShapes); + +OutputVariable* Concaves = new OutputVariable; +Concaves->setName("Concaves"); +Concaves->setDescription(""); +Concaves->setEnabled(true); +Concaves->setRange(0.000, 1.000); +Concaves->setLockValueInRange(false); +Concaves->setAggregation(fl::null); +Concaves->setDefuzzifier(new WeightedAverage("Automatic")); +Concaves->setDefaultValue(fl::nan); +Concaves->setLockPreviousValue(false); +Concaves->addTerm(new Concave("b", 0.500, 0.400)); +Concaves->addTerm(new Concave("a", 0.240, 0.250)); +Concaves->addTerm(new Concave("c", 0.900, 1.000)); +engine->addOutputVariable(Concaves); + +RuleBlock* ruleBlock = new RuleBlock; +ruleBlock->setName(""); +ruleBlock->setDescription(""); +ruleBlock->setEnabled(true); +ruleBlock->setConjunction(fl::null); +ruleBlock->setDisjunction(fl::null); +ruleBlock->setImplication(fl::null); +ruleBlock->setActivation(new General); +ruleBlock->addRule(Rule::parse("if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a", engine)); +ruleBlock->addRule(Rule::parse("if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b", engine)); +ruleBlock->addRule(Rule::parse("if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c", engine)); +engine->addRuleBlock(ruleBlock); + + +} diff --git a/examples/tsukamoto/tsukamoto.fcl b/examples/tsukamoto/tsukamoto.fcl new file mode 100644 index 0000000..b26fc60 --- /dev/null +++ b/examples/tsukamoto/tsukamoto.fcl @@ -0,0 +1,65 @@ +//Code automatically generated with fuzzylite 6.0. + +FUNCTION_BLOCK tsukamoto + +VAR_INPUT + X: REAL; +END_VAR + +VAR_OUTPUT + Ramps: REAL; + Sigmoids: REAL; + ZSShapes: REAL; + Concaves: REAL; +END_VAR + +FUZZIFY X + RANGE := (-10.000 .. 10.000); + TERM small := Bell -10.000 5.000 3.000; + TERM medium := Bell 0.000 5.000 3.000; + TERM large := Bell 10.000 5.000 3.000; +END_FUZZIFY + +DEFUZZIFY Ramps + RANGE := (0.000 .. 1.000); + TERM b := Ramp 0.600 0.400; + TERM a := Ramp 0.000 0.250; + TERM c := Ramp 0.700 1.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY Sigmoids + RANGE := (0.020 .. 1.000); + TERM b := Sigmoid 0.500 -30.000; + TERM a := Sigmoid 0.130 30.000; + TERM c := Sigmoid 0.830 30.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY ZSShapes + RANGE := (0.000 .. 1.000); + TERM b := ZShape 0.300 0.600; + TERM a := SShape 0.000 0.250; + TERM c := SShape 0.700 1.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +DEFUZZIFY Concaves + RANGE := (0.000 .. 1.000); + TERM b := Concave 0.500 0.400; + TERM a := Concave 0.240 0.250; + TERM c := Concave 0.900 1.000; + METHOD : COGS; + DEFAULT := nan; +END_DEFUZZIFY + +RULEBLOCK + RULE 1 : if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a + RULE 2 : if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b + RULE 3 : if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c +END_RULEBLOCK + +END_FUNCTION_BLOCK diff --git a/examples/tsukamoto/tsukamoto.fis b/examples/tsukamoto/tsukamoto.fis new file mode 100644 index 0000000..0127bdd --- /dev/null +++ b/examples/tsukamoto/tsukamoto.fis @@ -0,0 +1,59 @@ +#Code automatically generated with fuzzylite 6.0. + +[System] +Name='tsukamoto' +Type='tsukamoto' +Version=6.0 +NumInputs=1 +NumOutputs=4 +NumRules=3 +AndMethod='min' +OrMethod='max' +ImpMethod='min' +AggMethod='max' +DefuzzMethod='wtaver' + +[Input1] +Name='X' +Range=[-10.000 10.000] +NumMFs=3 +MF1='small':'gbellmf',[5.000 3.000 -10.000] +MF2='medium':'gbellmf',[5.000 3.000 0.000] +MF3='large':'gbellmf',[5.000 3.000 10.000] + +[Output1] +Name='Ramps' +Range=[0.000 1.000] +NumMFs=3 +MF1='b':'rampmf',[0.600 0.400] +MF2='a':'rampmf',[0.000 0.250] +MF3='c':'rampmf',[0.700 1.000] + +[Output2] +Name='Sigmoids' +Range=[0.020 1.000] +NumMFs=3 +MF1='b':'sigmf',[-30.000 0.500] +MF2='a':'sigmf',[30.000 0.130] +MF3='c':'sigmf',[30.000 0.830] + +[Output3] +Name='ZSShapes' +Range=[0.000 1.000] +NumMFs=3 +MF1='b':'zmf',[0.300 0.600] +MF2='a':'smf',[0.000 0.250] +MF3='c':'smf',[0.700 1.000] + +[Output4] +Name='Concaves' +Range=[0.000 1.000] +NumMFs=3 +MF1='b':'concavemf',[0.500 0.400] +MF2='a':'concavemf',[0.240 0.250] +MF3='c':'concavemf',[0.900 1.000] + +[Rules] +1.000 , 2.000 2.000 2.000 2.000 (1.000) : 1 +2.000 , 1.000 1.000 1.000 1.000 (1.000) : 1 +3.000 , 3.000 3.000 3.000 3.000 (1.000) : 1 diff --git a/examples/tsukamoto/tsukamoto.fld b/examples/tsukamoto/tsukamoto.fld new file mode 100644 index 0000000..a62de71 --- /dev/null +++ b/examples/tsukamoto/tsukamoto.fld @@ -0,0 +1,1025 @@ +X Ramps Sigmoids ZSShapes Concaves +-10.000000000 0.255363311 0.994418517 0.255809266 0.252212158 +-9.980449658 0.255423538 0.994349291 0.255877491 0.252237827 +-9.960899316 0.255484536 0.994279093 0.255946708 0.252263834 +-9.941348974 0.255546315 0.994207907 0.256016992 0.252290183 +-9.921798631 0.255608886 0.994135720 0.256088420 0.252316880 +-9.902248289 0.255672260 0.994062515 0.256161070 0.252343930 +-9.882697947 0.255736449 0.993988277 0.256235018 0.252371338 +-9.863147605 0.255801463 0.993912989 0.256310342 0.252399110 +-9.843597263 0.255867314 0.993836635 0.256387118 0.252427249 +-9.824046921 0.255934014 0.993759200 0.256465426 0.252455763 +-9.804496579 0.256001575 0.993680665 0.256545342 0.252484655 +-9.784946237 0.256070009 0.993601014 0.256626945 0.252513932 +-9.765395894 0.256139328 0.993520229 0.256710313 0.252543600 +-9.745845552 0.256209543 0.993438294 0.256795525 0.252573664 +-9.726295210 0.256280668 0.993355189 0.256882659 0.252604130 +-9.706744868 0.256352715 0.993270897 0.256971794 0.252635003 +-9.687194526 0.256425696 0.993185399 0.257063010 0.252666290 +-9.667644184 0.256499625 0.993098676 0.257156386 0.252697997 +-9.648093842 0.256574514 0.993010710 0.257252001 0.252730129 +-9.628543500 0.256650376 0.992921480 0.257349935 0.252762694 +-9.608993157 0.256727223 0.992830967 0.257450269 0.252795698 +-9.589442815 0.256805071 0.992739150 0.257553083 0.252829146 +-9.569892473 0.256883930 0.992646010 0.257658457 0.252863046 +-9.550342131 0.256963815 0.992551525 0.257766473 0.252897404 +-9.530791789 0.257044740 0.992455675 0.257877210 0.252932226 +-9.511241447 0.257126716 0.992358437 0.257990751 0.252967521 +-9.491691105 0.257209759 0.588052019 0.258107177 0.253003294 +-9.472140762 0.257293880 0.580664022 0.258226570 0.253039553 +-9.452590420 0.257379094 0.573548403 0.258349012 0.253076305 +-9.433040078 0.257465414 0.566686170 0.258474586 0.253113557 +-9.413489736 0.257552853 0.560060263 0.258603373 0.253151317 +-9.393939394 0.257641426 0.553655304 0.258735458 0.253189591 +-9.374389052 0.257731144 0.547457382 0.258870922 0.253228389 +-9.354838710 0.257822021 0.541453869 0.259009850 0.253267717 +-9.335288368 0.257914071 0.535633273 0.259152325 0.253307584 +-9.315738025 0.258007306 0.529985101 0.259298431 0.253347997 +-9.296187683 0.258101740 0.524499751 0.259448253 0.253388965 +-9.276637341 0.258197385 0.519168409 0.259601875 0.253430495 +-9.257086999 0.258294254 0.513982971 0.259759382 0.253472597 +-9.237536657 0.258392360 0.508935965 0.259920859 0.253515278 +-9.217986315 0.258491714 0.504020487 0.260086393 0.253558549 +-9.198435973 0.258592329 0.499230149 0.260256068 0.253602416 +-9.178885630 0.258694217 0.494559024 0.260429971 0.253646889 +-9.159335288 0.258797390 0.490001608 0.260608188 0.253691978 +-9.139784946 0.258901859 0.485552776 0.260790807 0.253737692 +-9.120234604 0.259007634 0.481207751 0.260977914 0.253784039 +-9.100684262 0.259114728 0.476962075 0.261169597 0.253831030 +-9.081133920 0.259223150 0.472811577 0.261365945 0.253878674 +-9.061583578 0.259332910 0.468752351 0.261567044 0.253926982 +-9.042033236 0.259444019 0.464780737 0.261772983 0.253975962 +-9.022482893 0.259556486 0.460893297 0.261983853 0.254025626 +-9.002932551 0.259670319 0.457086800 0.262199741 0.254075983 +-8.983382209 0.259785527 0.453358204 0.262420737 0.254127045 +-8.963831867 0.259902119 0.449704644 0.262646932 0.254178821 +-8.944281525 0.260020101 0.446123417 0.262878416 0.254231324 +-8.924731183 0.260139481 0.442611971 0.263115280 0.254284563 +-8.905180841 0.260260266 0.439167894 0.263357615 0.254338550 +-8.885630499 0.260382462 0.435788903 0.263605512 0.254393298 +-8.866080156 0.260506073 0.432472838 0.263859064 0.254448816 +-8.846529814 0.260631104 0.429217651 0.264118363 0.254505117 +-8.826979472 0.260757561 0.426021398 0.264383501 0.254562214 +-8.807429130 0.260885446 0.422882236 0.264654573 0.254620118 +-8.787878788 0.261014762 0.419798412 0.264931671 0.254678842 +-8.768328446 0.261145511 0.416768259 0.265214890 0.254738398 +-8.748778104 0.261277695 0.413790193 0.265504324 0.254798800 +-8.729227761 0.261411313 0.410862703 0.265800069 0.254860061 +-8.709677419 0.261546367 0.407984352 0.266102219 0.254922193 +-8.690127077 0.261682855 0.405153768 0.266410871 0.254985212 +-8.670576735 0.261820774 0.402369643 0.266726120 0.255049129 +-8.651026393 0.261960123 0.399630729 0.267048064 0.255113960 +-8.631476051 0.262100897 0.396935833 0.267376801 0.255179719 +-8.611925709 0.262243093 0.394283815 0.267712426 0.255246420 +-8.592375367 0.262386704 0.391673585 0.268055040 0.255314078 +-8.572825024 0.262531724 0.389104103 0.268404740 0.255382709 +-8.553274682 0.262678146 0.386574370 0.268761626 0.255452328 +-8.533724340 0.262825961 0.384083432 0.269125797 0.255522950 +-8.514173998 0.262975160 0.381630374 0.269497353 0.255594592 +-8.494623656 0.263125731 0.379214319 0.269876396 0.255667269 +-8.475073314 0.263277664 0.376834428 0.270263026 0.255740998 +-8.455522972 0.263430945 0.374489895 0.270657345 0.255815797 +-8.435972630 0.263585560 0.372179948 0.271059456 0.255891682 +-8.416422287 0.263741495 0.369903845 0.271469460 0.255968670 +-8.396871945 0.263898732 0.367660875 0.271887462 0.256046780 +-8.377321603 0.264057254 0.365450354 0.272313565 0.256126030 +-8.357771261 0.264217043 0.363271626 0.272747873 0.256206439 +-8.338220919 0.264378078 0.361124062 0.273190492 0.256288024 +-8.318670577 0.264540339 0.359007055 0.273641526 0.256370806 +-8.299120235 0.264703801 0.356920024 0.274101082 0.256454804 +-8.279569892 0.264868442 0.354862409 0.274569267 0.256540038 +-8.260019550 0.265034236 0.352833675 0.275046187 0.256626528 +-8.240469208 0.265201156 0.350833302 0.275531949 0.256714295 +-8.220918866 0.265369175 0.348860796 0.276026663 0.256803360 +-8.201368524 0.265538263 0.346915677 0.276530437 0.256893746 +-8.181818182 0.265708390 0.344997488 0.277043381 0.256985473 +-8.162267840 0.265879523 0.343105787 0.277565603 0.257078564 +-8.142717498 0.266051628 0.341240148 0.278097216 0.257173043 +-8.123167155 0.266224672 0.339400163 0.278638329 0.257268931 +-8.103616813 0.266398617 0.337585441 0.279189055 0.257366255 +-8.084066471 0.266573427 0.335795604 0.279749506 0.257465037 +-8.064516129 0.266749060 0.334030289 0.280319794 0.257565302 +-8.044965787 0.266925479 0.332289147 0.280900034 0.257667076 +-8.025415445 0.267102639 0.330571844 0.281490338 0.257770384 +-8.005865103 0.267280498 0.328878058 0.282090823 0.257875253 +-7.986314761 0.267459012 0.327207479 0.282701602 0.257981710 +-7.966764418 0.267638134 0.325559813 0.283322792 0.258089781 +-7.947214076 0.267817816 0.323934772 0.283954510 0.258199496 +-7.927663734 0.267998010 0.322332086 0.284596871 0.258310882 +-7.908113392 0.268178666 0.320751491 0.285249995 0.258423969 +-7.888563050 0.268359732 0.319192738 0.285913998 0.258538786 +-7.869012708 0.268541155 0.317655585 0.286589000 0.258655364 +-7.849462366 0.268722883 0.316139803 0.287275119 0.258773734 +-7.829912023 0.268904858 0.314645172 0.287972477 0.258893927 +-7.810361681 0.269087026 0.313171482 0.288681194 0.259015976 +-7.790811339 0.269269328 0.311718532 0.289401390 0.259139914 +-7.771260997 0.269451706 0.310286130 0.290133187 0.259265774 +-7.751710655 0.269634101 0.308874096 0.290876708 0.259393591 +-7.732160313 0.269816452 0.307482254 0.291632076 0.259523400 +-7.712609971 0.269998697 0.306110441 0.292399413 0.259655237 +-7.693059629 0.270180774 0.304758500 0.293178844 0.259789138 +-7.673509286 0.270362620 0.303426284 0.293970494 0.259925141 +-7.653958944 0.270544172 0.302113652 0.294774488 0.260063283 +-7.634408602 0.270725364 0.300820472 0.295590951 0.260203605 +-7.614858260 0.270906132 0.299546621 0.296420009 0.260346146 +-7.595307918 0.271086411 0.298291981 0.297261790 0.260490946 +-7.575757576 0.271266134 0.297056445 0.298116421 0.260638047 +-7.556207234 0.271445235 0.295839910 0.298984029 0.260787491 +-7.536656891 0.271623649 0.294642282 0.299864743 0.260939322 +-7.517106549 0.271801309 0.293463474 0.300758692 0.261093584 +-7.497556207 0.271978149 0.292303406 0.301666005 0.261250322 +-7.478005865 0.272154103 0.291162006 0.302586812 0.261409582 +-7.458455523 0.272329105 0.290039206 0.303521243 0.261571412 +-7.438905181 0.272503091 0.288934948 0.304469430 0.261735858 +-7.419354839 0.272675996 0.287849178 0.305431504 0.261902971 +-7.399804497 0.272847756 0.286781851 0.306407596 0.262072801 +-7.380254154 0.273018309 0.285732927 0.307397839 0.262245398 +-7.360703812 0.273187593 0.284702372 0.308402365 0.262420815 +-7.341153470 0.273355548 0.283690161 0.309421308 0.262599105 +-7.321603128 0.273522115 0.282696272 0.310454800 0.262780323 +-7.302052786 0.273687238 0.281720692 0.311502976 0.262964523 +-7.282502444 0.273850860 0.280763413 0.312565971 0.263151763 +-7.262952102 0.274012930 0.279824432 0.313643918 0.263342101 +-7.243401760 0.274173395 0.278903754 0.314736952 0.263535594 +-7.223851417 0.274332208 0.278001390 0.315845209 0.263732304 +-7.204301075 0.274489324 0.277117355 0.316968825 0.263932292 +-7.184750733 0.274644699 0.276251673 0.318107935 0.264135619 +-7.165200391 0.274798294 0.275404370 0.319262675 0.264342350 +-7.145650049 0.274950074 0.274575482 0.320433182 0.264552551 +-7.126099707 0.275100006 0.273765048 0.321619592 0.264766285 +-7.106549365 0.275248062 0.272973113 0.322822043 0.264983623 +-7.086999022 0.275394218 0.272199729 0.324040670 0.265204631 +-7.067448680 0.275538454 0.271444953 0.307535201 0.265429380 +-7.047898338 0.275680755 0.270708847 0.308450253 0.265657942 +-7.028347996 0.275821113 0.269991479 0.309374445 0.265890388 +-7.008797654 0.275959522 0.269292923 0.310307730 0.266126792 +-6.989247312 0.276095984 0.268613257 0.311250056 0.266367230 +-6.969696970 0.276230505 0.267952566 0.312201365 0.266611778 +-6.950146628 0.276363100 0.267310940 0.313161596 0.266860514 +-6.930596285 0.276493788 0.266688473 0.314130682 0.267113515 +-6.911045943 0.276622596 0.266085265 0.315108551 0.267370864 +-6.891495601 0.276749557 0.265501422 0.316095125 0.267632640 +-6.871945259 0.276874713 0.264937052 0.317090322 0.267898927 +-6.852394917 0.276998112 0.264392272 0.318094054 0.268169809 +-6.832844575 0.277119810 0.263867201 0.319106226 0.268445370 +-6.813294233 0.277239873 0.263361963 0.320126738 0.268725698 +-6.793743891 0.277358374 0.262876688 0.321155486 0.269010879 +-6.774193548 0.277475395 0.262411508 0.322192355 0.269301002 +-6.754643206 0.277591028 0.261966562 0.323237230 0.269596157 +-6.735092864 0.277705372 0.261541991 0.324289983 0.269896435 +-6.715542522 0.277818538 0.261137942 0.325350486 0.270201928 +-6.695992180 0.277930645 0.260754565 0.326418598 0.270512728 +-6.676441838 0.278041824 0.260392013 0.327494177 0.270828929 +-6.656891496 0.278152214 0.260050443 0.328577070 0.271150626 +-6.637341153 0.278261967 0.259730017 0.329667118 0.271477914 +-6.617790811 0.278371242 0.259430897 0.330764156 0.271810890 +-6.598240469 0.278480211 0.259153251 0.331868010 0.272149651 +-6.578690127 0.278589058 0.258897247 0.332978499 0.272494294 +-6.559139785 0.278697976 0.258663058 0.334095435 0.272844918 +-6.539589443 0.278807169 0.258450858 0.335218622 0.273201620 +-6.520039101 0.278916853 0.258260822 0.336347856 0.273564501 +-6.500488759 0.279027256 0.258093128 0.337482925 0.273933658 +-6.480938416 0.279138616 0.257947954 0.338623608 0.274309192 +-6.461388074 0.279251182 0.257825481 0.221051999 0.274691202 +-6.441837732 0.279365214 0.257725889 0.221590933 0.275079788 +-6.422287390 0.279480984 0.257649358 0.222137883 0.275475048 +-6.402737048 0.279598775 0.257596069 0.222693019 0.275877081 +-6.383186706 0.279718880 0.257566201 0.223256511 0.276285986 +-6.363636364 0.279841602 0.257559934 0.223828528 0.276701860 +-6.344086022 0.279967255 0.257577444 0.224409243 0.277124800 +-6.324535679 0.280096164 0.257618909 0.224998829 0.277554903 +-6.304985337 0.280228662 0.257684501 0.225597457 0.277992263 +-6.285434995 0.280365093 0.257774389 0.226205300 0.278436973 +-6.265884653 0.280505807 0.257888742 0.226822530 0.278889126 +-6.246334311 0.280651166 0.258027723 0.227449317 0.279348812 +-6.226783969 0.280801538 0.258191489 0.228085831 0.279816119 +-6.207233627 0.280957297 0.258380194 0.228732239 0.280291134 +-6.187683284 0.281118828 0.258593987 0.229388706 0.280773941 +-6.168132942 0.281286517 0.258833007 0.230055394 0.281264621 +-6.148582600 0.281460758 0.259097390 0.230732461 0.281763253 +-6.129032258 0.281641951 0.259387263 0.231420063 0.282269913 +-6.109481916 0.281830496 0.259702743 0.232118350 0.282784672 +-6.089931574 0.282026799 0.260043940 0.232827466 0.283307600 +-6.070381232 0.282231267 0.260410954 0.233547551 0.283838762 +-6.050830890 0.282444309 0.260803873 0.234278737 0.284378218 +-6.031280547 0.282666331 0.261222776 0.235021150 0.284926025 +-6.011730205 0.282897743 0.261667729 0.235774908 0.285482236 +-5.992179863 0.283138948 0.262138784 0.236540120 0.286046897 +-5.972629521 0.283390349 0.262635982 0.237316886 0.286620050 +-5.953079179 0.283652343 0.263159348 0.238105297 0.287201731 +-5.933528837 0.283925323 0.263708892 0.238905431 0.287791972 +-5.913978495 0.284209675 0.264284609 0.239717357 0.288390797 +-5.894428152 0.284505775 0.264886477 0.240541130 0.288998224 +-5.874877810 0.284813992 0.265514457 0.241376794 0.289614265 +-5.855327468 0.285134684 0.266168491 0.242224377 0.290238925 +-5.835777126 0.285468197 0.266848503 0.243083895 0.290872201 +-5.816226784 0.285814864 0.267554397 0.243955347 0.291514085 +-5.796676442 0.286175003 0.268286057 0.244838717 0.292164558 +-5.777126100 0.286548917 0.269043344 0.245733970 0.292823594 +-5.757575758 0.286936891 0.269826101 0.246641058 0.293491162 +-5.738025415 0.287339193 0.270634145 0.247559911 0.294167217 +-5.718475073 0.287756071 0.271467272 0.248490441 0.294851710 +-5.698924731 0.288187751 0.272325255 0.249432542 0.295544581 +-5.679374389 0.288634438 0.273207839 0.250386088 0.296245761 +-5.659824047 0.289096314 0.274114750 0.251350930 0.296955171 +-5.640273705 0.289573537 0.275045684 0.252326899 0.297672725 +-5.620723363 0.290066237 0.276000313 0.253313807 0.298398324 +-5.601173021 0.290574522 0.276978285 0.254311439 0.299131862 +-5.581622678 0.291098468 0.277979219 0.255319561 0.299873222 +-5.562072336 0.291638125 0.279002709 0.256337915 0.300622278 +-5.542521994 0.292193515 0.280048322 0.257366220 0.301378891 +-5.522971652 0.292764628 0.281115598 0.258404172 0.302142915 +-5.503421310 0.293351425 0.282204050 0.259451443 0.302914192 +-5.483870968 0.293953836 0.283313164 0.260507680 0.303692556 +-5.464320626 0.294571759 0.284442401 0.261572509 0.304477830 +-5.444770283 0.295205060 0.285591192 0.262645531 0.305269824 +-5.425219941 0.295853575 0.286758945 0.263726323 0.306068343 +-5.405669599 0.296517105 0.287945040 0.264814441 0.306873179 +-5.386119257 0.297195423 0.289148832 0.265909414 0.307684115 +-5.366568915 0.297888265 0.290369651 0.267010752 0.308500925 +-5.347018573 0.298595340 0.291606802 0.268117942 0.309596055 +-5.327468231 0.299316323 0.292859566 0.269230449 0.312559135 +-5.307917889 0.300050859 0.294127200 0.270347716 0.315603239 +-5.288367546 0.300798562 0.295408941 0.271469168 0.318728992 +-5.268817204 0.301559019 0.296704001 0.272594208 0.321936947 +-5.249266862 0.302331786 0.298011575 0.273722223 0.325227579 +-5.229716520 0.303116392 0.299330835 0.274852580 0.328601284 +-5.210166178 0.303912338 0.300660938 0.275984632 0.332058374 +-5.190615836 0.304719103 0.302001020 0.277117713 0.335599077 +-5.171065494 0.305536140 0.303350205 0.278251145 0.339223532 +-5.151515152 0.306362878 0.304707598 0.279384238 0.342931785 +-5.131964809 0.307198726 0.306072293 0.280516287 0.346723791 +-5.112414467 0.308043075 0.307443373 0.281646579 0.350599408 +-5.092864125 0.308895296 0.308819908 0.282774390 0.354558399 +-5.073313783 0.309754745 0.310200960 0.283898991 0.358600425 +-5.053763441 0.310620761 0.311585585 0.285019646 0.362725048 +-5.034213099 0.311492675 0.312972829 0.286135612 0.366931729 +-5.014662757 0.312369804 0.314361738 0.287246147 0.371219824 +-4.995112414 0.313251457 0.315751354 0.288350506 0.375588587 +-4.975562072 0.314136938 0.317140716 0.289447943 0.380037168 +-4.956011730 0.315025543 0.318528866 0.290537715 0.384564614 +-4.936461388 0.315916570 0.319914846 0.291619084 0.389169867 +-4.916911046 0.316809312 0.321297703 0.292691315 0.393851765 +-4.897360704 0.317703066 0.322676489 0.293753680 0.398609045 +-4.877810362 0.318597132 0.324050262 0.294805461 0.403440342 +-4.858260020 0.319490815 0.325418091 0.295845948 0.408344189 +-4.838709677 0.320383428 0.326779051 0.296874445 0.413319022 +-4.819159335 0.321274292 0.328132233 0.297890266 0.418363180 +-4.799608993 0.322162740 0.329476736 0.298892742 0.423474905 +-4.780058651 0.323048118 0.330811677 0.299881219 0.428652350 +-4.760508309 0.323929786 0.332136187 0.300855059 0.433893576 +-4.740957967 0.324807121 0.333449414 0.301813645 0.439196556 +-4.721407625 0.325679516 0.334750524 0.302756379 0.444559184 +-4.701857283 0.326546384 0.336038701 0.303682682 0.449979267 +-4.682306940 0.327407160 0.337313152 0.304592000 0.455454542 +-4.662756598 0.328261298 0.338573103 0.305483801 0.460982668 +-4.643206256 0.329108277 0.339817802 0.306357577 0.466561238 +-4.623655914 0.329947599 0.341046522 0.307212843 0.472187778 +-4.604105572 0.330778792 0.342258557 0.308049144 0.477859756 +-4.584555230 0.331601407 0.343453227 0.308866048 0.483574582 +-4.565004888 0.332415024 0.344629876 0.309663151 0.489329616 +-4.545454545 0.333219249 0.345787876 0.310440077 0.495122171 +-4.525904203 0.334013717 0.346926622 0.311196477 0.500949516 +-4.506353861 0.334798087 0.348045536 0.311932032 0.506808887 +-4.486803519 0.335572050 0.349144067 0.312646449 0.512697484 +-4.467253177 0.336335323 0.350221692 0.313339466 0.518612482 +-4.447702835 0.337087653 0.351277912 0.314010850 0.524551034 +-4.428152493 0.337828813 0.352312257 0.314660394 0.530510274 +-4.408602151 0.338558605 0.353324284 0.315287924 0.536487326 +-4.389051808 0.339276860 0.354313575 0.315893291 0.542479305 +-4.369501466 0.339983434 0.355279741 0.316476377 0.548483325 +-4.349951124 0.340678212 0.356222417 0.317037090 0.554496502 +-4.330400782 0.341361105 0.357141266 0.317575368 0.560515958 +-4.310850440 0.342032049 0.358035977 0.318091175 0.566538831 +-4.291300098 0.342691006 0.358906261 0.318584502 0.572562270 +-4.271749756 0.343337961 0.359751858 0.319055367 0.578583450 +-4.252199413 0.343972925 0.360572531 0.319503812 0.584599570 +-4.232649071 0.344595929 0.361368066 0.319929907 0.590607856 +-4.213098729 0.345207029 0.362138273 0.320333744 0.596605571 +-4.193548387 0.345806299 0.362882985 0.320715440 0.602590015 +-4.173998045 0.346393834 0.363602057 0.321075135 0.608558530 +-4.154447703 0.346969748 0.364295364 0.321412990 0.614508500 +-4.134897361 0.347534173 0.364962804 0.321729188 0.620437361 +-4.115347019 0.348087259 0.365604293 0.322023932 0.626342600 +-4.095796676 0.348629168 0.366219767 0.322297447 0.632221758 +-4.076246334 0.349160080 0.366809181 0.322549972 0.638072433 +-4.056695992 0.349680189 0.367372507 0.322781769 0.643892285 +-4.037145650 0.350189698 0.367909733 0.322993113 0.649679036 +-4.017595308 0.350688825 0.368420866 0.323184297 0.655430473 +-3.998044966 0.351177796 0.368905927 0.323355628 0.661144451 +-3.978494624 0.351656848 0.369364949 0.323507428 0.666079666 +-3.958944282 0.352126225 0.369797984 0.323640031 0.670888651 +-3.939393939 0.352586178 0.370205092 0.323753785 0.675690949 +-3.919843597 0.353036965 0.370586349 0.323849047 0.680483527 +-3.900293255 0.353478850 0.370941841 0.323926187 0.685263450 +-3.880742913 0.353912099 0.371271664 0.323985583 0.690027883 +-3.861192571 0.354336983 0.371575927 0.324027622 0.694774089 +-3.841642229 0.354753776 0.371854744 0.324052698 0.699499433 +-3.822091887 0.355162752 0.372108242 0.324061214 0.704201381 +-3.802541544 0.355564188 0.372336553 0.324053577 0.708877501 +-3.782991202 0.355958358 0.372539817 0.324030201 0.713525463 +-3.763440860 0.356345538 0.372718183 0.323991504 0.718143038 +-3.743890518 0.356726002 0.372871802 0.323937907 0.722728101 +-3.724340176 0.357100021 0.373000833 0.323869836 0.727278628 +-3.704789834 0.357467865 0.373105440 0.323787717 0.731792694 +-3.685239492 0.357829800 0.373185789 0.323691979 0.736268477 +-3.665689150 0.358186087 0.373242052 0.323583053 0.740704251 +-3.646138807 0.358536986 0.373274403 0.323461369 0.745098390 +-3.626588465 0.358882748 0.373283019 0.323327357 0.749449365 +-3.607038123 0.359223622 0.373268079 0.323181447 0.753755740 +-3.587487781 0.359559852 0.373229764 0.323024067 0.758016176 +-3.567937439 0.359891672 0.373168254 0.322855643 0.762229423 +-3.548387097 0.360219316 0.373083733 0.322676600 0.766394324 +-3.528836755 0.360543005 0.372976384 0.322487358 0.770509809 +-3.509286413 0.360862959 0.372846389 0.322288336 0.774574896 +-3.489736070 0.361179388 0.372693931 0.322079949 0.778588685 +-3.470185728 0.361492495 0.372519192 0.321862607 0.782550361 +-3.450635386 0.361802477 0.372322351 0.321636715 0.786459190 +-3.431085044 0.362109524 0.372103589 0.321402676 0.790314512 +-3.411534702 0.362413816 0.371863082 0.321160886 0.794115748 +-3.391984360 0.362715529 0.371601006 0.320911736 0.797862389 +-3.372434018 0.363014830 0.371317533 0.320655611 0.801553999 +-3.352883675 0.363311877 0.371012835 0.320392891 0.805190210 +-3.333333333 0.363606822 0.370687079 0.320123950 0.808770721 +-3.313782991 0.363899811 0.370340429 0.319849154 0.812295296 +-3.294232649 0.364190979 0.369973047 0.319568865 0.815763759 +-3.274682307 0.364480457 0.369585091 0.319283438 0.819175996 +-3.255131965 0.364768368 0.369176715 0.318993219 0.822531948 +-3.235581623 0.365054826 0.368748070 0.318698549 0.825831611 +-3.216031281 0.365339939 0.368299304 0.318399763 0.829075035 +-3.196480938 0.365623810 0.367830557 0.318097186 0.832262318 +-3.176930596 0.365906532 0.367341969 0.317791138 0.835393608 +-3.157380254 0.366188194 0.366833674 0.317481932 0.838469096 +-3.137829912 0.366468876 0.366305800 0.317169872 0.841489018 +-3.118279570 0.366748655 0.365758474 0.316855256 0.844453651 +-3.098729228 0.367027599 0.365191816 0.316538375 0.847363310 +-3.079178886 0.367305771 0.364605940 0.316219511 0.850218348 +-3.059628543 0.367583229 0.364000957 0.315898941 0.853019152 +-3.040078201 0.367860024 0.363376974 0.315576933 0.855766142 +-3.020527859 0.368136203 0.362734089 0.315253747 0.858459769 +-3.000977517 0.368411807 0.362072400 0.314929638 0.861100512 +-2.981427175 0.368686873 0.361391995 0.314604853 0.863688877 +-2.961876833 0.368961431 0.360692960 0.314279630 0.866225396 +-2.942326491 0.369235508 0.359975374 0.313954203 0.868710622 +-2.922776149 0.369509128 0.359239312 0.313628796 0.871145133 +-2.903225806 0.369782308 0.358484842 0.313303629 0.873529524 +-2.883675464 0.370055062 0.357712027 0.312978912 0.875864408 +-2.864125122 0.370327403 0.356920926 0.312654850 0.878150418 +-2.844574780 0.370599335 0.356111589 0.312331640 0.880388198 +-2.825024438 0.370870863 0.355284065 0.312009475 0.882578408 +-2.805474096 0.371141988 0.354438393 0.311688539 0.884721720 +-2.785923754 0.371412706 0.353574609 0.311369010 0.886818816 +-2.766373412 0.371683012 0.352692741 0.311051060 0.888870388 +-2.746823069 0.371952898 0.351792813 0.310734855 0.890877137 +-2.727272727 0.372222354 0.350874844 0.310420554 0.892839769 +-2.707722385 0.372491367 0.349938843 0.310108310 0.894758999 +-2.688172043 0.372759921 0.348984818 0.309798272 0.896635544 +-2.668621701 0.373027999 0.348012767 0.309490580 0.898470126 +-2.649071359 0.373295584 0.347022684 0.309185371 0.900263470 +-2.629521017 0.373562653 0.346014557 0.308882776 0.902016302 +-2.609970674 0.373829186 0.344988366 0.308582920 0.903729349 +-2.590420332 0.374095160 0.343944087 0.308285921 0.905403340 +-2.570869990 0.374360548 0.342881689 0.307991895 0.907039000 +-2.551319648 0.374625326 0.341801133 0.307700951 0.908637054 +-2.531769306 0.374889468 0.340702376 0.307413194 0.910198225 +-2.512218964 0.375152945 0.339585366 0.307128722 0.911723233 +-2.492668622 0.375415730 0.338450047 0.306847630 0.913212792 +-2.473118280 0.375677793 0.337296355 0.306570009 0.914667616 +-2.453567937 0.375939106 0.336124218 0.306295944 0.916088410 +-2.434017595 0.376199638 0.334933559 0.306025517 0.917475877 +-2.414467253 0.376459360 0.333724294 0.305758803 0.918830710 +-2.394916911 0.376718242 0.332496330 0.305495875 0.920153600 +-2.375366569 0.376976253 0.331249569 0.305236802 0.921445229 +-2.355816227 0.377233364 0.329983905 0.304981649 0.922706271 +-2.336265885 0.377489543 0.328699224 0.304730476 0.923937393 +-2.316715543 0.377744760 0.327395405 0.304483339 0.925139256 +-2.297165200 0.377998986 0.326072319 0.304240293 0.926312509 +-2.277614858 0.378252192 0.324729829 0.304001387 0.927457796 +-2.258064516 0.378504347 0.323367790 0.303766666 0.928575750 +-2.238514174 0.378755423 0.321986050 0.303536174 0.929666996 +-2.218963832 0.379005391 0.320584447 0.303309949 0.930732148 +-2.199413490 0.379254224 0.319162811 0.303088030 0.931771812 +-2.179863148 0.379501895 0.317720964 0.302870448 0.932786585 +-2.160312805 0.379748375 0.316258717 0.302657234 0.933777052 +-2.140762463 0.379993640 0.314775875 0.302448415 0.934743790 +-2.121212121 0.380237664 0.313272230 0.302244016 0.935687364 +-2.101661779 0.380480422 0.311747568 0.302044058 0.936608331 +-2.082111437 0.380721890 0.310201661 0.301848561 0.937507236 +-2.062561095 0.380962045 0.308634274 0.301657541 0.938384615 +-2.043010753 0.381200865 0.307045161 0.301471013 0.939240993 +-2.023460411 0.381438328 0.305434064 0.301288987 0.940076883 +-2.003910068 0.381674413 0.303800713 0.301111474 0.940892790 +-1.984359726 0.381909101 0.302144831 0.300938480 0.941689209 +-1.964809384 0.382142372 0.300466123 0.300770010 0.942466622 +-1.945259042 0.382374209 0.298764287 0.300606066 0.943225502 +-1.925708700 0.382604595 0.297039004 0.300446651 0.943966312 +-1.906158358 0.382833513 0.295289947 0.300291761 0.944689503 +-1.886608016 0.383060948 0.293516769 0.300141395 0.945395519 +-1.867057674 0.383286886 0.291719115 0.299995546 0.946084790 +-1.847507331 0.383511314 0.289896612 0.299854208 0.946757739 +-1.827956989 0.383734219 0.288048873 0.299717372 0.947414776 +-1.808406647 0.383955590 0.286175495 0.299585028 0.948056303 +-1.788856305 0.384175416 0.284276059 0.299457164 0.948682713 +-1.769305963 0.384393687 0.282350129 0.299333766 0.949294386 +-1.749755621 0.384610396 0.280397251 0.299214820 0.949891695 +-1.730205279 0.384825534 0.278416954 0.299100308 0.950475002 +-1.710654936 0.385039095 0.276408745 0.298990212 0.951044661 +-1.691104594 0.385251073 0.274372115 0.298884514 0.951601015 +-1.671554252 0.385461463 0.272306532 0.298783193 0.952144399 +-1.652003910 0.385670261 0.270211443 0.298686226 0.952675137 +-1.632453568 0.385877464 0.268086272 0.298593591 0.953193547 +-1.612903226 0.386083071 0.265930419 0.298505263 0.953699936 +-1.593352884 0.386287079 0.263743260 0.298421216 0.954194602 +-1.573802542 0.386489488 0.261524145 0.298341424 0.954677836 +-1.554252199 0.386690300 0.259272397 0.298265859 0.955149920 +-1.534701857 0.386889514 0.256987311 0.298194492 0.955611127 +-1.515151515 0.387087133 0.254668150 0.298127293 0.956061722 +-1.495601173 0.387283161 0.252314149 0.298064232 0.956501963 +-1.476050831 0.387477601 0.249924508 0.298005277 0.956932100 +-1.456500489 0.387670457 0.247498391 0.297950394 0.957352373 +-1.436950147 0.387861735 0.245034930 0.297899552 0.957763018 +-1.417399804 0.388051441 0.242533214 0.297852715 0.958164261 +-1.397849462 0.388239582 0.239992294 0.297809848 0.958556321 +-1.378299120 0.388426164 0.237411179 0.297770915 0.958939411 +-1.358748778 0.388611197 0.234788830 0.297735879 0.959313737 +-1.339198436 0.388794690 0.232124163 0.297704704 0.959679498 +-1.319648094 0.388976651 0.229416043 0.297677350 0.960036884 +-1.300097752 0.389157091 0.226663282 0.297653780 0.960386082 +-1.280547410 0.389336021 0.223864633 0.297633953 0.960727271 +-1.260997067 0.389513452 0.221018793 0.297617830 0.961060623 +-1.241446725 0.389689397 0.218124393 0.297605370 0.961386306 +-1.221896383 0.389863868 0.215179996 0.297596531 0.961704480 +-1.202346041 0.390036878 0.212184094 0.297591272 0.962015301 +-1.182795699 0.390208441 0.209135102 0.297589550 0.962318918 +-1.163245357 0.390378571 0.206031353 0.297591322 0.962615475 +-1.143695015 0.390547284 0.202871093 0.297596546 0.962905110 +-1.124144673 0.390714593 0.199652476 0.297605176 0.963187958 +-1.104594330 0.390880516 0.196373555 0.297617169 0.963464147 +-1.085043988 0.391045067 0.193032275 0.297632480 0.963733799 +-1.065493646 0.391208264 0.189626469 0.297651063 0.963997034 +-1.045943304 0.391370124 0.186153846 0.297672874 0.964253966 +-1.026392962 0.391530664 0.182611982 0.297697865 0.964504704 +-1.006842620 0.391689902 0.178998311 0.297725991 0.964749353 +-0.987292278 0.391847857 0.175310115 0.297757204 0.964988014 +-0.967741935 0.392004545 0.171544508 0.297791458 0.965220784 +-0.948191593 0.392159988 0.167698426 0.297828704 0.965447755 +-0.928641251 0.392314203 0.163768611 0.297868896 0.965669016 +-0.909090909 0.392467210 0.159751593 0.297911985 0.965884652 +-0.889540567 0.392619030 0.155643675 0.297957922 0.966094744 +-0.869990225 0.392769681 0.151440909 0.298006659 0.966299371 +-0.850439883 0.392919184 0.147139076 0.298058147 0.966498605 +-0.830889541 0.393067561 0.142733659 0.298112336 0.966692519 +-0.811339198 0.393214831 0.138219816 0.298169178 0.966881180 +-0.791788856 0.393361015 0.133592348 0.298228621 0.967064653 +-0.772238514 0.393506135 0.128845663 0.298290618 0.967243000 +-0.752688172 0.393650212 0.123973734 0.298355116 0.967416279 +-0.733137830 0.393793268 0.118970057 0.298422067 0.967584547 +-0.713587488 0.393935324 0.113827597 0.298491418 0.967747856 +-0.694037146 0.394076403 0.108538729 0.298563120 0.967906258 +-0.674486804 0.394216525 0.103095170 0.298637122 0.968059801 +-0.654936461 0.394355714 0.097487905 0.298713373 0.968208531 +-0.635386119 0.394493991 0.091707092 0.298791821 0.968352491 +-0.615835777 0.394631379 0.085741965 0.298872415 0.968491723 +-0.596285435 0.394767900 0.079580712 0.298955104 0.968626265 +-0.576735093 0.394903577 0.073210334 0.299039836 0.968756156 +-0.557184751 0.395038432 0.066616483 0.299126559 0.968881429 +-0.537634409 0.395172488 0.059783269 0.299215221 0.969002119 +-0.518084066 0.395305768 0.052693032 0.299305771 0.969118256 +-0.498533724 0.395438294 0.027022210 0.299398157 0.969229871 +-0.478983382 0.395570089 0.027105698 0.299492326 0.969336990 +-0.459433040 0.395701176 0.027190482 0.299588227 0.969439642 +-0.439882698 0.395831578 0.027276576 0.299685807 0.969537849 +-0.420332356 0.395961317 0.027363993 0.299785014 0.969631636 +-0.400782014 0.396090417 0.027452746 0.299885796 0.969721024 +-0.381231672 0.396218900 0.027542850 0.299988100 0.969806034 +-0.361681329 0.396346790 0.027634320 0.300091874 0.969886685 +-0.342130987 0.396474108 0.027727170 0.300197067 0.969962994 +-0.322580645 0.396600879 0.027821415 0.300303624 0.970034979 +-0.303030303 0.396727124 0.027917072 0.300411495 0.970102654 +-0.283479961 0.396852867 0.028014156 0.300520627 0.970166034 +-0.263929619 0.396978131 0.028112683 0.300630968 0.970225132 +-0.244379277 0.397102938 0.028212670 0.300742464 0.970279960 +-0.224828935 0.397227311 0.028314135 0.300855065 0.970330530 +-0.205278592 0.397351272 0.028417094 0.300968718 0.970376851 +-0.185728250 0.397474846 0.028521567 0.301083370 0.970418933 +-0.166177908 0.397598053 0.028627570 0.301198970 0.970456784 +-0.146627566 0.397720918 0.028735122 0.301315466 0.970490410 +-0.127077224 0.397843462 0.028844244 0.301432806 0.970519820 +-0.107526882 0.397965709 0.028954953 0.301550937 0.970545018 +-0.087976540 0.398087681 0.029067270 0.301669809 0.970566009 +-0.068426197 0.398209400 0.029181216 0.301789369 0.970582797 +-0.048875855 0.398330889 0.029296811 0.301909567 0.970595386 +-0.029325513 0.398452171 0.029414076 0.302030350 0.970603777 +-0.009775171 0.398573268 0.029533032 0.302151666 0.970607972 +0.009775171 0.398694203 0.029653702 0.302273469 0.970607972 +0.029325513 0.398814999 0.029776108 0.302395784 0.970603777 +0.048875855 0.398935677 0.029900272 0.302518700 0.970595386 +0.068426197 0.399056261 0.030026219 0.302642316 0.970582797 +0.087976540 0.399176774 0.030153971 0.302766728 0.970566009 +0.107526882 0.399297237 0.030283554 0.302892036 0.970545018 +0.127077224 0.399417674 0.030414991 0.303018334 0.970519820 +0.146627566 0.399538106 0.030548308 0.303145722 0.970490410 +0.166177908 0.399658558 0.030683531 0.303274297 0.970456784 +0.185728250 0.399779052 0.030820685 0.303404158 0.970418933 +0.205278592 0.399899611 0.030959797 0.303535401 0.970376851 +0.224828935 0.400020257 0.031100894 0.303668126 0.970330530 +0.244379277 0.400141014 0.031244004 0.303802430 0.970279960 +0.263929619 0.400261905 0.031389154 0.303938413 0.970225132 +0.283479961 0.400382953 0.031536374 0.304076173 0.970166034 +0.303030303 0.400504181 0.031685692 0.304215810 0.970102654 +0.322580645 0.400625614 0.031837138 0.304357422 0.970034979 +0.342130987 0.400747274 0.031990743 0.304501109 0.969962994 +0.361681329 0.400869186 0.032146536 0.304646971 0.969886685 +0.381231672 0.400991373 0.032304550 0.304795106 0.969806034 +0.400782014 0.401113861 0.032464815 0.304945616 0.969721024 +0.420332356 0.401236673 0.032627365 0.305098601 0.969631636 +0.439882698 0.401359833 0.032792232 0.305254160 0.969537849 +0.459433040 0.401483368 0.032959451 0.305412395 0.969439642 +0.478983382 0.401607302 0.033129054 0.305573406 0.969336990 +0.498533724 0.401731660 0.033301077 0.305737294 0.969229871 +0.518084066 0.401856469 0.059228582 0.305904161 0.969118256 +0.537634409 0.401981754 0.066576722 0.306074108 0.969002119 +0.557184751 0.402107541 0.073669107 0.306247236 0.968881429 +0.576735093 0.402233859 0.080523447 0.306423648 0.968756156 +0.596285435 0.402360733 0.087155681 0.306603447 0.968626265 +0.615835777 0.402488191 0.093580208 0.306786733 0.968491723 +0.635386119 0.402616261 0.099810074 0.306973611 0.968352491 +0.654936461 0.402744973 0.105857144 0.307164182 0.968208531 +0.674486804 0.402874354 0.111732235 0.307358550 0.968059801 +0.694037146 0.403004434 0.117445237 0.307556820 0.967906258 +0.713587488 0.403135242 0.123005220 0.307759093 0.967747856 +0.733137830 0.403266811 0.128420516 0.307965475 0.967584547 +0.752688172 0.403399170 0.133698805 0.308176069 0.967416279 +0.772238514 0.403532350 0.138847172 0.308390980 0.967243000 +0.791788856 0.403666386 0.143872177 0.308610313 0.967064653 +0.811339198 0.403801308 0.148779899 0.308834173 0.966881180 +0.830889541 0.403937152 0.153575984 0.309062665 0.966692519 +0.850439883 0.404073951 0.158265687 0.309295896 0.966498605 +0.869990225 0.404211740 0.162853905 0.309533970 0.966299371 +0.889540567 0.404350555 0.167345209 0.309776995 0.966094744 +0.909090909 0.404490433 0.171743876 0.310025076 0.965884652 +0.928641251 0.404631412 0.176053910 0.310278321 0.965669016 +0.948191593 0.404773529 0.180279066 0.310536838 0.965447755 +0.967741935 0.404916824 0.184422872 0.310800733 0.965220784 +0.987292278 0.405061338 0.188488644 0.311070115 0.964988014 +1.006842620 0.405207110 0.192479506 0.311345091 0.964749353 +1.026392962 0.405354184 0.196398403 0.311625771 0.964504704 +1.045943304 0.405502603 0.200248115 0.311912263 0.964253966 +1.065493646 0.405652411 0.204031268 0.312204677 0.963997034 +1.085043988 0.405803653 0.207750348 0.312503122 0.963733799 +1.104594330 0.405956376 0.211407710 0.312807708 0.963464147 +1.124144673 0.406110628 0.215005583 0.313118546 0.963187958 +1.143695015 0.406266458 0.218546087 0.313435746 0.962905110 +1.163245357 0.406423915 0.222031233 0.313759420 0.962615475 +1.182795699 0.406583053 0.225462935 0.314089679 0.962318918 +1.202346041 0.406743922 0.228843012 0.314426634 0.962015301 +1.221896383 0.406906579 0.232173199 0.314770399 0.961704480 +1.241446725 0.407071078 0.235455149 0.315121086 0.961386306 +1.260997067 0.407237476 0.238690441 0.315478807 0.961060623 +1.280547410 0.407405833 0.241880579 0.315843677 0.960727271 +1.300097752 0.407576209 0.245027006 0.316215809 0.960386082 +1.319648094 0.407748666 0.248131097 0.316595318 0.960036884 +1.339198436 0.407923267 0.251194171 0.316982319 0.959679498 +1.358748778 0.408100078 0.254217491 0.317376926 0.959313737 +1.378299120 0.408279166 0.257202267 0.317779255 0.958939411 +1.397849462 0.408460599 0.260149660 0.318189423 0.958556321 +1.417399804 0.408644448 0.263060786 0.318607545 0.958164261 +1.436950147 0.408830786 0.265936714 0.319033739 0.957763018 +1.456500489 0.409019687 0.268778475 0.319468122 0.957352373 +1.476050831 0.409211228 0.271587059 0.319910813 0.956932100 +1.495601173 0.409405488 0.274363417 0.320361928 0.956501963 +1.515151515 0.409602546 0.277108469 0.320821587 0.956061722 +1.534701857 0.409802487 0.279823099 0.321289910 0.955611127 +1.554252199 0.410005394 0.282508160 0.321767015 0.955149920 +1.573802542 0.410211355 0.285164474 0.322253024 0.954677836 +1.593352884 0.410420460 0.287792837 0.322748056 0.954194602 +1.612903226 0.410632801 0.290394016 0.323252234 0.953699936 +1.632453568 0.410848471 0.292968754 0.323765677 0.953193547 +1.652003910 0.411067568 0.295517767 0.324288509 0.952675137 +1.671554252 0.411290190 0.298041750 0.324820852 0.952144399 +1.691104594 0.411516441 0.300541377 0.325362830 0.951601015 +1.710654936 0.411746423 0.303017299 0.325914565 0.951044661 +1.730205279 0.411980245 0.305470146 0.326476181 0.950475002 +1.749755621 0.412218016 0.307900533 0.327047804 0.949891695 +1.769305963 0.412459849 0.310309053 0.327629558 0.949294386 +1.788856305 0.412705859 0.312696285 0.328221569 0.948682713 +1.808406647 0.412956165 0.315062788 0.328823962 0.948056303 +1.827956989 0.413210888 0.317409108 0.329436865 0.947414776 +1.847507331 0.413470153 0.319735776 0.330060404 0.946757739 +1.867057674 0.413734086 0.322043307 0.330694706 0.946084790 +1.886608016 0.414002820 0.324332205 0.331339900 0.945395519 +1.906158358 0.414276486 0.326602958 0.331996114 0.944689503 +1.925708700 0.414555223 0.328856044 0.332663476 0.943966312 +1.945259042 0.414839170 0.331091928 0.333342117 0.943225502 +1.964809384 0.415128472 0.333311065 0.334032167 0.942466622 +1.984359726 0.415423274 0.335513898 0.334733755 0.941689209 +2.003910068 0.415723728 0.337700860 0.335447012 0.940892790 +2.023460411 0.416029987 0.339872375 0.336172070 0.940076883 +2.043010753 0.416342210 0.342028856 0.336909060 0.939240993 +2.062561095 0.416660556 0.344170709 0.337658115 0.938384615 +2.082111437 0.416985191 0.346298330 0.338419368 0.937507236 +2.101661779 0.417316283 0.348412108 0.339192951 0.936608331 +2.121212121 0.417654004 0.350512425 0.339978998 0.935687364 +2.140762463 0.417998530 0.352599653 0.340777643 0.934743790 +2.160312805 0.418350041 0.354674158 0.341589020 0.933777052 +2.179863148 0.418708720 0.356736302 0.342413266 0.932786585 +2.199413490 0.419074756 0.358786437 0.343250513 0.931771812 +2.218963832 0.419448339 0.360824911 0.344100899 0.930732148 +2.238514174 0.419829666 0.362852066 0.344964560 0.929666996 +2.258064516 0.420218934 0.364868237 0.345841631 0.928575750 +2.277614858 0.420616350 0.366873757 0.346732250 0.927457796 +2.297165200 0.421022118 0.368868951 0.347636554 0.926312509 +2.316715543 0.421436453 0.370854140 0.348554680 0.925139256 +2.336265885 0.421859569 0.372829643 0.349486766 0.923937393 +2.355816227 0.422291687 0.374795771 0.350432950 0.922706271 +2.375366569 0.422733031 0.376752835 0.351393371 0.921445229 +2.394916911 0.423183830 0.378701139 0.352368168 0.920153600 +2.414467253 0.423644316 0.380640986 0.353357479 0.918830710 +2.434017595 0.424114726 0.382572673 0.354361444 0.917475877 +2.453567937 0.424595302 0.384496496 0.355380202 0.916088410 +2.473118280 0.425086289 0.386412749 0.356413894 0.914667616 +2.492668622 0.425587937 0.388321721 0.357462658 0.913212792 +2.512218964 0.426100499 0.390223699 0.358526635 0.911723233 +2.531769306 0.426624235 0.392118970 0.359605966 0.910198225 +2.551319648 0.427159405 0.394007815 0.360700791 0.908637054 +2.570869990 0.427706278 0.395890515 0.361811249 0.907039000 +2.590420332 0.428265123 0.397767351 0.362937483 0.905403340 +2.609970674 0.428836216 0.399638600 0.364079633 0.903729349 +2.629521017 0.429419836 0.401504537 0.365237839 0.902016302 +2.649071359 0.430016265 0.403365439 0.366412243 0.900263470 +2.668621701 0.430625792 0.405221577 0.367602984 0.898470126 +2.688172043 0.431248706 0.407073225 0.368810204 0.896635544 +2.707722385 0.431885303 0.408920655 0.370034044 0.894758999 +2.727272727 0.432535882 0.410764137 0.371274644 0.892839769 +2.746823069 0.433200746 0.412603942 0.372532144 0.890877137 +2.766373412 0.433880201 0.414440339 0.373806686 0.888870388 +2.785923754 0.434574556 0.416273598 0.375098408 0.886818816 +2.805474096 0.435284126 0.418103987 0.376407451 0.884721720 +2.825024438 0.436009227 0.419931775 0.377733955 0.882578408 +2.844574780 0.436750180 0.421757232 0.379078059 0.880388198 +2.864125122 0.437507308 0.423580626 0.380439902 0.878150418 +2.883675464 0.438280938 0.425402225 0.381819623 0.875864408 +2.903225806 0.439071398 0.427222300 0.383217359 0.873529524 +2.922776149 0.439879023 0.429041118 0.384633250 0.871145133 +2.942326491 0.440704145 0.430858952 0.386067432 0.868710622 +2.961876833 0.441547104 0.432676069 0.387520041 0.866225396 +2.981427175 0.442408239 0.434492743 0.388991215 0.863688877 +3.000977517 0.443287892 0.436309243 0.390481089 0.861100512 +3.020527859 0.444186407 0.438125842 0.391989797 0.858459769 +3.040078201 0.445104130 0.439942814 0.393517475 0.855766142 +3.059628543 0.446041409 0.441760430 0.395064254 0.853019152 +3.079178886 0.446998592 0.443578968 0.396630268 0.850218348 +3.098729228 0.447976030 0.445398700 0.398215648 0.847363310 +3.118279570 0.448974074 0.447219905 0.399820525 0.844453651 +3.137829912 0.449993075 0.449042858 0.401445028 0.841489018 +3.157380254 0.451033387 0.450867839 0.403089286 0.838469096 +3.176930596 0.452095362 0.452695126 0.404753425 0.835393608 +3.196480938 0.453179351 0.454524999 0.406437573 0.832262318 +3.216031281 0.454285709 0.456357739 0.408141854 0.829075035 +3.235581623 0.455414786 0.458193628 0.409866390 0.825831611 +3.255131965 0.456566933 0.460032949 0.411611303 0.822531948 +3.274682307 0.457742501 0.461875986 0.413376714 0.819175996 +3.294232649 0.458941837 0.463723023 0.415162741 0.815763759 +3.313782991 0.460165288 0.465574345 0.416969500 0.812295296 +3.333333333 0.461413199 0.467430239 0.418797106 0.808770721 +3.352883675 0.462685911 0.469290991 0.420645672 0.805190210 +3.372434018 0.463983765 0.471156887 0.422515308 0.801553999 +3.391984360 0.465307097 0.473028217 0.424406122 0.797862389 +3.411534702 0.466656239 0.474905267 0.426318219 0.794115748 +3.431085044 0.468031521 0.476788326 0.428251704 0.790314512 +3.450635386 0.469433268 0.478677682 0.430206676 0.786459190 +3.470185728 0.470861801 0.480573623 0.432183234 0.782550361 +3.489736070 0.472317434 0.482476438 0.434181471 0.778588685 +3.509286413 0.473800480 0.484386413 0.436201479 0.774574896 +3.528836755 0.475311241 0.486303836 0.438243346 0.770509809 +3.548387097 0.476850018 0.488228994 0.440307158 0.766394324 +3.567937439 0.478417103 0.490162170 0.442392993 0.762229423 +3.587487781 0.480012780 0.492103649 0.444500930 0.758016176 +3.607038123 0.481637330 0.494053714 0.446631040 0.753755740 +3.626588465 0.483291022 0.496012644 0.448783392 0.749449365 +3.646138807 0.484974119 0.497980719 0.450958049 0.745098390 +3.665689150 0.486686876 0.499958215 0.453155071 0.740704251 +3.685239492 0.488429538 0.501945405 0.455374509 0.736268477 +3.704789834 0.490202342 0.503942559 0.457616413 0.731792694 +3.724340176 0.492005515 0.505949945 0.459880823 0.727278628 +3.743890518 0.493839272 0.507967825 0.462167777 0.722728101 +3.763440860 0.495703820 0.509996460 0.464477305 0.718143038 +3.782991202 0.497599355 0.512036104 0.466809428 0.713525463 +3.802541544 0.499526060 0.514087007 0.469164163 0.708877501 +3.822091887 0.501484108 0.516149413 0.471541519 0.704201381 +3.841642229 0.503473659 0.518223561 0.473941496 0.699499433 +3.861192571 0.505494860 0.520309683 0.476364087 0.694774089 +3.880742913 0.507547847 0.522408005 0.478809276 0.690027883 +3.900293255 0.509632741 0.524518745 0.481277039 0.685263450 +3.919843597 0.511749649 0.526642114 0.483767340 0.680483527 +3.939393939 0.513898666 0.528778314 0.486280137 0.675690949 +3.958944282 0.516079869 0.530927538 0.488815375 0.670888651 +3.978494624 0.518293325 0.533089972 0.491372989 0.666079666 +3.998044966 0.520539081 0.535265788 0.493952902 0.661267120 +4.017595308 0.522817171 0.537455152 0.496555028 0.656454235 +4.037145650 0.525127612 0.539658217 0.499179267 0.651644322 +4.056695992 0.527470405 0.541875123 0.501825506 0.646840782 +4.076246334 0.529845534 0.544106000 0.504493619 0.642047101 +4.095796676 0.532252966 0.546350965 0.507183468 0.637266847 +4.115347019 0.534692652 0.548610121 0.509894901 0.632503669 +4.134897361 0.537164523 0.550883558 0.512627748 0.627761289 +4.154447703 0.539668492 0.553171352 0.515381829 0.623043500 +4.173998045 0.542204456 0.555473562 0.518156944 0.618354164 +4.193548387 0.544772290 0.557790233 0.520952880 0.613697201 +4.213098729 0.547371853 0.560121396 0.523769406 0.609076592 +4.232649071 0.550002983 0.562467062 0.526606275 0.604496365 +4.252199413 0.552665499 0.564827226 0.529463222 0.599960598 +4.271749756 0.555359199 0.567201868 0.532339963 0.595473405 +4.291300098 0.558083863 0.569590947 0.535236199 0.591038937 +4.310850440 0.560839249 0.571994406 0.538151608 0.586661369 +4.330400782 0.563625096 0.574412168 0.541085853 0.582344899 +4.349951124 0.566441120 0.576844136 0.544038576 0.578093735 +4.369501466 0.569287018 0.579290197 0.547009398 0.573912094 +4.389051808 0.572162465 0.581750215 0.549997921 0.569804190 +4.408602151 0.575067116 0.584224035 0.553003728 0.565774228 +4.428152493 0.578000602 0.586711483 0.556026379 0.561826396 +4.447702835 0.580962535 0.589212364 0.559065415 0.557964857 +4.467253177 0.583952505 0.591726462 0.562120355 0.554193739 +4.486803519 0.586970080 0.594253541 0.565190699 0.550517132 +4.506353861 0.590014805 0.596793345 0.568275924 0.546939073 +4.525904203 0.593086205 0.599345597 0.571375487 0.543463541 +4.545454545 0.596183783 0.601909999 0.574488824 0.540094448 +4.565004888 0.599307020 0.604486235 0.577615349 0.536835632 +4.584555230 0.602455376 0.607073967 0.580754457 0.533690844 +4.604105572 0.605628288 0.609672837 0.583905522 0.530663745 +4.623655914 0.608825173 0.612282470 0.587067897 0.527757894 +4.643206256 0.612045427 0.614902469 0.590240917 0.524976740 +4.662756598 0.615288423 0.617532422 0.593423894 0.522323618 +4.682306940 0.618553515 0.620171896 0.596616126 0.519801732 +4.701857283 0.621840036 0.622820441 0.599816889 0.517414159 +4.721407625 0.625147298 0.625477592 0.603025442 0.515163830 +4.740957967 0.628474594 0.628142866 0.606241027 0.513053531 +4.760508309 0.631821196 0.630815766 0.609462869 0.511085893 +4.780058651 0.635186360 0.633495779 0.612690179 0.509263383 +4.799608993 0.638569318 0.636182379 0.615922152 0.507588303 +4.819159335 0.641969289 0.638875028 0.619157968 0.506062780 +4.838709677 0.645385471 0.641573176 0.622396796 0.504688760 +4.858260020 0.648817045 0.644276261 0.625637791 0.503468006 +4.877810362 0.652263177 0.646983713 0.628880099 0.502402092 +4.897360704 0.655723015 0.649694950 0.632122854 0.501492397 +4.916911046 0.659195692 0.652409387 0.635365185 0.500740105 +4.936461388 0.662680328 0.655126430 0.638606208 0.500146198 +4.956011730 0.666176028 0.657845479 0.641845038 0.499711457 +4.975562072 0.669681882 0.660565932 0.645080783 0.499436455 +4.995112414 0.673196970 0.663287182 0.648312545 0.499321562 +5.014662757 0.676720360 0.666008622 0.651539426 0.499366939 +5.034213099 0.680251108 0.668729645 0.654760527 0.499572537 +5.053763441 0.683788262 0.671449643 0.657974949 0.499938103 +5.073313783 0.687330859 0.674168011 0.661181793 0.500463174 +5.092864125 0.690877929 0.676884147 0.664380165 0.501147082 +5.112414467 0.694428497 0.679597454 0.667569174 0.501988956 +5.131964809 0.697981578 0.682307340 0.670747935 0.502987722 +5.151515152 0.701536185 0.685013220 0.673915569 0.504142106 +5.171065494 0.705091325 0.687714518 0.677071207 0.505450642 +5.190615836 0.708646004 0.690410664 0.680213988 0.506911670 +5.210166178 0.712199225 0.693101102 0.683343063 0.508523343 +5.229716520 0.715749989 0.695785285 0.686457593 0.510283632 +5.249266862 0.719297300 0.698462678 0.689556754 0.512190333 +5.268817204 0.722840161 0.701132759 0.692639737 0.514241067 +5.288367546 0.726377577 0.703795021 0.695705746 0.516433293 +5.307917889 0.729908558 0.706448971 0.698754004 0.518764310 +5.327468231 0.733432118 0.709094133 0.701783750 0.521231265 +5.347018573 0.736947277 0.711730044 0.704794242 0.523831163 +5.366568915 0.740453059 0.714356261 0.707784757 0.528348490 +5.386119257 0.743948500 0.716972359 0.710754595 0.533191116 +5.405669599 0.747432640 0.719577928 0.713703072 0.538084034 +5.425219941 0.750904533 0.722172580 0.716629531 0.543024859 +5.444770283 0.754363240 0.724755944 0.719533334 0.548011143 +5.464320626 0.757807835 0.727327669 0.722413869 0.553040388 +5.483870968 0.761237407 0.729887424 0.725270545 0.558110043 +5.503421310 0.764651055 0.732434899 0.728102796 0.563217514 +5.522971652 0.768047895 0.734969801 0.730910082 0.568360169 +5.542521994 0.771427056 0.737491860 0.733691887 0.573535337 +5.562072336 0.774787686 0.740000828 0.736447718 0.578740320 +5.581622678 0.778128948 0.742496473 0.739177112 0.583972395 +5.601173021 0.781450023 0.744978587 0.741879629 0.589228817 +5.620723363 0.784750112 0.747446980 0.744554853 0.594506829 +5.640273705 0.788028433 0.749901485 0.747202397 0.599803661 +5.659824047 0.791284227 0.752341953 0.749821899 0.605116539 +5.679374389 0.794516752 0.754768254 0.752413022 0.610442691 +5.698924731 0.797725290 0.757180280 0.754975454 0.615779346 +5.718475073 0.800909145 0.759577940 0.757508910 0.621123745 +5.738025415 0.804067641 0.761961164 0.760013130 0.626473140 +5.757575758 0.807200126 0.764329899 0.762487877 0.631824806 +5.777126100 0.810305972 0.766684110 0.764932941 0.637176035 +5.796676442 0.813384574 0.769023782 0.767348137 0.642524151 +5.816226784 0.816435351 0.771348914 0.769733300 0.647866507 +5.835777126 0.819457745 0.773659524 0.772088292 0.653200489 +5.855327468 0.822451226 0.775955646 0.774412998 0.658523526 +5.874877810 0.825415285 0.778237329 0.776707323 0.663833086 +5.894428152 0.828349441 0.780504638 0.778971198 0.669126684 +5.913978495 0.831253236 0.782757652 0.781204571 0.674401884 +5.933528837 0.834126239 0.784996464 0.783407415 0.679656302 +5.953079179 0.836968044 0.787221183 0.785579722 0.684887610 +5.972629521 0.839778269 0.789431928 0.787721503 0.690093535 +5.992179863 0.842556558 0.791628832 0.789832789 0.695271867 +6.011730205 0.845302583 0.793812039 0.791913630 0.700420458 +6.031280547 0.848016037 0.795981706 0.793964094 0.705537222 +6.050830890 0.850696641 0.798137998 0.795984266 0.710620141 +6.070381232 0.853344140 0.800281095 0.797974247 0.715667266 +6.089931574 0.855958305 0.802411181 0.799934156 0.720676716 +6.109481916 0.858538928 0.804528452 0.801864127 0.725646682 +6.129032258 0.861085830 0.806633115 0.803764306 0.730575427 +6.148582600 0.863598854 0.808725380 0.805634858 0.735461284 +6.168132942 0.866077865 0.810805468 0.807475957 0.740302664 +6.187683284 0.868522753 0.812873607 0.809287792 0.745098049 +6.207233627 0.870933433 0.814930030 0.811070565 0.749845997 +6.226783969 0.873309839 0.816974977 0.812824489 0.754545140 +6.246334311 0.875651928 0.819008695 0.814549786 0.759194186 +6.265884653 0.877959681 0.821031434 0.816246692 0.763791917 +6.285434995 0.880233099 0.823043450 0.817915450 0.768337189 +6.304985337 0.882472202 0.825045003 0.819556313 0.772828933 +6.324535679 0.884677032 0.827036357 0.821169543 0.777266154 +6.344086022 0.886847652 0.829017781 0.822755409 0.781647928 +6.363636364 0.888984143 0.830989546 0.824314190 0.785973406 +6.383186706 0.891086603 0.832951925 0.825846168 0.790241807 +6.402737048 0.893155150 0.834905196 0.827351636 0.794452424 +6.422287390 0.895189920 0.836849638 0.828830889 0.798604616 +6.441837732 0.897191066 0.838785531 0.830284230 0.802697811 +6.461388074 0.899158755 0.840713158 0.831711965 0.806731506 +6.480938416 0.901093173 0.842632805 0.974837636 0.810705259 +6.500488759 0.902994519 0.844544755 0.975474355 0.814618695 +6.520039101 0.904863008 0.846449296 0.976084124 0.818471500 +6.539589443 0.906698868 0.848346715 0.976667723 0.822263423 +6.559139785 0.908502341 0.850237300 0.977225919 0.825994269 +6.578690127 0.910273681 0.852121339 0.977759471 0.829663902 +6.598240469 0.912013157 0.853999120 0.978269126 0.833272243 +6.617790811 0.913721045 0.855870932 0.978755621 0.836819264 +6.637341153 0.915397636 0.857737064 0.979219681 0.840304993 +6.656891496 0.917043229 0.859597803 0.979662018 0.843729506 +6.676441838 0.918658135 0.861453438 0.980083334 0.847092928 +6.695992180 0.920242672 0.863304256 0.980484317 0.850395431 +6.715542522 0.921797168 0.865150544 0.980865643 0.853637232 +6.735092864 0.923321958 0.866992589 0.981227976 0.856818591 +6.754643206 0.924817387 0.868830675 0.981571966 0.859939810 +6.774193548 0.926283803 0.870665088 0.981898253 0.863001228 +6.793743891 0.927721565 0.872496112 0.982207459 0.866003225 +6.813294233 0.929131034 0.874324031 0.982500198 0.868946215 +6.832844575 0.930512579 0.876149127 0.982777068 0.871830645 +6.852394917 0.931866572 0.877971680 0.983038655 0.874656996 +6.871945259 0.933193391 0.879791973 0.983285532 0.877425778 +6.891495601 0.934493417 0.881610285 0.983518258 0.880137530 +6.911045943 0.935767035 0.883426895 0.983737380 0.882792818 +6.930596285 0.937014632 0.885242080 0.983943431 0.885392235 +6.950146628 0.938236598 0.887056119 0.984136933 0.887936394 +6.969696970 0.939433326 0.888869286 0.984318393 0.890425933 +6.989247312 0.940605210 0.890681859 0.984488306 0.892861508 +7.008797654 0.941752645 0.892494111 0.984647156 0.895243797 +7.028347996 0.942876027 0.894306317 0.984795412 0.897573493 +7.047898338 0.943975752 0.896118751 0.984933532 0.899851304 +7.067448680 0.945052218 0.897931684 0.985061963 0.902077955 +7.086999022 0.946105820 0.899745389 1.002592474 0.904254182 +7.106549365 0.947136956 0.901560139 1.002380834 0.906380735 +7.126099707 0.948146019 0.903376205 1.002167690 0.908458371 +7.145650049 0.949133405 0.905193857 1.001953273 0.910487860 +7.165200391 0.950099506 0.907013367 1.001737809 0.912469977 +7.184750733 0.951044712 0.908835006 1.001521514 0.914405505 +7.204301075 0.951969413 0.910659044 1.001304598 0.916295232 +7.223851417 0.952873994 0.912485753 1.001087265 0.918139952 +7.243401760 0.953758841 0.914315403 1.000869711 0.919940461 +7.262952102 0.954624335 0.916148265 1.000652126 0.921697558 +7.282502444 0.955470853 0.917984613 1.000434693 0.923412044 +7.302052786 0.956298772 0.919824717 1.000217589 0.925084719 +7.321603128 0.957108463 0.921668851 1.000000985 0.926716386 +7.341153470 0.957900295 0.923517288 0.999785044 0.928307843 +7.360703812 0.958674632 0.925370304 0.999569925 0.929859890 +7.380254154 0.959431837 0.927228173 0.999355780 0.931373321 +7.399804497 0.960172265 0.929091173 0.999142754 0.932848928 +7.419354839 0.960896270 0.930959582 0.998930989 0.934287501 +7.438905181 0.961604200 0.932833679 0.998720619 0.935689822 +7.458455523 0.962296401 0.934713745 0.998511774 0.937056670 +7.478005865 0.962973211 0.936600065 0.998304577 0.938388818 +7.497556207 0.963634966 0.938492922 0.998099147 0.939687031 +7.517106549 0.964281998 0.940392605 0.997895597 0.940952069 +7.536656891 0.964914631 0.942299402 0.997694036 0.942184685 +7.556207234 0.965533188 0.944213605 0.997494567 0.943385622 +7.575757576 0.966137986 0.946135510 0.997297289 0.944555617 +7.595307918 0.966729334 0.948065413 0.997102296 0.945695397 +7.614858260 0.967307542 0.950003616 0.996909678 0.946805682 +7.634408602 0.967872909 0.951950421 0.996719519 0.947887182 +7.653958944 0.968425733 0.953906137 0.996531899 0.948940596 +7.673509286 0.968966306 0.955871074 0.996346896 0.949966615 +7.693059629 0.969494914 0.957845548 0.996164582 0.950965920 +7.712609971 0.970011839 0.959829876 0.995985025 0.951939181 +7.732160313 0.970517358 0.961824384 0.995808288 0.952887058 +7.751710655 0.971011741 0.963829399 0.995634434 0.953810202 +7.771260997 0.971495257 0.965845253 0.995463518 0.954709250 +7.790811339 0.971968165 0.967872286 0.995295594 0.955584830 +7.810361681 0.972430722 0.969910840 0.995130712 0.956437560 +7.829912023 0.972883181 0.971961266 0.994968918 0.957268046 +7.849462366 0.973325786 0.974023918 0.994810255 0.958076882 +7.869012708 0.973758780 0.976099158 0.994654763 0.958864652 +7.888563050 0.974182400 0.978187355 0.994502479 0.959631929 +7.908113392 0.974596876 0.980288884 0.994353435 0.960379274 +7.927663734 0.975002435 0.982404128 0.994207664 0.961107238 +7.947214076 0.975399300 0.984533476 0.994065193 0.961816357 +7.966764418 0.975787687 0.986677328 0.993926047 0.962507161 +7.986314761 0.976167809 0.988836091 0.993790249 0.963180165 +8.005865103 0.976539873 0.991010180 0.993657817 0.963835875 +8.025415445 0.976904083 0.993200021 0.993528771 0.964474784 +8.044965787 0.977260637 0.995406048 0.993403123 0.965097376 +8.064516129 0.977609728 0.997628707 0.993280887 0.965704121 +8.084066471 0.977951547 0.999868453 0.993162074 0.966295481 +8.103616813 0.978286278 1.002125754 0.993046689 0.966871906 +8.123167155 0.978614101 1.004401089 0.992934740 0.967433834 +8.142717498 0.978935194 1.006694948 0.992826230 0.967981696 +8.162267840 0.979249728 1.009007836 0.992721160 0.968515908 +8.181818182 0.979557870 1.011340271 0.992619530 0.969036877 +8.201368524 0.979859786 1.013692784 0.992521337 0.969545002 +8.220918866 0.980155633 1.016065922 0.992426578 0.970040668 +8.240469208 0.980445569 1.018460248 0.992335245 0.970524254 +8.260019550 0.980729744 1.020876341 0.992247331 0.970996125 +8.279569892 0.981008307 1.023314795 0.992162827 0.971456638 +8.299120235 0.981281401 1.025776226 0.992081721 0.971906142 +8.318670577 0.981549168 1.028261267 0.992004001 0.972344973 +8.338220919 0.981811743 1.030770569 0.991929651 0.972773460 +8.357771261 0.982069259 1.033304807 0.991858657 0.973191923 +8.377321603 0.982321847 1.035864677 0.991791000 0.973600671 +8.396871945 0.982569632 1.038450896 0.991726662 0.974000006 +8.416422287 0.982812738 1.041064207 0.991665623 0.974390219 +8.435972630 0.983051282 1.043705380 0.991607861 0.974771595 +8.455522972 0.983285382 1.046375209 0.991553354 0.975144408 +8.475073314 0.983515150 1.049074518 0.991502077 0.975508927 +8.494623656 0.983740696 1.051804159 0.991454006 0.975865408 +8.514173998 0.983962127 1.054565017 0.991409113 0.976214104 +8.533724340 0.984179547 1.057358011 0.991367372 0.976555258 +8.553274682 0.984393055 1.060184091 0.991328752 0.976889103 +8.572825024 0.984602750 1.063044249 0.991293226 0.977215870 +8.592375367 0.984808728 1.065939511 0.991260762 0.977535777 +8.611925709 0.985011080 1.068870948 0.991231327 0.977849039 +8.631476051 0.985209896 1.071839672 0.991204890 0.978155861 +8.651026393 0.985405263 1.074846843 0.991181417 0.978456444 +8.670576735 0.985597266 1.077893668 0.991160872 0.978750979 +8.690127077 0.985785986 1.080981408 0.991143221 0.979039655 +8.709677419 0.985971504 1.084111376 0.991128426 0.979322649 +8.729227761 0.986153896 1.087284946 0.991116451 0.979600136 +8.748778104 0.986333238 1.090503553 0.991107257 0.979872285 +8.768328446 0.986509602 1.093768697 0.991100805 0.980139256 +8.787878788 0.986683058 1.097081949 0.991097055 0.980401206 +8.807429130 0.986853675 1.100444956 0.991095968 0.980658285 +8.826979472 0.987021520 1.103859443 0.991097502 0.980910639 +8.846529814 0.987186656 1.107327221 0.991101614 0.981158407 +8.866080156 0.987349145 1.110850192 0.991108263 0.981401724 +8.885630499 0.987509049 1.114430354 0.991117404 0.981640720 +8.905180841 0.987666426 1.118069812 0.991128994 0.981875520 +8.924731183 0.987821332 1.121770781 0.991142989 0.982106245 +8.944281525 0.987973822 1.125535597 0.991159342 0.982333009 +8.963831867 0.988123950 1.129366725 0.991178008 0.982555924 +8.983382209 0.988271767 1.133266769 0.991198941 0.982775098 +9.002932551 0.988417324 1.137238482 0.991222093 0.982990633 +9.022482893 0.988560669 1.141284781 0.991247417 0.983202628 +9.042033236 0.988701848 1.145408755 0.991274865 0.983411179 +9.061583578 0.988840908 1.149613685 0.991304388 0.983616377 +9.081133920 0.988977892 1.153903056 0.991335936 0.983818309 +9.100684262 0.989112843 1.158280577 0.991369461 0.984017061 +9.120234604 0.989245803 1.162750199 0.991404910 0.984212713 +9.139784946 0.989376812 1.167316136 0.991442235 0.984405342 +9.159335288 0.989505909 1.171982895 0.991481384 0.984595024 +9.178885630 0.989633131 1.176755294 0.991522305 0.984781831 +9.198435973 0.989758516 1.181638503 0.991564945 0.984965831 +9.217986315 0.989882097 1.186638068 0.991609253 0.985147090 +9.237536657 0.990003911 1.191759957 0.991655175 0.985325671 +9.257086999 0.990123990 1.197010601 0.991702658 0.985501637 +9.276637341 0.990242367 1.202396944 0.991751648 0.985675044 +9.296187683 0.990359073 1.207926497 0.991802091 0.985845950 +9.315738025 0.990474139 1.213607404 0.991853933 0.986014408 +9.335288368 0.990587594 1.219448518 0.991907117 0.986180470 +9.354838710 0.990699467 1.225459479 0.991961589 0.986344185 +9.374389052 0.990809786 1.231650818 0.992017292 0.986505602 +9.393939394 0.990918578 1.238034064 0.992074172 0.986664767 +9.413489736 0.991025869 1.244621880 0.992132171 0.986821723 +9.433040078 0.991131686 1.251428214 0.992191233 0.986976513 +9.452590420 0.991236052 1.258468479 0.992251299 0.987129179 +9.472140762 0.991338993 1.265759770 0.992312314 0.987279759 +9.491691105 0.991440532 1.273321111 0.992374218 0.987428291 +9.511241447 0.991540692 0.992164312 0.992436955 0.987575668 +9.530791789 0.991639495 0.992262666 0.992500464 0.987720028 +9.550342131 0.991736963 0.992359625 0.992564688 0.987862482 +9.569892473 0.991833119 0.992455211 0.992629568 0.988003057 +9.589442815 0.991927981 0.992549446 0.992695043 0.988141779 +9.608993157 0.992021572 0.992642351 0.992761056 0.988278677 +9.628543500 0.992113910 0.992733945 0.992827544 0.988413775 +9.648093842 0.992205015 0.992824249 0.992894449 0.988547100 +9.667644184 0.992294906 0.992913284 0.992961710 0.988678678 +9.687194526 0.992383601 0.993001068 0.993029266 0.988808533 +9.706744868 0.992471119 0.993087620 0.993097056 0.988936690 +9.726295210 0.992557478 0.993172960 0.993165018 0.989063173 +9.745845552 0.992642695 0.993257106 0.993233092 0.989188007 +9.765395894 0.992726786 0.993340077 0.993301216 0.989311215 +9.784946237 0.992809769 0.993421890 0.993369327 0.989432820 +9.804496579 0.992891660 0.993502563 0.993437363 0.989552846 +9.824046921 0.992972476 0.993582113 0.993505262 0.989671314 +9.843597263 0.993052231 0.993660558 0.993572961 0.989788247 +9.863147605 0.993130943 0.993737915 0.993640397 0.989903667 +9.882697947 0.993208625 0.993814199 0.993707507 0.990017596 +9.902248289 0.993285293 0.993889428 0.993774227 0.990130054 +9.921798631 0.993360962 0.993963617 0.993840495 0.990241062 +9.941348974 0.993435646 0.994036782 0.993906246 0.990350642 +9.960899316 0.993509359 0.994108939 0.993971416 0.990458813 +9.980449658 0.993582116 0.994180103 0.994035940 0.990565596 +10.000000000 0.993653931 0.994250289 0.994099756 0.990671009 diff --git a/examples/tsukamoto/tsukamoto.fll b/examples/tsukamoto/tsukamoto.fll new file mode 100644 index 0000000..0437d5d --- /dev/null +++ b/examples/tsukamoto/tsukamoto.fll @@ -0,0 +1,61 @@ +Engine: tsukamoto +InputVariable: X + enabled: true + range: -10.000 10.000 + lock-range: false + term: small Bell -10.000 5.000 3.000 + term: medium Bell 0.000 5.000 3.000 + term: large Bell 10.000 5.000 3.000 +OutputVariable: Ramps + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Ramp 0.600 0.400 + term: a Ramp 0.000 0.250 + term: c Ramp 0.700 1.000 +OutputVariable: Sigmoids + enabled: true + range: 0.020 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Sigmoid 0.500 -30.000 + term: a Sigmoid 0.130 30.000 + term: c Sigmoid 0.830 30.000 +OutputVariable: ZSShapes + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b ZShape 0.300 0.600 + term: a SShape 0.000 0.250 + term: c SShape 0.700 1.000 +OutputVariable: Concaves + enabled: true + range: 0.000 1.000 + lock-range: false + aggregation: none + defuzzifier: WeightedAverage Automatic + default: nan + lock-previous: false + term: b Concave 0.500 0.400 + term: a Concave 0.240 0.250 + term: c Concave 0.900 1.000 +RuleBlock: + enabled: true + conjunction: none + disjunction: none + implication: none + activation: General + rule: if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a + rule: if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b + rule: if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c
\ No newline at end of file diff --git a/examples/tsukamoto/tsukamoto.java b/examples/tsukamoto/tsukamoto.java new file mode 100644 index 0000000..f51d968 --- /dev/null +++ b/examples/tsukamoto/tsukamoto.java @@ -0,0 +1,108 @@ +import com.fuzzylite.*; +import com.fuzzylite.activation.* +import com.fuzzylite.defuzzifier.*; +import com.fuzzylite.factory.*; +import com.fuzzylite.hedge.*; +import com.fuzzylite.imex.*; +import com.fuzzylite.norm.*; +import com.fuzzylite.norm.s.*; +import com.fuzzylite.norm.t.*; +import com.fuzzylite.rule.*; +import com.fuzzylite.term.*; +import com.fuzzylite.variable.*; + +public class tsukamoto{ +public static void main(String[] args){ +//Code automatically generated with fuzzylite 6.0. + +Engine engine = new Engine(); +engine.setName("tsukamoto"); +engine.setDescription(""); + +InputVariable X = new InputVariable(); +X.setName("X"); +X.setDescription(""); +X.setEnabled(true); +X.setRange(-10.000, 10.000); +X.setLockValueInRange(false); +X.addTerm(new Bell("small", -10.000, 5.000, 3.000)); +X.addTerm(new Bell("medium", 0.000, 5.000, 3.000)); +X.addTerm(new Bell("large", 10.000, 5.000, 3.000)); +engine.addInputVariable(X); + +OutputVariable Ramps = new OutputVariable(); +Ramps.setName("Ramps"); +Ramps.setDescription(""); +Ramps.setEnabled(true); +Ramps.setRange(0.000, 1.000); +Ramps.setLockValueInRange(false); +Ramps.setAggregation(null); +Ramps.setDefuzzifier(new WeightedAverage("Automatic")); +Ramps.setDefaultValue(Double.NaN); +Ramps.setLockPreviousValue(false); +Ramps.addTerm(new Ramp("b", 0.600, 0.400)); +Ramps.addTerm(new Ramp("a", 0.000, 0.250)); +Ramps.addTerm(new Ramp("c", 0.700, 1.000)); +engine.addOutputVariable(Ramps); + +OutputVariable Sigmoids = new OutputVariable(); +Sigmoids.setName("Sigmoids"); +Sigmoids.setDescription(""); +Sigmoids.setEnabled(true); +Sigmoids.setRange(0.020, 1.000); +Sigmoids.setLockValueInRange(false); +Sigmoids.setAggregation(null); +Sigmoids.setDefuzzifier(new WeightedAverage("Automatic")); +Sigmoids.setDefaultValue(Double.NaN); +Sigmoids.setLockPreviousValue(false); +Sigmoids.addTerm(new Sigmoid("b", 0.500, -30.000)); +Sigmoids.addTerm(new Sigmoid("a", 0.130, 30.000)); +Sigmoids.addTerm(new Sigmoid("c", 0.830, 30.000)); +engine.addOutputVariable(Sigmoids); + +OutputVariable ZSShapes = new OutputVariable(); +ZSShapes.setName("ZSShapes"); +ZSShapes.setDescription(""); +ZSShapes.setEnabled(true); +ZSShapes.setRange(0.000, 1.000); +ZSShapes.setLockValueInRange(false); +ZSShapes.setAggregation(null); +ZSShapes.setDefuzzifier(new WeightedAverage("Automatic")); +ZSShapes.setDefaultValue(Double.NaN); +ZSShapes.setLockPreviousValue(false); +ZSShapes.addTerm(new ZShape("b", 0.300, 0.600)); +ZSShapes.addTerm(new SShape("a", 0.000, 0.250)); +ZSShapes.addTerm(new SShape("c", 0.700, 1.000)); +engine.addOutputVariable(ZSShapes); + +OutputVariable Concaves = new OutputVariable(); +Concaves.setName("Concaves"); +Concaves.setDescription(""); +Concaves.setEnabled(true); +Concaves.setRange(0.000, 1.000); +Concaves.setLockValueInRange(false); +Concaves.setAggregation(null); +Concaves.setDefuzzifier(new WeightedAverage("Automatic")); +Concaves.setDefaultValue(Double.NaN); +Concaves.setLockPreviousValue(false); +Concaves.addTerm(new Concave("b", 0.500, 0.400)); +Concaves.addTerm(new Concave("a", 0.240, 0.250)); +Concaves.addTerm(new Concave("c", 0.900, 1.000)); +engine.addOutputVariable(Concaves); + +RuleBlock ruleBlock = new RuleBlock(); +ruleBlock.setName(""); +ruleBlock.setDescription(""); +ruleBlock.setEnabled(true); +ruleBlock.setConjunction(null); +ruleBlock.setDisjunction(null); +ruleBlock.setImplication(null); +ruleBlock.setActivation(new General()); +ruleBlock.addRule(Rule.parse("if X is small then Ramps is a and Sigmoids is a and ZSShapes is a and Concaves is a", engine)); +ruleBlock.addRule(Rule.parse("if X is medium then Ramps is b and Sigmoids is b and ZSShapes is b and Concaves is b", engine)); +ruleBlock.addRule(Rule.parse("if X is large then Ramps is c and Sigmoids is c and ZSShapes is c and Concaves is c", engine)); +engine.addRuleBlock(ruleBlock); + + +} +} diff --git a/examples/tsukamoto/tsukamoto.pdf b/examples/tsukamoto/tsukamoto.pdf Binary files differnew file mode 100644 index 0000000..9c4f375 --- /dev/null +++ b/examples/tsukamoto/tsukamoto.pdf |