From a867faae1e2c2ac331292af642dbe8e54fe5883a Mon Sep 17 00:00:00 2001 From: Mikhail Paulyshka Date: Sun, 2 Nov 2014 23:41:41 +0300 Subject: [PATCH] use vanilla Fuzzylite --- AI/FuzzyLite/.travis.yml | 50 ++++++ AI/FuzzyLite/NEWS | 2 +- AI/FuzzyLite/README.md | 2 +- AI/FuzzyLite/fuzzylite/CMakeLists.txt | 168 ++++++++++++------ AI/FuzzyLite/fuzzylite/fl/fuzzylite.h | 4 +- AI/FuzzyLite/fuzzylite/fl/term/Accumulated.h | 4 +- .../fuzzylite/src/rule/Antecedent.cpp | 8 +- AI/FuzzyLite/fuzzylite/src/term/Discrete.cpp | 4 +- AI/FuzzyLite/fuzzylite/src/term/Function.cpp | 4 +- 9 files changed, 183 insertions(+), 63 deletions(-) create mode 100644 AI/FuzzyLite/.travis.yml diff --git a/AI/FuzzyLite/.travis.yml b/AI/FuzzyLite/.travis.yml new file mode 100644 index 000000000..5762970a1 --- /dev/null +++ b/AI/FuzzyLite/.travis.yml @@ -0,0 +1,50 @@ +language: cpp + +before_install: + #new GCC + - sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test + #new Clang + - sudo add-apt-repository --yes ppa:h-rayflood/llvm + #new CMake + - sudo add-apt-repository --yes ppa:andykimpe/cmake + + - sudo apt-get update -qq + - sudo apt-get install -qq cmake + - sudo apt-get install -qq $SUPPORT + - sudo apt-get install -qq $PACKAGE + + #setup compiler + - export CC=${REAL_CC} CXX=${REAL_CXX} + +before_script: + - mkdir build + - cd build + - cmake ../fuzzylite + +script: + - make + +env: + - ignore=this + +matrix: + exclude: + - env: ignore=this + include: + - compiler: clang + env: REAL_CC=clang-3.2 REAL_CXX=clang++-3.2 PACKAGE=clang-3.2 SUPPORT=g++-4.8 + - compiler: clang + env: REAL_CC=clang-3.3 REAL_CXX=clang++-3.3 PACKAGE=clang-3.3 SUPPORT=g++-4.8 + - compiler: clang + env: REAL_CC=clang-3.4 REAL_CXX=clang++-3.4 PACKAGE=clang-3.4 SUPPORT=g++-4.8 + - compiler: gcc + env: REAL_CC=gcc-4.7 REAL_CXX=g++-4.7 PACKAGE=g++-4.7 SUPPORT= + - compiler: gcc + env: REAL_CC=gcc-4.8 REAL_CXX=g++-4.8 PACKAGE=g++-4.8 SUPPORT= + +notifications: + email: + recipients: + - uzzylite.fail@mixaill.tk + on_success: change + on_failure: always diff --git a/AI/FuzzyLite/NEWS b/AI/FuzzyLite/NEWS index b7d3958f0..daa131e6e 100644 --- a/AI/FuzzyLite/NEWS +++ b/AI/FuzzyLite/NEWS @@ -232,7 +232,7 @@ The entire `fuzzylite` library has been thoroughly revised, refactored, validate * Added method `WeightedDefuzzifier::inferType(Term*)` to automatically determine the `WeightedDefuzzifier::Type` based on the class of `Term`. * **(important)** By default, `WeightedDefuzzifier::type = Automatic`, which automatically infers the type based on the `WeightedDefuzzifier::inferType()`. * **(important)** There is a small performance penalty when using `WeightedDefuzzifier::type = Automatic` because `WeightedDefuzzifier::inferType()` performs three `dynamic_cast<>`. -* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows to be overriden +* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows overriding it * Added support for `Tsukamoto` with `Concave` terms. + **(EXTREMELY important)** In version 5.0, the traditional operation of Takagi-Sugeno and Tsukamoto controllers is achieved by setting `OutputVariable::accumulation = none`. Unlike version 4.0, the `RuleBlock::activation` will not have any effect on Takagi-Sugeno nor Tsukamoto controllers, for which `RuleBlock::activation` should also be set to `none`. More information about the roles of the `OutputVariable::accumulation` and `RuleBlock::activation` operators are detailed as follows. Refer to [sciweavers](http://www.sciweavers.org/free-online-latex-equation-editor) to convert LaTeX equations. + **(VERY important)** In version 5.0, the role of the `RuleBlock::activation` `TNorm` on the `Weighted[Average|Sum]` always performs a regular multiplication of the weights and the values (i.e., $w_i \times z_j$) regardless of the `TNorm` chosen. In other words, selecting any `RuleBlock::activation` for `Weighted[Average|Sum]` is irrelevant, and should be set to `none` as every `TNorm` will have the same multiplication effect. This operation is different from `fuzzylite` version 4.0, where the `RuleBlock::activation` operator was utilized to multiply the weights and values (i.e. $w_i \otimes z_j$), and therefore the traditional operation of the `Weighted[Average|Sum]` was achieved when `RuleBlock::activation = AlgebraicProduct;`. diff --git a/AI/FuzzyLite/README.md b/AI/FuzzyLite/README.md index 6f800095e..c06ccf7ae 100644 --- a/AI/FuzzyLite/README.md +++ b/AI/FuzzyLite/README.md @@ -288,7 +288,7 @@ The entire `fuzzylite` library has been thoroughly revised, refactored, validate * Added method `WeightedDefuzzifier::inferType(Term*)` to automatically determine the `WeightedDefuzzifier::Type` based on the class of `Term`. * **(important)** By default, `WeightedDefuzzifier::type = Automatic`, which automatically infers the type based on the `WeightedDefuzzifier::inferType()`. * **(important)** There is a small performance penalty when using `WeightedDefuzzifier::type = Automatic` because `WeightedDefuzzifier::inferType()` performs three `dynamic_cast<>`. -* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows to be overriden +* **(important)** Deleted class `Tsukamoto`. Its method `static tsukamoto()` was moved to `virtual WeightedDefuzzifier::tsukamoto()`, which allows overriding it * Added support for `Tsukamoto` with `Concave` terms. + **(EXTREMELY important)** In version 5.0, the traditional operation of Takagi-Sugeno and Tsukamoto controllers is achieved by setting `OutputVariable::accumulation = none`. Unlike version 4.0, the `RuleBlock::activation` will not have any effect on Takagi-Sugeno nor Tsukamoto controllers, for which `RuleBlock::activation` should also be set to `none`. More information about the roles of the `OutputVariable::accumulation` and `RuleBlock::activation` operators are detailed as follows. Refer to [sciweavers](http://www.sciweavers.org/free-online-latex-equation-editor) to convert LaTeX equations. + **(VERY important)** In version 5.0, the role of the `RuleBlock::activation` `TNorm` on the `Weighted[Average|Sum]` always performs a regular multiplication of the weights and the values (i.e., $w_i \times z_j$) regardless of the `TNorm` chosen. In other words, selecting any `RuleBlock::activation` for `Weighted[Average|Sum]` is irrelevant, and should be set to `none` as every `TNorm` will have the same multiplication effect. This operation is different from `fuzzylite` version 4.0, where the `RuleBlock::activation` operator was utilized to multiply the weights and values (i.e. $w_i \otimes z_j$), and therefore the traditional operation of the `Weighted[Average|Sum]` was achieved when `RuleBlock::activation = AlgebraicProduct;`. diff --git a/AI/FuzzyLite/fuzzylite/CMakeLists.txt b/AI/FuzzyLite/fuzzylite/CMakeLists.txt index 1fab7c069..bb605af3e 100644 --- a/AI/FuzzyLite/fuzzylite/CMakeLists.txt +++ b/AI/FuzzyLite/fuzzylite/CMakeLists.txt @@ -1,20 +1,32 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8.8) project(fuzzylite CXX) -set(CMAKE_VERBOSE_MAKEFILE false) +###DEFINES SECTION +if(NOT CMAKE_VERBOSE_MAKEFILE) + set(CMAKE_VERBOSE_MAKEFILE false) +endif() set(FL_VERSION 5.0) add_definitions(-DFL_VERSION="${FL_VERSION}") set(FL_DATE "1408") add_definitions(-DFL_DATE="${FL_DATE}") - add_definitions(-DFL_BUILD_PATH="${CMAKE_SOURCE_DIR}") #used to determine FL__FILE__ +option(FL_BUILD_SHARED "Build shared library" ON) +option(FL_BUILD_STATIC "Build static library" ON) +if(FL_BUILD_SHARED) + option(FL_BUILD_BINARY "Build fuzzylite binary" ON) +endif() + option(FL_USE_FLOAT "Use fl::scalar as float" OFF) option(FL_BACKTRACE "Provide backtrace information in case of errors" OFF) -option(FL_CPP11 "Builds utilizing C++11, i.e., passing -std=c++11" ON) +option(FL_CPP11 "Builds utilizing C++11, i.e., passing -std=c++11" OFF) + +if(FL_CPP11 AND MSVC) + message("Warning: MSVC not compatible with FL_CPP11 flag") +endif() if(FL_USE_FLOAT) add_definitions(-DFL_USE_FLOAT) @@ -26,9 +38,9 @@ endif() if(FL_CPP11) add_definitions(-DFL_CPP11) - if(UNIX) + if(NOT MSVC) add_definitions(-std=c++11) - endif(UNIX) + endif(NOT MSVC) endif(FL_CPP11) @@ -36,29 +48,26 @@ if(WIN32) message("Windows") add_definitions(-DFL_WINDOWS) endif() - if (UNIX) message("Unix") add_definitions(-DFL_UNIX) endif() - if (APPLE) message("Apple") add_definitions(-DFL_APPLE) endif() - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin) -if(UNIX) - set(CMAKE_CXX_FLAGS "-pedantic -Werror -Wall -Wextra") +if(NOT MSVC) + set(CMAKE_CXX_FLAGS "-pedantic -Werror -Wall -Wextra ${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") if(NOT APPLE) - set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined") #To avoid undefined methods in library + set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined ${CMAKE_SHARED_LINKER_FLAGS}") #To avoid undefined methods in library endif() endif() @@ -68,7 +77,17 @@ endif() set(FL_LIBS) -if(WIN32) +#link with rt lib on Linux. Fixes problem with clock_gettime() +include(CheckLibraryExists) +if(UNIX AND NOT APPLE) + ENABLE_LANGUAGE(C) + CHECK_LIBRARY_EXISTS(rt shm_open "" HAVE_RT_LIB) + if(HAVE_RT_LIB) + set(FL_LIBS ${FL_LIBS} rt) + endif() +endif() + +if(MSVC) set(CMAKE_CXX_FLAGS "/WX /W4 /EHsc") #Wx: Treat warnings as errors. W4: All warnings #http://msdn.microsoft.com/en-us/library/thxezb7y.aspx @@ -85,9 +104,13 @@ if(WIN32) endif() endif() +###BUILD SECTION include_directories(.) -cmake_policy(SET CMP0015 OLD) link_directories(.) +cmake_policy(SET CMP0015 OLD) +if (APPLE) + cmake_policy(SET CMP0042 NEW) +endif() file(STRINGS FL_HEADERS fl-headers) file(STRINGS FL_SOURCES fl-sources) @@ -96,51 +119,94 @@ string(REGEX REPLACE "\n" " " ${fl-headers} ${fl-headers}) string(REGEX REPLACE "\n" " " ${fl-sources} ${fl-sources}) message("${exepath}") - - set(CMAKE_DEBUG_POSTFIX d) -INCLUDE(CheckLibraryExists) +if (MSVC OR CMAKE_GENERATOR STREQUAL Xcode) + if(FL_BUILD_SHARED) + add_library(fl-shared SHARED ${fl-headers} ${fl-sources}) + endif() -#check if some platform-specific libraries are needed for linking -if(NOT WIN32) - CHECK_LIBRARY_EXISTS(rt shm_open "" HAVE_RT_LIB) - if(HAVE_RT_LIB) - set(SYSTEM_LIBS ${SYSTEM_LIBS} rt) - endif() + if(FL_BUILD_STATIC) + add_library(fl-static STATIC ${fl-headers} ${fl-sources}) + endif() +else() + if(FL_BUILD_SHARED OR FL_BUILD_STATIC) + add_library(fl-obj OBJECT ${fl-headers} ${fl-sources}) + if(NOT MINGW) + set_target_properties(fl-obj PROPERTIES COMPILE_FLAGS "-fPIC") + endif() + endif() + + if(FL_BUILD_SHARED) + add_library(fl-shared SHARED $) + endif(FL_BUILD_SHARED) + + if(FL_BUILD_STATIC) + add_library(fl-static STATIC $) + endif(FL_BUILD_STATIC) endif() -add_library(fl-shared SHARED ${fl-headers} ${fl-sources}) -set_target_properties(fl-shared PROPERTIES OUTPUT_NAME fuzzylite) -set_target_properties(fl-shared PROPERTIES DEBUG_POSTFIX d) -set_target_properties(fl-shared PROPERTIES COMPILE_DEFINITIONS "FL_EXPORT_LIBRARY") -if (UNIX) -set_target_properties(fl-shared PROPERTIES COMPILE_FLAGS "-fPIC") +if(FL_BUILD_SHARED) + set_target_properties(fl-shared PROPERTIES OUTPUT_NAME fuzzylite) + set_target_properties(fl-shared PROPERTIES DEBUG_POSTFIX d) + set_target_properties(fl-shared PROPERTIES COMPILE_DEFINITIONS "FL_EXPORT_LIBRARY") + set_target_properties(fl-shared PROPERTIES VERSION 5.0) + target_link_libraries(fl-shared ${FL_LIBS}) endif() -target_link_libraries(fl-shared ${FL_LIBS} ${SYSTEM_LIBS}) -add_library(fl-static STATIC ${fl-headers} ${fl-sources}) -set_target_properties(fl-static PROPERTIES OUTPUT_NAME fuzzylite-static) -set_target_properties(fl-static PROPERTIES DEBUG_POSTFIX d) -if (UNIX) -set_target_properties(fl-static PROPERTIES COMPILE_FLAGS "-fPIC") +if(FL_BUILD_STATIC) + set_target_properties(fl-static PROPERTIES OUTPUT_NAME fuzzylite-static) + set_target_properties(fl-static PROPERTIES DEBUG_POSTFIX d) + set_target_properties(fl-static PROPERTIES VERSION 5.0) + target_link_libraries(fl-static ${FL_LIBS}) endif() -target_link_libraries(fl-static ${FL_LIBS} ${SYSTEM_LIBS}) -add_executable(fl-bin src/main.cpp) -set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite) -set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite IMPORT_PREFIX tmp-) #To prevent LNK1149 in Windows -set_target_properties(fl-bin PROPERTIES DEBUG_POSTFIX d) -#set_target_properties(fl-bin PROPERTIES COMPILE_DEFINITIONS "FL_IMPORT_LIBRARY") -#target_link_libraries(fl-bin fl-shared ${FL_LIBS}) -target_link_libraries(fl-bin fl-static ${FL_LIBS} ${SYSTEM_LIBS}) +if(FL_BUILD_BINARY) + add_executable(fl-bin src/main.cpp) + set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite) + set_target_properties(fl-bin PROPERTIES OUTPUT_NAME fuzzylite IMPORT_PREFIX tmp-) #To prevent LNK1149 in Windows + set_target_properties(fl-bin PROPERTIES DEBUG_POSTFIX d) + set_target_properties(fl-bin PROPERTIES COMPILE_DEFINITIONS "FL_IMPORT_LIBRARY") + target_link_libraries(fl-bin fl-shared ${FL_LIBS}) +endif(FL_BUILD_BINARY) -install(TARGETS fl-bin fl-shared fl-static - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - ) +###INSTALL SECTION +if(NOT FL_INSTALL_BINDIR) + set(FL_INSTALL_BINDIR bin) +endif() + +if(NOT FL_INSTALL_LIBDIR) + if(NOT CMAKE_INSTALL_LIBDIR) + set(FL_INSTALL_LIBDIR lib) + else() + set(FL_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}) + endif() +endif() + +if(FL_BUILD_BINARY) + install(TARGETS fl-bin + RUNTIME DESTINATION ${FL_INSTALL_BINDIR} + LIBRARY DESTINATION ${FL_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR} + ) +endif() + +if(FL_BUILD_SHARED) + install(TARGETS fl-shared + RUNTIME DESTINATION ${FL_INSTALL_BINDIR} + LIBRARY DESTINATION ${FL_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR} + ) +endif() + +if(FL_BUILD_STATIC) + install(TARGETS fl-static + RUNTIME DESTINATION ${FL_INSTALL_BINDIR} + LIBRARY DESTINATION ${FL_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${FL_INSTALL_LIBDIR} + ) +endif() install(DIRECTORY fl/ DESTINATION include/fl) @@ -149,10 +215,12 @@ message("fuzzylite v.${FL_VERSION}b${FL_DATE}\n") message("FL_USE_FLOAT=${FL_USE_FLOAT}") message("FL_BACKTRACE=${FL_BACKTRACE}") message("FL_CPP11=${FL_CPP11}") +message("FL_INSTALL_BINDIR=${FL_INSTALL_BINDIR}") +message("FL_INSTALL_LIBDIR=${FL_INSTALL_LIBDIR}") message("Build=${CMAKE_BUILD_TYPE}") message("=====================================\n") -# uninstall target +###UNINSTALL SECTION #configure_file( #"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" #"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" @@ -162,4 +230,4 @@ message("=====================================\n") #COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake) #unix uninstall -#xargs rm < install_manifest.txt \ No newline at end of file +#xargs rm < install_manifest.txt diff --git a/AI/FuzzyLite/fuzzylite/fl/fuzzylite.h b/AI/FuzzyLite/fuzzylite/fl/fuzzylite.h index 7237589e6..b6ec50dea 100644 --- a/AI/FuzzyLite/fuzzylite/fl/fuzzylite.h +++ b/AI/FuzzyLite/fuzzylite/fl/fuzzylite.h @@ -25,12 +25,12 @@ #ifndef FL_FUZZYLITE_H #define FL_FUZZYLITE_H +#include #include #include #include #include #include -#include #ifndef FL_VERSION #define FL_VERSION "?" @@ -73,7 +73,9 @@ //TODO: Address warning 4251 by exporting members? //http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html +#ifdef _MSC_VER #pragma warning (disable:4251) +#endif //fuzzylite as a shared library is exported //Applications linking with fuzzylite as a shared library need to import diff --git a/AI/FuzzyLite/fuzzylite/fl/term/Accumulated.h b/AI/FuzzyLite/fuzzylite/fl/term/Accumulated.h index 83d0c657f..9d9db2101 100644 --- a/AI/FuzzyLite/fuzzylite/fl/term/Accumulated.h +++ b/AI/FuzzyLite/fuzzylite/fl/term/Accumulated.h @@ -44,8 +44,8 @@ namespace fl { FL_unique_ptr _accumulation; public: Accumulated(const std::string& name = "", - scalar minimum = -fl::inf, - scalar maximum = fl::inf, + scalar minimum = fl::nan, + scalar maximum = fl::nan, SNorm* accumulation = fl::null); Accumulated(const Accumulated& other); Accumulated& operator=(const Accumulated& other); diff --git a/AI/FuzzyLite/fuzzylite/src/rule/Antecedent.cpp b/AI/FuzzyLite/fuzzylite/src/rule/Antecedent.cpp index f5ed132c9..e1c918b96 100644 --- a/AI/FuzzyLite/fuzzylite/src/rule/Antecedent.cpp +++ b/AI/FuzzyLite/fuzzylite/src/rule/Antecedent.cpp @@ -69,6 +69,10 @@ namespace fl { return this->_expression != fl::null; } + scalar Antecedent::activationDegree(const TNorm* conjunction, const SNorm* disjunction) const { + return this->activationDegree(conjunction, disjunction, this->_expression); + } + scalar Antecedent::activationDegree(const TNorm* conjunction, const SNorm* disjunction, const Expression* node) const { if (not isLoaded()) { @@ -131,10 +135,6 @@ namespace fl { } - scalar Antecedent::activationDegree(const TNorm* conjunction, const SNorm* disjunction) const { - return this->activationDegree(conjunction, disjunction, this->_expression); - } - void Antecedent::unload() { if (_expression) { delete _expression; diff --git a/AI/FuzzyLite/fuzzylite/src/term/Discrete.cpp b/AI/FuzzyLite/fuzzylite/src/term/Discrete.cpp index 20760bfc9..212ada21e 100644 --- a/AI/FuzzyLite/fuzzylite/src/term/Discrete.cpp +++ b/AI/FuzzyLite/fuzzylite/src/term/Discrete.cpp @@ -157,7 +157,7 @@ namespace fl { throw fl::Exception(os.str(), FL_AT); } - std::vector > result((xy.size() + 1) / 2); + std::vector result((xy.size() + 1) / 2); for (std::size_t i = 0; i + 1 < xy.size(); i += 2) { result.at(i / 2).first = xy.at(i); result.at(i / 2).second = xy.at(i + 1); @@ -167,7 +167,7 @@ namespace fl { std::vector Discrete::toPairs(const std::vector& xy, scalar missingValue) FL_INOEXCEPT { - std::vector > result((xy.size() + 1) / 2); + std::vector result((xy.size() + 1) / 2); for (std::size_t i = 0; i + 1 < xy.size(); i += 2) { result.at(i / 2).first = xy.at(i); result.at(i / 2).second = xy.at(i + 1); diff --git a/AI/FuzzyLite/fuzzylite/src/term/Function.cpp b/AI/FuzzyLite/fuzzylite/src/term/Function.cpp index eb56ccf1a..b2de7ae7b 100644 --- a/AI/FuzzyLite/fuzzylite/src/term/Function.cpp +++ b/AI/FuzzyLite/fuzzylite/src/term/Function.cpp @@ -575,8 +575,8 @@ namespace fl { //y x * sin 2 ^ x / - text = "(Temperature is High and Oxigen is Low) or " - "(Temperature is Low and (Oxigen is Low or Oxigen is High))"; + text = "(Temperature is High and Oxygen is Low) or " + "(Temperature is Low and (Oxygen is Low or Oxygen is High))"; FL_LOG(f.toPostfix(text)); f.variables["pi"] = 3.14;