From 468de2ec9eb1a972bfd0d5934b2daa7d69f810ea Mon Sep 17 00:00:00 2001 From: Regis128 Date: Tue, 10 Apr 2018 23:39:45 +0200 Subject: [PATCH 1/2] Creates ClassifierFactory for easier classifier creation --- appveyor.yml | 2 +- .../ClassifierFactoryTest.cpp | 58 +++++++++++++++++++ .../Spectre.libGaClassifier.Tests.vcxproj | 1 + ...ctre.libGaClassifier.Tests.vcxproj.filters | 3 + .../ClassifierFactory.cpp | 58 +++++++++++++++++++ .../ClassifierFactory.h | 58 +++++++++++++++++++ .../Spectre.libGaClassifier.vcxproj | 4 ++ .../Spectre.libGaClassifier.vcxproj.filters | 6 ++ 8 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 src/Spectre.libGaClassifier.Tests/ClassifierFactoryTest.cpp create mode 100644 src/Spectre.libGaClassifier/ClassifierFactory.cpp create mode 100644 src/Spectre.libGaClassifier/ClassifierFactory.h diff --git a/appveyor.yml b/appveyor.yml index c41bdf48..bc959101 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ environment: configuration: - Debug - Release -version: 4.2.0.{build} +version: 4.3.0.{build} init: - cmd: echo Project - %APPVEYOR_PROJECT_NAME% diff --git a/src/Spectre.libGaClassifier.Tests/ClassifierFactoryTest.cpp b/src/Spectre.libGaClassifier.Tests/ClassifierFactoryTest.cpp new file mode 100644 index 00000000..92500346 --- /dev/null +++ b/src/Spectre.libGaClassifier.Tests/ClassifierFactoryTest.cpp @@ -0,0 +1,58 @@ +/* +* ClassifierFactoryTest.cpp +* The factory for creating classifiers +* +Copyright 2018 Spectre Team + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "Spectre.libGenetic/DataTypes.h" +#include +#include "Spectre.libGaClassifier/ClassifierFactory.h" + +namespace spectre::supervised +{ +const std::string CLASSIFIER = "svm"; +const double TRAINING_SET_SPLIT_RATE = 0.7; +const double MUTATION_RATE = 0.5; +const double BIT_SWAP_RATE = 0.5; +const double PRESERVATION_RATE = 0.5; +const unsigned int GENERATIONS_NUMBER = 5u; +const unsigned int POPULATION_SIZE = 5u; +const unsigned int INITIAL_FILLUP = 3u; +const algorithm::genetic::Seed SEED = 1; + +TEST(ClassifierFactoryInitialization, initializes) +{ + EXPECT_NO_THROW(ClassifierFactory{}); +} + +class ClassifierFactoryTest : public ::testing::Test +{ +protected: + ClassifierFactory classifierFactory{}; +}; + +TEST_F(ClassifierFactoryTest, build_svm_no_throw) +{ + EXPECT_NO_THROW(classifierFactory.buildSvm()); +} + +TEST_F(ClassifierFactoryTest, build_gaclassifier_with_svm_no_throw) +{ + EXPECT_NO_THROW(classifierFactory.buildGaClassifier(CLASSIFIER, TRAINING_SET_SPLIT_RATE, MUTATION_RATE, BIT_SWAP_RATE, + PRESERVATION_RATE, GENERATIONS_NUMBER, POPULATION_SIZE, INITIAL_FILLUP)); +} + +} diff --git a/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj b/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj index 618bb587..e5032f19 100644 --- a/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj +++ b/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj @@ -161,6 +161,7 @@ + diff --git a/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj.filters b/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj.filters index 67dfdb47..5c3e40de 100644 --- a/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj.filters +++ b/src/Spectre.libGaClassifier.Tests/Spectre.libGaClassifier.Tests.vcxproj.filters @@ -42,6 +42,9 @@ Source Files + + Source Files + diff --git a/src/Spectre.libGaClassifier/ClassifierFactory.cpp b/src/Spectre.libGaClassifier/ClassifierFactory.cpp new file mode 100644 index 00000000..f4e85de0 --- /dev/null +++ b/src/Spectre.libGaClassifier/ClassifierFactory.cpp @@ -0,0 +1,58 @@ +/* +* ClassifierFactory.cpp +* The factory for creating classifiers +* +Copyright 2018 Spectre Team + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "ClassifierFactory.h" +#include "Spectre.libClassifier/Svm.h" + +namespace spectre::supervised +{ +ClassifierFactory::ClassifierFactory() {} + +Svm ClassifierFactory::buildSvm(unsigned iterationsLimit, double tolerance) const +{ + Svm svm(iterationsLimit, tolerance); + return svm; +} + +GaClassifier ClassifierFactory::buildGaClassifier( + std::string name, + double trainingSetSplitRate, + double mutationRate, + double bitSwapRate, + double preservationRate, + unsigned generationsNumber, + unsigned populationSize, + unsigned initialFillup, + spectre::algorithm::genetic::Seed seed, + size_t minimalFillup, + size_t maximalFillup, + unsigned int iterationsLimit, + double tolerance) const +{ + std::unique_ptr classifier; + if (name == "svm") + { + Svm svm = this->buildSvm(iterationsLimit, tolerance); + classifier = std::make_unique(svm); + } + GaClassifier gaClassifier(std::move(classifier), trainingSetSplitRate, mutationRate, bitSwapRate, preservationRate, generationsNumber, + populationSize, initialFillup, seed, minimalFillup, maximalFillup); + return gaClassifier; +} +} \ No newline at end of file diff --git a/src/Spectre.libGaClassifier/ClassifierFactory.h b/src/Spectre.libGaClassifier/ClassifierFactory.h new file mode 100644 index 00000000..8b4ac487 --- /dev/null +++ b/src/Spectre.libGaClassifier/ClassifierFactory.h @@ -0,0 +1,58 @@ +/* +* ClassifierFactory.h +* The factory for creating classifiers +* +Copyright 2018 Spectre Team + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#pragma once +#include "Spectre.libClassifier/Svm.h" +#include "Spectre.libGenetic/DataTypes.h" +#include "GaClassifier.h" + +namespace spectre::supervised +{ +/// +/// The factory for creating classifiers +/// +class ClassifierFactory +{ +public: + /// + /// Initializes a new instance of the class. + /// + ClassifierFactory(); + /// + /// Gets svm classifier + /// + Svm buildSvm(unsigned int iterationsLimit = 100, double tolerance = 1e-6) const; + /// + /// Gets GaClassifier + /// + GaClassifier buildGaClassifier(std::string name, + double trainingSetSplitRate, + double mutationRate, + double bitSwapRate, + double preservationRate, + unsigned int generationsNumber, + unsigned int populationSize, + unsigned int initialFillup, + spectre::algorithm::genetic::Seed seed = 0, + size_t minimalFillup = 1ul, + size_t maximalFillup = std::numeric_limits::max(), + unsigned int iterationsLimit = 100, + double tolerance = 1e-6) const; +}; +} diff --git a/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj b/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj index 6cd1dc55..8171ccec 100644 --- a/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj +++ b/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj @@ -144,6 +144,9 @@ Header Files + + Header Files + Header Files @@ -156,6 +159,7 @@ + diff --git a/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj.filters b/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj.filters index 2f24cd2e..b5f50604 100644 --- a/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj.filters +++ b/src/Spectre.libGaClassifier/Spectre.libGaClassifier.vcxproj.filters @@ -42,6 +42,9 @@ Header Files + + Header Files + @@ -59,5 +62,8 @@ Source Files + + Source Files + \ No newline at end of file From e17be7947bf52d3d992569f729a972b407df24e3 Mon Sep 17 00:00:00 2001 From: Regis128 Date: Sat, 14 Apr 2018 17:07:22 +0200 Subject: [PATCH 2/2] updated version --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index e31c27df..a72bc274 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ environment: configuration: - Debug - Release -version: 4.4.0.{build} +version: 4.5.0.{build} init: - cmd: echo Project - %APPVEYOR_PROJECT_NAME%