diff --git a/.github/workflows/unit_tests_linux.yml b/.github/workflows/unit_tests_clang_linux.yml similarity index 60% rename from .github/workflows/unit_tests_linux.yml rename to .github/workflows/unit_tests_clang_linux.yml index 4cb4ed2d..e9e4697b 100644 --- a/.github/workflows/unit_tests_linux.yml +++ b/.github/workflows/unit_tests_clang_linux.yml @@ -1,24 +1,19 @@ -name: Unit tests Linux +name: Unit tests Clang Linux on: [push] jobs: unit-tests: name: Build and run - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - name: Set up GCC - uses: egor-tensin/setup-gcc@v1.3 - with: - version: 13 - platform: x64 - name: Checkout the project uses: actions/checkout@v2 - name: CMake run: | cd ./build - CXX=/usr/bin/g++-13 cmake -G"Unix Makefiles" ./.. -DCMAKE_BUILD_TYPE=Release + CC=/usr/bin/clang-18 CXX=/usr/bin/clang++-18 cmake -G"Unix Makefiles" ./.. -DCMAKE_BUILD_TYPE=Release - name: Make run: | cd ./build diff --git a/.github/workflows/unit_tests_gcc_linux.yml b/.github/workflows/unit_tests_gcc_linux.yml new file mode 100644 index 00000000..0365fcc4 --- /dev/null +++ b/.github/workflows/unit_tests_gcc_linux.yml @@ -0,0 +1,24 @@ +name: Unit tests GCC Linux + +on: [push] + +jobs: + unit-tests: + name: Build and run + runs-on: ubuntu-24.04 + + steps: + - name: Checkout the project + uses: actions/checkout@v2 + - name: CMake + run: | + cd ./build + CC=/usr/bin/gcc-14 CXX=/usr/bin/g++-14 cmake -G"Unix Makefiles" ./.. -DCMAKE_BUILD_TYPE=Release + - name: Make + run: | + cd ./build + make + - name: Execute unit tests + run: | + cd ./build + ./tests/unit_tests/UnitTests --gtest_also_run_disabled_tests \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index d4d422c6..2efd4de9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ if(MSVC) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc143-mt-sgd-x64-1_80.lib") else() set(CMAKE_CXX_FLAGS_DEBUG "-g") - set(CMAKE_CXX_FLAGS_RELEASE "-Ofast") + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math") endif() add_subdirectory(src) @@ -63,5 +63,5 @@ if(MSVC) remove_target_compile_options(DatasetTests /W3) else() target_compile_options(StraightforwardNeuralNetwork PUBLIC -fopenmp -Wall -Wextra -pedantic -Werror -Wno-unused-parameter) - target_compile_options(Boost PRIVATE -w) + target_compile_options(Boost INTERFACE -w) endif() \ No newline at end of file diff --git a/src/data/Data.cpp b/src/data/Data.cpp index 9248c9a5..599fb0e4 100644 --- a/src/data/Data.cpp +++ b/src/data/Data.cpp @@ -268,26 +268,6 @@ void Data::unshuffle() int Data::isValid() { - for (auto& input : this->sets[training].inputs) - { - for (auto& value : input) - { - if (isnan(value)) - { - return 401; - } - } - } - for (auto& input : this->sets[testing].inputs) - { - for (auto& value : input) - { - if (isnan(value)) - { - return 401; - } - } - } if (!this->sets[testing].shuffledIndexes.empty() && this->sets[training].size != (int)this->sets[training].shuffledIndexes.size()) return 403; diff --git a/src/neural_network/NeuralNetwork.cpp b/src/neural_network/NeuralNetwork.cpp index 7bff81c0..43d8e71d 100644 --- a/src/neural_network/NeuralNetwork.cpp +++ b/src/neural_network/NeuralNetwork.cpp @@ -102,10 +102,7 @@ vector NeuralNetwork::calculateError(const vector& outputs, const vector errors(this->layers.back()->getNumberOfNeurons(), 0); for (size_t n = 0; n < errors.size(); ++n) { - if (isnan(desired[n])) - errors[n] = 0; - else - errors[n] = 2 * (desired[n] - outputs[n]); + errors[n] = 2 * (desired[n] - outputs[n]); } return errors; } diff --git a/src/neural_network/layer/Layer.tpp b/src/neural_network/layer/Layer.tpp index 26030727..80982977 100644 --- a/src/neural_network/layer/Layer.tpp +++ b/src/neural_network/layer/Layer.tpp @@ -85,7 +85,7 @@ float Layer::getAverageOfAbsNeuronWeights() const auto sum = 0.0f; for (auto& n : this->neurons) for (auto w : n.getWeights()) - sum += abs(w); + sum += std::abs(w); sum /= static_cast(this->neurons.size()); return sum; } diff --git a/src/neural_network/layer/MaxPooling1D.hpp b/src/neural_network/layer/MaxPooling1D.hpp index 48b1ce7b..dc0bfe4a 100644 --- a/src/neural_network/layer/MaxPooling1D.hpp +++ b/src/neural_network/layer/MaxPooling1D.hpp @@ -19,7 +19,7 @@ namespace snn::internal [[nodiscard]] std::vector computeBackOutput(std::vector& inputErrors) override; [[nodiscard]] std::vector computeOutput(const std::vector& inputs, bool temporalReset) override; - void computeTrain(std::vector & [[maybe_unused]] inputErrors) override {} + void computeTrain([[maybe_unused]] std::vector & inputErrors) override {} void buildKernelIndexes() override; public: diff --git a/src/neural_network/layer/MaxPooling2D.hpp b/src/neural_network/layer/MaxPooling2D.hpp index 2c362412..bd95447a 100644 --- a/src/neural_network/layer/MaxPooling2D.hpp +++ b/src/neural_network/layer/MaxPooling2D.hpp @@ -19,7 +19,7 @@ namespace snn::internal [[nodiscard]] std::vector computeBackOutput(std::vector& inputErrors) override; [[nodiscard]] std::vector computeOutput(const std::vector& inputs, bool temporalReset) override; - void computeTrain(std::vector& [[maybe_unused]] inputErrors) override {} + void computeTrain([[maybe_unused]] std::vector& inputErrors) override {} void buildKernelIndexes() override; public: diff --git a/tests/unit_tests/IdentityTests.cpp b/tests/unit_tests/IdentityTests.cpp index 542d0d3e..6d4d57d0 100644 --- a/tests/unit_tests/IdentityTests.cpp +++ b/tests/unit_tests/IdentityTests.cpp @@ -12,7 +12,7 @@ TEST(Identity, WorksWithSmallNumbers) Data data(problem::regression, inputData, expectedOutputs); - StraightforwardNeuralNetwork neuralNetwork({Input(1), FullyConnected(4), FullyConnected(1, snn::activation::identity)}, + StraightforwardNeuralNetwork neuralNetwork({Input(1), FullyConnected(6), FullyConnected(1, snn::activation::identity)}, StochasticGradientDescent(0.02f, 0.99f)); neuralNetwork.train(data, 0.01_mae || 2_s);