From 189d605bfa6e07951f8ed3c4c411c90c97bea79e Mon Sep 17 00:00:00 2001 From: Michelle Date: Thu, 25 Jun 2026 19:43:07 +0200 Subject: [PATCH] Dense Layer, Add added the dense layer with a forward functions. I also made the add functions for most cases. --- build/CMakeFiles/CMakeConfigureLog.yaml | 180 +++--- build/CMakeFiles/Makefile2 | 4 +- build/CMakeFiles/VerifyGlobs.cmake | 3 + build/CMakeFiles/panic.dir/DependInfo.cmake | 3 + build/CMakeFiles/panic.dir/build.make | 54 +- build/CMakeFiles/panic.dir/cmake_clean.cmake | 6 + build/CMakeFiles/panic.dir/link.txt | 2 +- build/CMakeFiles/panic.dir/progress.make | 3 + build/CMakeFiles/progress.marks | 2 +- build/Makefile | 81 +++ build/panic | Bin 51400 -> 79776 bytes include/config/constants.hpp | 18 +- include/config/types.hpp | 9 +- include/math/add.hpp | 364 ++++++++++++ include/math/matmul.hpp | 107 ++++ include/neural_network/layer/layer.hpp | 91 +-- include/neural_network/layer/layer_dense.hpp | 110 ++-- include/tensor/matrix.hpp | 32 +- include/tensor/vector.hpp | 30 +- main.cpp | 20 +- src/io/print_tensor.cpp | 21 +- src/math/add.cpp | 563 +++++++++++++++++++ src/math/matmul.cpp | 169 ++++++ src/neural_network/layer/layer.cpp | 329 ----------- src/neural_network/layer/layer_dense.cpp | 276 ++------- src/tensor/matrix.cpp | 42 +- src/tensor/vector.cpp | 40 +- 27 files changed, 1657 insertions(+), 902 deletions(-) create mode 100644 include/math/add.hpp create mode 100644 include/math/matmul.hpp create mode 100644 src/math/add.cpp create mode 100644 src/math/matmul.cpp delete mode 100644 src/neural_network/layer/layer.cpp diff --git a/build/CMakeFiles/CMakeConfigureLog.yaml b/build/CMakeFiles/CMakeConfigureLog.yaml index 33ad86b..4befd69 100644 --- a/build/CMakeFiles/CMakeConfigureLog.yaml +++ b/build/CMakeFiles/CMakeConfigureLog.yaml @@ -39,8 +39,8 @@ events: checks: - "Detecting CXX compiler ABI info" directories: - source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl" - binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl" + source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp" + binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp" cmakeVariables: CMAKE_CXX_FLAGS: "" CMAKE_CXX_FLAGS_DEBUG: "-g" @@ -49,13 +49,13 @@ events: variable: "CMAKE_CXX_ABI_COMPILED" cached: true stdout: | - Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl' + Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp' - Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_41a54/fast - /usr/bin/gmake -f CMakeFiles/cmTC_41a54.dir/build.make CMakeFiles/cmTC_41a54.dir/build - gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl' - Building CXX object CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o - /usr/bin/c++ -v -o CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_d468c/fast + /usr/bin/gmake -f CMakeFiles/cmTC_d468c.dir/build.make CMakeFiles/cmTC_d468c.dir/build + gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp' + Building CXX object CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o + /usr/bin/c++ -v -o CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp Using built-in specs. COLLECT_GCC=/usr/bin/c++ OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa @@ -65,8 +65,8 @@ events: Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/' - /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_41a54.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc09Jdka.s + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_d468c.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccY1NaKY.s GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04.1) version 13.3.0 (x86_64-linux-gnu) compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP @@ -87,15 +87,15 @@ events: /usr/include End of search list. Compiler executable checksum: 7896445e4990772fdae9dc0659a99266 - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/' - as -v --64 -o CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc09Jdka.s + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/' + as -v --64 -o CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccY1NaKY.s GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.' - Linking CXX executable cmTC_41a54 - /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_41a54.dir/link.txt --verbose=1 - /usr/bin/c++ -v CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_41a54 + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.' + Linking CXX executable cmTC_d468c + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d468c.dir/link.txt --verbose=1 + /usr/bin/c++ -v CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_d468c Using built-in specs. COLLECT_GCC=/usr/bin/c++ COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper @@ -108,10 +108,10 @@ events: gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ - COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_41a54' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_41a54.' - /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccnZOIwX.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_41a54 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o - COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_41a54' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_41a54.' - gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl' + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_d468c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_d468c.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cchzdDG7.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_d468c /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_d468c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_d468c.' + gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp' exitCode: 0 - @@ -151,13 +151,13 @@ events: message: | Parsed CXX implicit link information: link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] - ignore line: [Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl'] + ignore line: [Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp'] ignore line: [] - ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_41a54/fast] - ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_41a54.dir/build.make CMakeFiles/cmTC_41a54.dir/build] - ignore line: [gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-iBVTGl'] - ignore line: [Building CXX object CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_d468c/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_d468c.dir/build.make CMakeFiles/cmTC_d468c.dir/build] + ignore line: [gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-xLaUGp'] + ignore line: [Building CXX object CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] @@ -167,8 +167,8 @@ events: ignore line: [Thread model: posix] ignore line: [Supported LTO compression algorithms: zlib zstd] ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/'] - ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_41a54.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cc09Jdka.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE /usr/share/cmake-3.28/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_d468c.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccY1NaKY.s] ignore line: [GNU C++17 (Ubuntu 13.3.0-6ubuntu2~24.04.1) version 13.3.0 (x86_64-linux-gnu)] ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] ignore line: [] @@ -189,15 +189,15 @@ events: ignore line: [ /usr/include] ignore line: [End of search list.] ignore line: [Compiler executable checksum: 7896445e4990772fdae9dc0659a99266] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o /tmp/cc09Jdka.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccY1NaKY.s] ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.'] - ignore line: [Linking CXX executable cmTC_41a54] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_41a54.dir/link.txt --verbose=1] - ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_41a54 ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [Linking CXX executable cmTC_d468c] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d468c.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_d468c ] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] @@ -210,13 +210,13 @@ events: ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) ] ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_41a54' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_41a54.'] - link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccnZOIwX.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_41a54 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_d468c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_d468c.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cchzdDG7.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_d468c /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o] arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore arg [-plugin] ==> ignore arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/ccnZOIwX.res] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cchzdDG7.res] ==> ignore arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore arg [-plugin-opt=-pass-through=-lgcc] ==> ignore arg [-plugin-opt=-pass-through=-lc] ==> ignore @@ -234,7 +234,7 @@ events: arg [-znow] ==> ignore arg [-zrelro] ==> ignore arg [-o] ==> ignore - arg [cmTC_41a54] ==> ignore + arg [cmTC_d468c] ==> ignore arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o] arg [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o] arg [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o] @@ -246,7 +246,7 @@ events: arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] - arg [CMakeFiles/cmTC_41a54.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [CMakeFiles/cmTC_d468c.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore arg [-lstdc++] ==> lib [stdc++] arg [-lm] ==> lib [m] arg [-lgcc_s] ==> lib [gcc_s] @@ -281,8 +281,8 @@ events: - "CMakeLists.txt:77 (find_package)" description: "Detecting CXX OpenMP compiler info" directories: - source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz" - binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz" + source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U" + binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U" cmakeVariables: CMAKE_CXX_FLAGS: "" CMAKE_CXX_FLAGS_DEBUG: "-g" @@ -291,13 +291,13 @@ events: variable: "OpenMP_COMPILE_RESULT_CXX_fopenmp" cached: true stdout: | - Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz' + Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U' - Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_0b68f/fast - /usr/bin/gmake -f CMakeFiles/cmTC_0b68f.dir/build.make CMakeFiles/cmTC_0b68f.dir/build - gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz' - Building CXX object CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o - /usr/bin/c++ -fopenmp -v -std=c++11 -o CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz/OpenMPTryFlag.cpp + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_ae9b9/fast + /usr/bin/gmake -f CMakeFiles/cmTC_ae9b9.dir/build.make CMakeFiles/cmTC_ae9b9.dir/build + gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U' + Building CXX object CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o + /usr/bin/c++ -fopenmp -v -std=c++11 -o CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U/OpenMPTryFlag.cpp Using built-in specs. COLLECT_GCC=/usr/bin/c++ OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa @@ -307,8 +307,8 @@ events: Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) - COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/' - /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE -D_REENTRANT /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz/OpenMPTryFlag.cpp -quiet -dumpdir CMakeFiles/cmTC_0b68f.dir/ -dumpbase OpenMPTryFlag.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -std=c++11 -version -fopenmp -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccCnQ37x.s + COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/' + /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE -D_REENTRANT /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U/OpenMPTryFlag.cpp -quiet -dumpdir CMakeFiles/cmTC_ae9b9.dir/ -dumpbase OpenMPTryFlag.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -std=c++11 -version -fopenmp -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cczgKSOd.s GNU C++11 (Ubuntu 13.3.0-6ubuntu2~24.04.1) version 13.3.0 (x86_64-linux-gnu) compiled by GNU C version 13.3.0, GMP version 6.3.0, MPFR version 4.2.1, MPC version 1.3.1, isl version isl-0.26-GMP @@ -329,15 +329,15 @@ events: /usr/include End of search list. Compiler executable checksum: 7896445e4990772fdae9dc0659a99266 - COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/' - as -v --64 -o CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o /tmp/ccCnQ37x.s + COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/' + as -v --64 -o CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o /tmp/cczgKSOd.s GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42 COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ - COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.' - Linking CXX executable cmTC_0b68f - /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0b68f.dir/link.txt --verbose=1 - /usr/bin/c++ -fopenmp -v CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -o cmTC_0b68f -v + COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.' + Linking CXX executable cmTC_ae9b9 + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ae9b9.dir/link.txt --verbose=1 + /usr/bin/c++ -fopenmp -v CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -o cmTC_ae9b9 -v Using built-in specs. COLLECT_GCC=/usr/bin/c++ COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper @@ -351,10 +351,10 @@ events: COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/ Reading specs from /usr/lib/gcc/x86_64-linux-gnu/13/libgomp.spec - COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_0b68f' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_0b68f.' - /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cc3uGT27.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0b68f /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o - COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_0b68f' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_0b68f.' - gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz' + COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_ae9b9' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_ae9b9.' + /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccTjC9Ya.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_ae9b9 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o + COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_ae9b9' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_ae9b9.' + gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U' exitCode: 0 - @@ -366,13 +366,13 @@ events: message: | Parsed CXX OpenMP implicit link information from above output: link line regex: [^( *|.*[/\\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] - ignore line: [Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz'] + ignore line: [Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U'] ignore line: [] - ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_0b68f/fast] - ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_0b68f.dir/build.make CMakeFiles/cmTC_0b68f.dir/build] - ignore line: [gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz'] - ignore line: [Building CXX object CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o] - ignore line: [/usr/bin/c++ -fopenmp -v -std=c++11 -o CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz/OpenMPTryFlag.cpp] + ignore line: [Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_ae9b9/fast] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTC_ae9b9.dir/build.make CMakeFiles/cmTC_ae9b9.dir/build] + ignore line: [gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U'] + ignore line: [Building CXX object CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o] + ignore line: [/usr/bin/c++ -fopenmp -v -std=c++11 -o CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U/OpenMPTryFlag.cpp] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa] @@ -382,8 +382,8 @@ events: ignore line: [Thread model: posix] ignore line: [Supported LTO compression algorithms: zlib zstd] ignore line: [gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) ] - ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/'] - ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE -D_REENTRANT /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-0Y8Dzz/OpenMPTryFlag.cpp -quiet -dumpdir CMakeFiles/cmTC_0b68f.dir/ -dumpbase OpenMPTryFlag.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -std=c++11 -version -fopenmp -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/ccCnQ37x.s] + ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/'] + ignore line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE -D_REENTRANT /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-a2mM1U/OpenMPTryFlag.cpp -quiet -dumpdir CMakeFiles/cmTC_ae9b9.dir/ -dumpbase OpenMPTryFlag.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -std=c++11 -version -fopenmp -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -fstack-clash-protection -fcf-protection -o /tmp/cczgKSOd.s] ignore line: [GNU C++11 (Ubuntu 13.3.0-6ubuntu2~24.04.1) version 13.3.0 (x86_64-linux-gnu)] ignore line: [ compiled by GNU C version 13.3.0 GMP version 6.3.0 MPFR version 4.2.1 MPC version 1.3.1 isl version isl-0.26-GMP] ignore line: [] @@ -404,15 +404,15 @@ events: ignore line: [ /usr/include] ignore line: [End of search list.] ignore line: [Compiler executable checksum: 7896445e4990772fdae9dc0659a99266] - ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o /tmp/ccCnQ37x.s] + ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o /tmp/cczgKSOd.s] ignore line: [GNU assembler version 2.42 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.42] ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.'] - ignore line: [Linking CXX executable cmTC_0b68f] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0b68f.dir/link.txt --verbose=1] - ignore line: [/usr/bin/c++ -fopenmp -v CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -o cmTC_0b68f -v ] + ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-std=c++11' '-o' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.'] + ignore line: [Linking CXX executable cmTC_ae9b9] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ae9b9.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -fopenmp -v CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -o cmTC_ae9b9 -v ] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] @@ -426,13 +426,13 @@ events: ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/13/:/usr/libexec/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/13/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/13/../../../:/lib/:/usr/lib/] ignore line: [Reading specs from /usr/lib/gcc/x86_64-linux-gnu/13/libgomp.spec] - ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_0b68f' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_0b68f.'] - link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/cc3uGT27.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_0b68f /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o] + ignore line: [COLLECT_GCC_OPTIONS='-fopenmp' '-v' '-o' 'cmTC_ae9b9' '-v' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-pthread' '-dumpdir' 'cmTC_ae9b9.'] + link line: [ /usr/libexec/gcc/x86_64-linux-gnu/13/collect2 -plugin /usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper -plugin-opt=-fresolution=/tmp/ccTjC9Ya.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_ae9b9 /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/13 -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/13/../../.. CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/13/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/13/crtoffloadend.o] arg [/usr/libexec/gcc/x86_64-linux-gnu/13/collect2] ==> ignore arg [-plugin] ==> ignore arg [/usr/libexec/gcc/x86_64-linux-gnu/13/liblto_plugin.so] ==> ignore arg [-plugin-opt=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/cc3uGT27.res] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccTjC9Ya.res] ==> ignore arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore arg [-plugin-opt=-pass-through=-lgcc] ==> ignore arg [-plugin-opt=-pass-through=-lpthread] ==> ignore @@ -451,7 +451,7 @@ events: arg [-znow] ==> ignore arg [-zrelro] ==> ignore arg [-o] ==> ignore - arg [cmTC_0b68f] ==> ignore + arg [cmTC_ae9b9] ==> ignore arg [-L/usr/lib/gcc/x86_64-linux-gnu/13] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13] arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../x86_64-linux-gnu] arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../../../lib] @@ -460,7 +460,7 @@ events: arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] arg [-L/usr/lib/gcc/x86_64-linux-gnu/13/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/13/../../..] - arg [CMakeFiles/cmTC_0b68f.dir/OpenMPTryFlag.cpp.o] ==> ignore + arg [CMakeFiles/cmTC_ae9b9.dir/OpenMPTryFlag.cpp.o] ==> ignore arg [-lstdc++] ==> lib [stdc++] arg [-lm] ==> lib [m] arg [-lgomp] ==> lib [gomp] @@ -492,8 +492,8 @@ events: - "CMakeLists.txt:77 (find_package)" description: "Detecting CXX OpenMP version" directories: - source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf" - binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf" + source: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp" + binary: "/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp" cmakeVariables: CMAKE_CXX_FLAGS: "" CMAKE_CXX_FLAGS_DEBUG: "-g" @@ -502,17 +502,17 @@ events: variable: "OpenMP_SPECTEST_CXX_" cached: true stdout: | - Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf' + Change Dir: '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp' - Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_71bac/fast - /usr/bin/gmake -f CMakeFiles/cmTC_71bac.dir/build.make CMakeFiles/cmTC_71bac.dir/build - gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf' - Building CXX object CMakeFiles/cmTC_71bac.dir/OpenMPCheckVersion.cpp.o - /usr/bin/c++ -fopenmp -std=c++11 -o CMakeFiles/cmTC_71bac.dir/OpenMPCheckVersion.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf/OpenMPCheckVersion.cpp - Linking CXX executable cmTC_71bac - /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_71bac.dir/link.txt --verbose=1 - /usr/bin/c++ -fopenmp CMakeFiles/cmTC_71bac.dir/OpenMPCheckVersion.cpp.o -o cmTC_71bac - gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-kDANSf' + Run Build Command(s): /usr/bin/cmake -E env VERBOSE=1 /usr/bin/gmake -f Makefile cmTC_74a23/fast + /usr/bin/gmake -f CMakeFiles/cmTC_74a23.dir/build.make CMakeFiles/cmTC_74a23.dir/build + gmake[1]: Entering directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp' + Building CXX object CMakeFiles/cmTC_74a23.dir/OpenMPCheckVersion.cpp.o + /usr/bin/c++ -fopenmp -std=c++11 -o CMakeFiles/cmTC_74a23.dir/OpenMPCheckVersion.cpp.o -c /home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp/OpenMPCheckVersion.cpp + Linking CXX executable cmTC_74a23 + /usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_74a23.dir/link.txt --verbose=1 + /usr/bin/c++ -fopenmp CMakeFiles/cmTC_74a23.dir/OpenMPCheckVersion.cpp.o -o cmTC_74a23 + gmake[1]: Leaving directory '/home/atlas/Documents/Git/panic/build/CMakeFiles/CMakeScratch/TryCompile-34MsZp' exitCode: 0 ... diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 index cfc2f49..1171316 100644 --- a/build/CMakeFiles/Makefile2 +++ b/build/CMakeFiles/Makefile2 @@ -81,12 +81,12 @@ clean: CMakeFiles/panic.dir/clean CMakeFiles/panic.dir/all: $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/depend $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=1,2,3,4,5 "Built target panic" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=1,2,3,4,5,6,7,8 "Built target panic" .PHONY : CMakeFiles/panic.dir/all # Build rule for subdir invocation for target. CMakeFiles/panic.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/atlas/Documents/Git/panic/build/CMakeFiles 5 + $(CMAKE_COMMAND) -E cmake_progress_start /home/atlas/Documents/Git/panic/build/CMakeFiles 8 $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 CMakeFiles/panic.dir/all $(CMAKE_COMMAND) -E cmake_progress_start /home/atlas/Documents/Git/panic/build/CMakeFiles 0 .PHONY : CMakeFiles/panic.dir/rule diff --git a/build/CMakeFiles/VerifyGlobs.cmake b/build/CMakeFiles/VerifyGlobs.cmake index bad0e68..201315c 100644 --- a/build/CMakeFiles/VerifyGlobs.cmake +++ b/build/CMakeFiles/VerifyGlobs.cmake @@ -6,6 +6,9 @@ cmake_policy(SET CMP0009 NEW) file(GLOB_RECURSE NEW_GLOB LIST_DIRECTORIES false "/home/atlas/Documents/Git/panic/src/*.cpp") set(OLD_GLOB "/home/atlas/Documents/Git/panic/src/io/print_tensor.cpp" + "/home/atlas/Documents/Git/panic/src/math/add.cpp" + "/home/atlas/Documents/Git/panic/src/math/matmul.cpp" + "/home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp" "/home/atlas/Documents/Git/panic/src/tensor/matrix.cpp" "/home/atlas/Documents/Git/panic/src/tensor/vector.cpp" ) diff --git a/build/CMakeFiles/panic.dir/DependInfo.cmake b/build/CMakeFiles/panic.dir/DependInfo.cmake index f2dd4af..7cdcc13 100644 --- a/build/CMakeFiles/panic.dir/DependInfo.cmake +++ b/build/CMakeFiles/panic.dir/DependInfo.cmake @@ -10,6 +10,9 @@ set(CMAKE_DEPENDS_LANGUAGES set(CMAKE_DEPENDS_DEPENDENCY_FILES "/home/atlas/Documents/Git/panic/main.cpp" "CMakeFiles/panic.dir/main.cpp.o" "gcc" "CMakeFiles/panic.dir/main.cpp.o.d" "/home/atlas/Documents/Git/panic/src/io/print_tensor.cpp" "CMakeFiles/panic.dir/src/io/print_tensor.cpp.o" "gcc" "CMakeFiles/panic.dir/src/io/print_tensor.cpp.o.d" + "/home/atlas/Documents/Git/panic/src/math/add.cpp" "CMakeFiles/panic.dir/src/math/add.cpp.o" "gcc" "CMakeFiles/panic.dir/src/math/add.cpp.o.d" + "/home/atlas/Documents/Git/panic/src/math/matmul.cpp" "CMakeFiles/panic.dir/src/math/matmul.cpp.o" "gcc" "CMakeFiles/panic.dir/src/math/matmul.cpp.o.d" + "/home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp" "CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o" "gcc" "CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o.d" "/home/atlas/Documents/Git/panic/src/tensor/matrix.cpp" "CMakeFiles/panic.dir/src/tensor/matrix.cpp.o" "gcc" "CMakeFiles/panic.dir/src/tensor/matrix.cpp.o.d" "/home/atlas/Documents/Git/panic/src/tensor/vector.cpp" "CMakeFiles/panic.dir/src/tensor/vector.cpp.o" "gcc" "CMakeFiles/panic.dir/src/tensor/vector.cpp.o.d" ) diff --git a/build/CMakeFiles/panic.dir/build.make b/build/CMakeFiles/panic.dir/build.make index 0a1d84f..80f6e23 100644 --- a/build/CMakeFiles/panic.dir/build.make +++ b/build/CMakeFiles/panic.dir/build.make @@ -97,10 +97,52 @@ CMakeFiles/panic.dir/src/io/print_tensor.cpp.s: cmake_force @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/panic.dir/src/io/print_tensor.cpp.s" /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/atlas/Documents/Git/panic/src/io/print_tensor.cpp -o CMakeFiles/panic.dir/src/io/print_tensor.cpp.s +CMakeFiles/panic.dir/src/math/add.cpp.o: CMakeFiles/panic.dir/flags.make +CMakeFiles/panic.dir/src/math/add.cpp.o: /home/atlas/Documents/Git/panic/src/math/add.cpp +CMakeFiles/panic.dir/src/math/add.cpp.o: CMakeFiles/panic.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/panic.dir/src/math/add.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/panic.dir/src/math/add.cpp.o -MF CMakeFiles/panic.dir/src/math/add.cpp.o.d -o CMakeFiles/panic.dir/src/math/add.cpp.o -c /home/atlas/Documents/Git/panic/src/math/add.cpp + +CMakeFiles/panic.dir/src/math/add.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/panic.dir/src/math/add.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/atlas/Documents/Git/panic/src/math/add.cpp > CMakeFiles/panic.dir/src/math/add.cpp.i + +CMakeFiles/panic.dir/src/math/add.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/panic.dir/src/math/add.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/atlas/Documents/Git/panic/src/math/add.cpp -o CMakeFiles/panic.dir/src/math/add.cpp.s + +CMakeFiles/panic.dir/src/math/matmul.cpp.o: CMakeFiles/panic.dir/flags.make +CMakeFiles/panic.dir/src/math/matmul.cpp.o: /home/atlas/Documents/Git/panic/src/math/matmul.cpp +CMakeFiles/panic.dir/src/math/matmul.cpp.o: CMakeFiles/panic.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/panic.dir/src/math/matmul.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/panic.dir/src/math/matmul.cpp.o -MF CMakeFiles/panic.dir/src/math/matmul.cpp.o.d -o CMakeFiles/panic.dir/src/math/matmul.cpp.o -c /home/atlas/Documents/Git/panic/src/math/matmul.cpp + +CMakeFiles/panic.dir/src/math/matmul.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/panic.dir/src/math/matmul.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/atlas/Documents/Git/panic/src/math/matmul.cpp > CMakeFiles/panic.dir/src/math/matmul.cpp.i + +CMakeFiles/panic.dir/src/math/matmul.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/panic.dir/src/math/matmul.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/atlas/Documents/Git/panic/src/math/matmul.cpp -o CMakeFiles/panic.dir/src/math/matmul.cpp.s + +CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o: CMakeFiles/panic.dir/flags.make +CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o: /home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp +CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o: CMakeFiles/panic.dir/compiler_depend.ts + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o -MF CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o.d -o CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o -c /home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp + +CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Preprocessing CXX source to CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.i" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp > CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.i + +CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green "Compiling CXX source to assembly CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.s" + /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/atlas/Documents/Git/panic/src/neural_network/layer/layer_dense.cpp -o CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.s + CMakeFiles/panic.dir/src/tensor/matrix.cpp.o: CMakeFiles/panic.dir/flags.make CMakeFiles/panic.dir/src/tensor/matrix.cpp.o: /home/atlas/Documents/Git/panic/src/tensor/matrix.cpp CMakeFiles/panic.dir/src/tensor/matrix.cpp.o: CMakeFiles/panic.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/panic.dir/src/tensor/matrix.cpp.o" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/panic.dir/src/tensor/matrix.cpp.o" /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/panic.dir/src/tensor/matrix.cpp.o -MF CMakeFiles/panic.dir/src/tensor/matrix.cpp.o.d -o CMakeFiles/panic.dir/src/tensor/matrix.cpp.o -c /home/atlas/Documents/Git/panic/src/tensor/matrix.cpp CMakeFiles/panic.dir/src/tensor/matrix.cpp.i: cmake_force @@ -114,7 +156,7 @@ CMakeFiles/panic.dir/src/tensor/matrix.cpp.s: cmake_force CMakeFiles/panic.dir/src/tensor/vector.cpp.o: CMakeFiles/panic.dir/flags.make CMakeFiles/panic.dir/src/tensor/vector.cpp.o: /home/atlas/Documents/Git/panic/src/tensor/vector.cpp CMakeFiles/panic.dir/src/tensor/vector.cpp.o: CMakeFiles/panic.dir/compiler_depend.ts - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/panic.dir/src/tensor/vector.cpp.o" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/panic.dir/src/tensor/vector.cpp.o" /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT CMakeFiles/panic.dir/src/tensor/vector.cpp.o -MF CMakeFiles/panic.dir/src/tensor/vector.cpp.o.d -o CMakeFiles/panic.dir/src/tensor/vector.cpp.o -c /home/atlas/Documents/Git/panic/src/tensor/vector.cpp CMakeFiles/panic.dir/src/tensor/vector.cpp.i: cmake_force @@ -129,6 +171,9 @@ CMakeFiles/panic.dir/src/tensor/vector.cpp.s: cmake_force panic_OBJECTS = \ "CMakeFiles/panic.dir/main.cpp.o" \ "CMakeFiles/panic.dir/src/io/print_tensor.cpp.o" \ +"CMakeFiles/panic.dir/src/math/add.cpp.o" \ +"CMakeFiles/panic.dir/src/math/matmul.cpp.o" \ +"CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o" \ "CMakeFiles/panic.dir/src/tensor/matrix.cpp.o" \ "CMakeFiles/panic.dir/src/tensor/vector.cpp.o" @@ -137,13 +182,16 @@ panic_EXTERNAL_OBJECTS = panic: CMakeFiles/panic.dir/main.cpp.o panic: CMakeFiles/panic.dir/src/io/print_tensor.cpp.o +panic: CMakeFiles/panic.dir/src/math/add.cpp.o +panic: CMakeFiles/panic.dir/src/math/matmul.cpp.o +panic: CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o panic: CMakeFiles/panic.dir/src/tensor/matrix.cpp.o panic: CMakeFiles/panic.dir/src/tensor/vector.cpp.o panic: CMakeFiles/panic.dir/build.make panic: /usr/lib/gcc/x86_64-linux-gnu/13/libgomp.so panic: /usr/lib/x86_64-linux-gnu/libpthread.a panic: CMakeFiles/panic.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Linking CXX executable panic" + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --green --bold --progress-dir=/home/atlas/Documents/Git/panic/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Linking CXX executable panic" $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/panic.dir/link.txt --verbose=$(VERBOSE) # Rule to build all files generated by this target. diff --git a/build/CMakeFiles/panic.dir/cmake_clean.cmake b/build/CMakeFiles/panic.dir/cmake_clean.cmake index a56499f..c93520b 100644 --- a/build/CMakeFiles/panic.dir/cmake_clean.cmake +++ b/build/CMakeFiles/panic.dir/cmake_clean.cmake @@ -3,6 +3,12 @@ file(REMOVE_RECURSE "CMakeFiles/panic.dir/main.cpp.o.d" "CMakeFiles/panic.dir/src/io/print_tensor.cpp.o" "CMakeFiles/panic.dir/src/io/print_tensor.cpp.o.d" + "CMakeFiles/panic.dir/src/math/add.cpp.o" + "CMakeFiles/panic.dir/src/math/add.cpp.o.d" + "CMakeFiles/panic.dir/src/math/matmul.cpp.o" + "CMakeFiles/panic.dir/src/math/matmul.cpp.o.d" + "CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o" + "CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o.d" "CMakeFiles/panic.dir/src/tensor/matrix.cpp.o" "CMakeFiles/panic.dir/src/tensor/matrix.cpp.o.d" "CMakeFiles/panic.dir/src/tensor/vector.cpp.o" diff --git a/build/CMakeFiles/panic.dir/link.txt b/build/CMakeFiles/panic.dir/link.txt index 742f133..2c7a1bc 100644 --- a/build/CMakeFiles/panic.dir/link.txt +++ b/build/CMakeFiles/panic.dir/link.txt @@ -1 +1 @@ -/usr/bin/c++ CMakeFiles/panic.dir/main.cpp.o CMakeFiles/panic.dir/src/io/print_tensor.cpp.o CMakeFiles/panic.dir/src/tensor/matrix.cpp.o CMakeFiles/panic.dir/src/tensor/vector.cpp.o -o panic /usr/lib/gcc/x86_64-linux-gnu/13/libgomp.so /usr/lib/x86_64-linux-gnu/libpthread.a +/usr/bin/c++ CMakeFiles/panic.dir/main.cpp.o CMakeFiles/panic.dir/src/io/print_tensor.cpp.o CMakeFiles/panic.dir/src/math/add.cpp.o CMakeFiles/panic.dir/src/math/matmul.cpp.o CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o CMakeFiles/panic.dir/src/tensor/matrix.cpp.o CMakeFiles/panic.dir/src/tensor/vector.cpp.o -o panic /usr/lib/gcc/x86_64-linux-gnu/13/libgomp.so /usr/lib/x86_64-linux-gnu/libpthread.a diff --git a/build/CMakeFiles/panic.dir/progress.make b/build/CMakeFiles/panic.dir/progress.make index 33e6bff..5b29368 100644 --- a/build/CMakeFiles/panic.dir/progress.make +++ b/build/CMakeFiles/panic.dir/progress.make @@ -3,4 +3,7 @@ CMAKE_PROGRESS_2 = 2 CMAKE_PROGRESS_3 = 3 CMAKE_PROGRESS_4 = 4 CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks index 7ed6ff8..45a4fb7 100644 --- a/build/CMakeFiles/progress.marks +++ b/build/CMakeFiles/progress.marks @@ -1 +1 @@ -5 +8 diff --git a/build/Makefile b/build/Makefile index a7a5241..3a2e999 100644 --- a/build/Makefile +++ b/build/Makefile @@ -178,6 +178,78 @@ src/io/print_tensor.cpp.s: $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/io/print_tensor.cpp.s .PHONY : src/io/print_tensor.cpp.s +src/math/add.o: src/math/add.cpp.o +.PHONY : src/math/add.o + +# target to build an object file +src/math/add.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/add.cpp.o +.PHONY : src/math/add.cpp.o + +src/math/add.i: src/math/add.cpp.i +.PHONY : src/math/add.i + +# target to preprocess a source file +src/math/add.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/add.cpp.i +.PHONY : src/math/add.cpp.i + +src/math/add.s: src/math/add.cpp.s +.PHONY : src/math/add.s + +# target to generate assembly for a file +src/math/add.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/add.cpp.s +.PHONY : src/math/add.cpp.s + +src/math/matmul.o: src/math/matmul.cpp.o +.PHONY : src/math/matmul.o + +# target to build an object file +src/math/matmul.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/matmul.cpp.o +.PHONY : src/math/matmul.cpp.o + +src/math/matmul.i: src/math/matmul.cpp.i +.PHONY : src/math/matmul.i + +# target to preprocess a source file +src/math/matmul.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/matmul.cpp.i +.PHONY : src/math/matmul.cpp.i + +src/math/matmul.s: src/math/matmul.cpp.s +.PHONY : src/math/matmul.s + +# target to generate assembly for a file +src/math/matmul.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/math/matmul.cpp.s +.PHONY : src/math/matmul.cpp.s + +src/neural_network/layer/layer_dense.o: src/neural_network/layer/layer_dense.cpp.o +.PHONY : src/neural_network/layer/layer_dense.o + +# target to build an object file +src/neural_network/layer/layer_dense.cpp.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.o +.PHONY : src/neural_network/layer/layer_dense.cpp.o + +src/neural_network/layer/layer_dense.i: src/neural_network/layer/layer_dense.cpp.i +.PHONY : src/neural_network/layer/layer_dense.i + +# target to preprocess a source file +src/neural_network/layer/layer_dense.cpp.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.i +.PHONY : src/neural_network/layer/layer_dense.cpp.i + +src/neural_network/layer/layer_dense.s: src/neural_network/layer/layer_dense.cpp.s +.PHONY : src/neural_network/layer/layer_dense.s + +# target to generate assembly for a file +src/neural_network/layer/layer_dense.cpp.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/panic.dir/build.make CMakeFiles/panic.dir/src/neural_network/layer/layer_dense.cpp.s +.PHONY : src/neural_network/layer/layer_dense.cpp.s + src/tensor/matrix.o: src/tensor/matrix.cpp.o .PHONY : src/tensor/matrix.o @@ -241,6 +313,15 @@ help: @echo "... src/io/print_tensor.o" @echo "... src/io/print_tensor.i" @echo "... src/io/print_tensor.s" + @echo "... src/math/add.o" + @echo "... src/math/add.i" + @echo "... src/math/add.s" + @echo "... src/math/matmul.o" + @echo "... src/math/matmul.i" + @echo "... src/math/matmul.s" + @echo "... src/neural_network/layer/layer_dense.o" + @echo "... src/neural_network/layer/layer_dense.i" + @echo "... src/neural_network/layer/layer_dense.s" @echo "... src/tensor/matrix.o" @echo "... src/tensor/matrix.i" @echo "... src/tensor/matrix.s" diff --git a/build/panic b/build/panic index fdeb13631ee847779e2f9206060784f410cab1d6..9d11392a5cf138bf8299e6036fbbb1418272da1d 100755 GIT binary patch literal 79776 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

=QE6=F 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 literal 51400 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 b#Q7cbrP@_Ea?eEdZ{shVoNTFJDQf=<`qWts diff --git a/include/config/constants.hpp b/include/config/constants.hpp index f15a3a7..08c1deb 100644 --- a/include/config/constants.hpp +++ b/include/config/constants.hpp @@ -52,40 +52,40 @@ namespace panic { namespace constants{ //--------------------------------------------------------------------------------------------------------------------------- - // Type Name : panic::pi + // Type Name : panic::constants::pi // // Description: // Default difinition of pi (3.14159265358979323846) used inside PANIC. // static_cast makes sure the right number of decimals are used when defining the constant. // // Underlying Type: - // panic::real_t + // panic::types::real_t //--------------------------------------------------------------------------------------------------------------------------- - static const panic::real_t pi = static_cast(3.14159265358979323846); + static const panic::types::real_t pi = static_cast(3.14159265358979323846); //--------------------------------------------------------------------------------------------------------------------------- // - // Type Name : panic::tau + // Type Name : panic::constants::tau // // Description: // Default difinition of tau (6.28318530717958647692) used inside PANIC. // static_cast makes sure the right number of decimals are used when defining the constant. // // Underlying Type: - // panic::real_t + // panic::types::real_t //--------------------------------------------------------------------------------------------------------------------------- - static const panic::real_t tau = static_cast(6.28318530717958647692); + static const panic::types::real_t tau = static_cast(6.28318530717958647692); //--------------------------------------------------------------------------------------------------------------------------- // - // Type Name : panic::e + // Type Name : panic::constants::e // // Description: // Default difinition of eulers number, e (2.71828182845904523536) used inside PANIC. // static_cast makes sure the right number of decimals are used when defining the constant. // // Underlying Type: - // panic::real_t + // panic::types::real_t //--------------------------------------------------------------------------------------------------------------------------- - static const panic::real_t e = static_cast(2.71828182845904523536); + static const panic::types::real_t e = static_cast(2.71828182845904523536); } // namespace constants } // namespace panic diff --git a/include/config/types.hpp b/include/config/types.hpp index e82c271..0ac970f 100644 --- a/include/config/types.hpp +++ b/include/config/types.hpp @@ -45,7 +45,7 @@ //--------------------------------------------------------------------------------------------------------------------------- // TYPE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -// Type Name : panic::uint_t +// Type Name : panic::types::uint_t // // Description: // Default unsigned integer type used inside PANIC. @@ -54,7 +54,7 @@ // uint32_t //--------------------------------------------------------------------------------------------------------------------------- // -// Type Name : panic::int_t +// Type Name : panic::types::int_t // // Description: // Default signed integer type used inside PANIC. @@ -63,7 +63,7 @@ // int32_t //--------------------------------------------------------------------------------------------------------------------------- // -// Type Name : panic::real_t +// Type Name : panic::types::real_t // // Description: // Default floating-point type used inside PANIC. @@ -73,11 +73,12 @@ //--------------------------------------------------------------------------------------------------------------------------- namespace panic { + namespace types{ typedef uint32_t uint_t; typedef int32_t int_t; typedef float real_t; - + } // namespace types } // namespace panic diff --git a/include/math/add.hpp b/include/math/add.hpp new file mode 100644 index 0000000..31f7387 --- /dev/null +++ b/include/math/add.hpp @@ -0,0 +1,364 @@ +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * PANIC + * Portable Algorithms and Numerics In C++ + * + * Scientific computing from scratch, with feeling. + * + * Copyright (c) 2026 Michelle Bausager + * + * This file is part of PANIC. + * + * PANIC is free software licensed under the GNU General Public License v3.0 or later. + * You may redistribute and/or modify it under the terms of the GPL. + * + * PANIC 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 LICENSE file for the full license text. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * Project Name: PANIC + * Module Name: math + * File Name: add.hpp + * Revision: 0.1.0 + * Date: 25-06-2026 + * Author: Michelle Bausager + * + * Description: + * Functions to add panic::tensor togther; + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +#pragma one +//--------------------------------------------------------------------------------------------------------------------------- +// INCLUDE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- +#include // for panic::real_vector (uint_vector, int_vector) +#include // for panic::real_matrix (uint_matrix, int_matrix) +//--------------------------------------------------------------------------------------------------------------------------- +// DEFINE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// VARIABLE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// FUNCTION PROTOTYPE +//--------------------------------------------------------------------------------------------------------------------------- +namespace panic{ +namespace math{ + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a scaler to a panic::tensor::vector +// c(2) = a(2) + k +// +// Inputs: +// +// a const panic::tensor::vector& +// +// k const +// +// Outputs: +// c panic::tensor::vector& +// +// Returns: +// bool +// +// Notes: +// The c vector is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::vector& a, const T k, panic::tensor::vector& c); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a scaler to a panic::tensor::vector +// c(2) = a(2) + k +// +// Inputs: +// +// a const panic::tensor::vector& +// +// k const +// +// Outputs: +// None. +// +// Returns: +// c panic::tensor::vector +// +// Notes: +// Makes new vector and returns the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::vector add(const panic::tensor::vector& a, const T k); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds two panic::tensor::vector +// c(2) = a(2) + b(2) +// +// Inputs: +// +// a const panic::tensor::vector& +// +// b const panic::tensor::vector& +// +// Outputs: +// c panic::tensor::vector& +// +// Returns: +// bool +// +// Notes: +// If input vector dimentions are not correct, output is a empty vector and returns false. +// The c vector is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::vector& a, const panic::tensor::vector& b, panic::tensor::vector& c); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds two panic::tensor::vector +// c(2) = a(2) + b(2) +// +// Inputs: +// +// a const panic::tensor::vector& +// +// b const panic::tensor::vector& +// +// Outputs: +// None. +// +// Returns: +// c panic::tensor::vector +// +// Notes: +// If input vector dimentions are not correct, return is an empty vector. +// Makes new vector and returns the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::vector add(const panic::tensor::vector& a, const panic::tensor::vector& b); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a scaler to a panic::tensor::matrix +// C(2,2) = A(2,2) + k +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// k const T +// +// Outputs: +// C panic::tensor::matrix& +// +// Returns: +// bool +// +// Notes: +// The C matrix is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::matrix& A, const T k, panic::tensor::matrix& C); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a scaler to a panic::tensor::matrix +// C(2,2) = A(2,2) + k +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// k const T +// +// Outputs: +// None. +// +// Returns: +// C panic::tensor::matrix +// +// Notes: +// Creates new matrix, C, for the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add(const panic::tensor::matrix& A, const T k); + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds two panic::tensor::matrix +// C(2,2) = A(2,2) + B(2,2) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// B const panic::tensor::matrix& +// +// Outputs: +// C panic::tensor::matrix& +// +// Returns: +// bool +// +// Notes: +// If input matrix dimentions are not correct, outputs an a empty matrix and returns false. +// The C matrix is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::matrix& A, const panic::tensor::matrix& B, panic::tensor::matrix& C); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds two panic::tensor::matrix +// C(2,2) = A(2,2) + B(2,2) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// B const panic::tensor::matrix& +// +// Outputs: +// None. +// +// Returns: +// C panic::tensor::matrix +// +// Notes: +// If input matrix dimentions are not correct, returns an a empty matrix. +// Creates new matrix, C, for the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add(const panic::tensor::matrix& A, const panic::tensor::matrix& B); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_rowwise +// +// Description: +// Adds two panic::tensor::matrix +// C(2,3) = A(2,3) + b(2) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// b const panic::tensor::vector& +// +// Outputs: +// C panic::tensor::matrix& +// +// Returns: +// bool +// +// Notes: +// If input vector dimentions are not correct, outputs an a empty matrix and returns false. +// The C matrix is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add_rowwise(const panic::tensor::matrix& A, const panic::tensor::vector& b, panic::tensor::matrix& C); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_rowwise +// +// Description: +// Adds two panic::tensor::matrix +// C(2,3) = A(2,3) + b(2) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// b const panic::tensor::vector& +// +// Outputs: +// None. +// +// Returns: +// C panic::tensor::matrix& +// +// Notes: +// If input vector dimentions are not correct, returns an a empty matrix. +// Creates new matrix, C, for the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add_rowwise(const panic::tensor::matrix& A, const panic::tensor::vector& b); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_colwise +// +// Description: +// Adds two panic::tensor::matrix +// C(2,3) = A(2,3) + b(3) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// b const panic::tensor::vector& +// +// Outputs: +// C panic::tensor::matrix& +// +// Returns: +// bool +// +// Notes: +// If input vector dimentions are not correct, outputs an a empty matrix and returns false. +// The C matrix is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add_colwise(const panic::tensor::matrix& A, const panic::tensor::vector& b, panic::tensor::matrix& C); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_colwise +// +// Description: +// Adds two panic::tensor::matrix +// C(2,3) = A(2,3) + b(3) +// +// Inputs: +// +// A const panic::tensor::matrix& +// +// b const panic::tensor::vector& +// +// Outputs: +// None. +// +// Returns: +// C panic::tensor::matrix& +// +// Notes: +// If input vector dimentions are not correct, returns an a empty matrix. +// Creates new matrix, C, for the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add_colwise(const panic::tensor::matrix& A, const panic::tensor::vector& b); + +} // namespace math +} // namespace panic \ No newline at end of file diff --git a/include/math/matmul.hpp b/include/math/matmul.hpp new file mode 100644 index 0000000..3520e83 --- /dev/null +++ b/include/math/matmul.hpp @@ -0,0 +1,107 @@ +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * PANIC + * Portable Algorithms and Numerics In C++ + * + * Scientific computing from scratch, with feeling. + * + * Copyright (c) 2026 Michelle Bausager + * + * This file is part of PANIC. + * + * PANIC is free software licensed under the GNU General Public License v3.0 or later. + * You may redistribute and/or modify it under the terms of the GPL. + * + * PANIC 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 LICENSE file for the full license text. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * Project Name: PANIC + * Module Name: math + * File Name: matmul.hpp + * Revision: 0.1.0 + * Date: 24-06-2026 + * Author: Michelle Bausager + * + * Description: + * Functions to print out tensors with std::cout << x std::endl; + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +#pragma one +//--------------------------------------------------------------------------------------------------------------------------- +// INCLUDE DESCRIPTION +//----------------------------------------------------------------------------------------------------- +#include // for panic::real_matrix +//--------------------------------------------------------------------------------------------------------------------------- +// DEFINE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// VARIABLE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// FUNCTION PROTOTYPE +//--------------------------------------------------------------------------------------------------------------------------- +namespace panic{ +namespace math{ + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::matmul +// +// Description: +// Multiplies to panic::tensor::real_matrix +// C(2,4) = A(2,3) * B(3,4) +// +// Inputs: +// +// A const panic::tensor::real_matrix& +// +// B const panic::tensor::real_matrix& +// +// Outputs: +// C panic::tensor::real_matrix& +// +// Returns: +// bool +// +// Notes: +// If input matrix dimentions are not correct, output is a empty matrix and returns false. +// The C matrix is resized if nessessary. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B, panic::tensor::matrix& C); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::matmul +// +// Description: +// Multiplies to panic::tensor::real_matrix +// C(2,4) = A(2,3) * B(3,4) +// +// Inputs: +// +// A const panic::tensor::real_matrix& +// +// B const panic::tensor::real_matrix& +// +// Outputs: +// None. +// +// Returns: +// C panic::tensor::real_matrix& +// +// Notes: +// If input matrix dimentions are not correct, returns an a empty matrix. +// Creates new matrix, C, for the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B); + + +} // namespace math +} // namespace panic \ No newline at end of file diff --git a/include/neural_network/layer/layer.hpp b/include/neural_network/layer/layer.hpp index 4f3e50b..d8372a7 100644 --- a/include/neural_network/layer/layer.hpp +++ b/include/neural_network/layer/layer.hpp @@ -22,13 +22,13 @@ * * Project Name: PANIC * Module Name: neural_network - * File Name: layer_dense.hpp + * File Name: layer.hpp * Revision: 0.1.0 * Date: 23-06-2026 * Author: Michelle Bausager * * Description: - * Defines the dense layers used in neural network + * Defines the base layers struct used in pther layers in neural network * *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #pragma once @@ -36,6 +36,7 @@ // INCLUDE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- #include // panic::uint_t, panic::int_t, and panic::real_t +#include // panic::tensor::real_matrix (uint_matrix, int_matrix) //--------------------------------------------------------------------------------------------------------------------------- // DEFINE DESCRIPTION @@ -46,94 +47,34 @@ //--------------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------------- -// Type Name : panic::neural_network::layer_dense +// Type Name : panic::neural_network::layer // // Description: -// A dense layer to use in neural networks +// A base layer to use in neural networks // // Member Variables: -// length panic::uint_t -// Number of elements in the vector. -// -// data panic::real_t* -// Pointer to the allocated vector data. +// None. // // Notes: -// This vector uses dynamic allocation with new[] and delete[]. -// Copying performs a deep copy. +// This base layer should be used in all layers/activations that have a forward and backward function +// This is done so it's easy to make a list of layers in the model to loop over. +// The virtual means it should use derived object's version when called with a pointer. +// The =0 means the derviced object NEEDS to have these functions to work. +// //--------------------------------------------------------------------------------------------------------------------------- namespace panic{ - namespace tensor{ + namespace neural_network{ -template -struct vector{ - panic::uint_t length; - T* data; +struct layer{ - // empty contructor - vector(); + virtual ~layer() = default; - // contructor with size allocation - vector(panic::uint_t size); - - // contructor with size allocation and sets it all to a value - vector(panic::uint_t size, T value); - - // copy-contructor - // vector a(3); - // vector b = a; - vector(const vector& other); - - // de-contructor, releases memory - ~vector(); - - // copy-assignment - //vector a(5); - //vector b(3); - //b = a; - vector& operator=(const vector& other); - - // function returns size. - // const tells compiler that the fuction don't edit the objert. - panic::uint_t size() const; - - // function to resize data vector (I need a new that don't save the vlaues) - bool resize(panic::uint_t new_size); - - // fill data with value - bool fill(T value); - - // lets you read and write v[index] - T& operator[](panic::uint_t index); - - // lets you read v[index] from a const vector - const T& operator[](panic::uint_t index) const; - - // lets you read and write v.at(index) - T& at(panic::uint_t index); - - // lets you read v.at(index) from a const vector - const T& at(panic::uint_t index) const; + virtual bool forward(const panic::tensor::real_matrix& inputs) = 0; + virtual bool backward(const panic::tensor::real_matrix& dinputs) = 0; }; -//--------------------------------------------------------------------------------------------------------------------------- -// TYPE ALIASES -//--------------------------------------------------------------------------------------------------------------------------- - -typedef vector real_vector; -typedef vector int_vector; -typedef vector uint_vector; - -//--------------------------------------------------------------------------------------------------------------------------- -// EXPLICIT TEMPLATE DECLARATION -//--------------------------------------------------------------------------------------------------------------------------- - -extern template struct vector; -extern template struct vector; -extern template struct vector; - } // namespace tensor } // namespace panic diff --git a/include/neural_network/layer/layer_dense.hpp b/include/neural_network/layer/layer_dense.hpp index 4f3e50b..ed26e44 100644 --- a/include/neural_network/layer/layer_dense.hpp +++ b/include/neural_network/layer/layer_dense.hpp @@ -32,10 +32,14 @@ * *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #pragma once + //--------------------------------------------------------------------------------------------------------------------------- // INCLUDE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- #include // panic::uint_t, panic::int_t, and panic::real_t +#include // for base layer struct +#include +#include //--------------------------------------------------------------------------------------------------------------------------- // DEFINE DESCRIPTION @@ -45,96 +49,54 @@ // TYPE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------------------------------- -// Type Name : panic::neural_network::layer_dense +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::neural_network::layer_dense // // Description: -// A dense layer to use in neural networks +// Dense/fully-connected neural network layer. // -// Member Variables: -// length panic::uint_t -// Number of elements in the vector. +// Inputs: +// Samples x input size const panic::tensor::real_matrix& // -// data panic::real_t* -// Pointer to the allocated vector data. +// Weight shape: +// input_size x neuron_count +// +// Bias shape: +// 1 x neuron_count +// +// Output shape: +// samples x neuron_count panic::tensor::real_matrix // // Notes: -// This vector uses dynamic allocation with new[] and delete[]. -// Copying performs a deep copy. -//--------------------------------------------------------------------------------------------------------------------------- +// forward(input) calculates: +// +// outputs = inputs * weights + biases +//-------------------------------------------------------------------------------------------------------------------------- namespace panic{ - namespace tensor{ + namespace neural_network{ -template -struct vector{ - panic::uint_t length; - T* data; +struct layer_dense : public layer{ - // empty contructor - vector(); + panic::tensor::real_matrix weights; + panic::tensor::real_vector biases; + panic::tensor::real_matrix outputs; - // contructor with size allocation - vector(panic::uint_t size); + // Empthy contructor + layer_dense(); - // contructor with size allocation and sets it all to a value - vector(panic::uint_t size, T value); + // Contructor with layer size + layer_dense(panic::types::uint_t input_size, panic::types::uint_t neurons); - // copy-contructor - // vector a(3); - // vector b = a; - vector(const vector& other); + // Decontructor (All internal variables has decontructors, so we can just use default) + ~layer_dense() = default; - // de-contructor, releases memory - ~vector(); - - // copy-assignment - //vector a(5); - //vector b(3); - //b = a; - vector& operator=(const vector& other); - - // function returns size. - // const tells compiler that the fuction don't edit the objert. - panic::uint_t size() const; - - // function to resize data vector (I need a new that don't save the vlaues) - bool resize(panic::uint_t new_size); - - // fill data with value - bool fill(T value); - - // lets you read and write v[index] - T& operator[](panic::uint_t index); - - // lets you read v[index] from a const vector - const T& operator[](panic::uint_t index) const; - - // lets you read and write v.at(index) - T& at(panic::uint_t index); - - // lets you read v.at(index) from a const vector - const T& at(panic::uint_t index) const; + // Forward function for forward pass + bool forward(const panic::tensor::real_matrix& inputs); + // Backward pass + bool backward(const panic::tensor::real_matrix& dinpus); }; - -//--------------------------------------------------------------------------------------------------------------------------- -// TYPE ALIASES -//--------------------------------------------------------------------------------------------------------------------------- - -typedef vector real_vector; -typedef vector int_vector; -typedef vector uint_vector; - -//--------------------------------------------------------------------------------------------------------------------------- -// EXPLICIT TEMPLATE DECLARATION -//--------------------------------------------------------------------------------------------------------------------------- - -extern template struct vector; -extern template struct vector; -extern template struct vector; - - } // namespace tensor } // namespace panic diff --git a/include/tensor/matrix.hpp b/include/tensor/matrix.hpp index a3e43ca..7022d44 100644 --- a/include/tensor/matrix.hpp +++ b/include/tensor/matrix.hpp @@ -70,19 +70,19 @@ namespace panic{ template struct matrix{ - panic::uint_t n; - panic::uint_t m; - panic::uint_t length; + panic::types::uint_t n; + panic::types::uint_t m; + panic::types::uint_t length; T* data; // empty contructor matrix(); // contructor with size allocation - matrix(panic::uint_t rows, panic::uint_t cols); + matrix(panic::types::uint_t rows, panic::types::uint_t cols); // contructor with size allocation and sets it all to a value - matrix(panic::uint_t rows, panic::uint_t cols, T value); + matrix(panic::types::uint_t rows, panic::types::uint_t cols, T value); // copy-contructor // matrix A(3,3); @@ -100,14 +100,14 @@ struct matrix{ // function returns rows. // const tells compiler that the fuction don't edit the objert. - panic::uint_t rows() const; + panic::types::uint_t rows() const; // function returns columns. // const tells compiler that the fuction don't edit the objert. - panic::uint_t cols() const; + panic::types::uint_t cols() const; // function to resize data vector - bool resize(panic::uint_t new_n, panic::uint_t new_m); + bool resize(panic::types::uint_t new_n, panic::types::uint_t new_m); // fill data with value bool fill(T value); @@ -116,10 +116,10 @@ struct matrix{ // Example: // A(1, 2) // This is unchecked and fast. - T& operator()(panic::uint_t index_n, panic::uint_t index_m); + T& operator()(panic::types::uint_t index_n, panic::types::uint_t index_m); // lets you read matrix data using row and column from a const matrix - const T& operator()(panic::uint_t index_n, panic::uint_t index_m) const; + const T& operator()(panic::types::uint_t index_n, panic::types::uint_t index_m) const; }; @@ -128,17 +128,17 @@ struct matrix{ // TYPE ALIASES //--------------------------------------------------------------------------------------------------------------------------- -typedef matrix real_matrix; -typedef matrix int_matrix; -typedef matrix uint_matrix; +typedef matrix real_matrix; +typedef matrix int_matrix; +typedef matrix uint_matrix; //--------------------------------------------------------------------------------------------------------------------------- // EXPLICIT TEMPLATE DECLARATION //--------------------------------------------------------------------------------------------------------------------------- -extern template struct matrix; -extern template struct matrix; -extern template struct matrix; +extern template struct matrix; +extern template struct matrix; +extern template struct matrix; } // namespace tensor diff --git a/include/tensor/vector.hpp b/include/tensor/vector.hpp index 4d45e1d..e2fe6f1 100644 --- a/include/tensor/vector.hpp +++ b/include/tensor/vector.hpp @@ -68,17 +68,17 @@ namespace panic{ template struct vector{ - panic::uint_t length; + panic::types::uint_t length; T* data; // empty contructor vector(); // contructor with size allocation - vector(panic::uint_t size); + vector(panic::types::uint_t size); // contructor with size allocation and sets it all to a value - vector(panic::uint_t size, T value); + vector(panic::types::uint_t size, T value); // copy-contructor // vector a(3); @@ -96,25 +96,25 @@ struct vector{ // function returns size. // const tells compiler that the fuction don't edit the objert. - panic::uint_t size() const; + panic::types::uint_t size() const; // function to resize data vector (I need a new that don't save the vlaues) - bool resize(panic::uint_t new_size); + bool resize(panic::types::uint_t new_size); // fill data with value bool fill(T value); // lets you read and write v[index] - T& operator[](panic::uint_t index); + T& operator[](panic::types::uint_t index); // lets you read v[index] from a const vector - const T& operator[](panic::uint_t index) const; + const T& operator[](panic::types::uint_t index) const; // lets you read and write v.at(index) - T& at(panic::uint_t index); + T& at(panic::types::uint_t index); // lets you read v.at(index) from a const vector - const T& at(panic::uint_t index) const; + const T& at(panic::types::uint_t index) const; }; @@ -123,17 +123,17 @@ struct vector{ // TYPE ALIASES //--------------------------------------------------------------------------------------------------------------------------- -typedef vector real_vector; -typedef vector int_vector; -typedef vector uint_vector; +typedef vector real_vector; +typedef vector int_vector; +typedef vector uint_vector; //--------------------------------------------------------------------------------------------------------------------------- // EXPLICIT TEMPLATE DECLARATION //--------------------------------------------------------------------------------------------------------------------------- -extern template struct vector; -extern template struct vector; -extern template struct vector; +extern template struct vector; +extern template struct vector; +extern template struct vector; } // namespace tensor diff --git a/main.cpp b/main.cpp index de56b01..e992c04 100644 --- a/main.cpp +++ b/main.cpp @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include //--------------------------------------------------------------------------------------------------------------------------- // DEFINE DESCRIPTION @@ -52,11 +55,11 @@ // VARIABLE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- // Variable difinition like: -panic::real_t x = 2.4; +panic::types::real_t x = 2.4; panic::tensor::real_vector a(3); panic::tensor::uint_vector b(3); -panic::tensor::int_vector c(10); +panic::tensor::int_vector c(3); panic::tensor::real_matrix A(2,2, 1); panic::tensor::uint_matrix B(2,2, 2); @@ -90,6 +93,19 @@ int main(void) { panic::io::print_matrix(B); panic::io::print_matrix(C); + panic::tensor::real_matrix A1(100, 100, 0.999/100); + panic::tensor::real_matrix A2(100, 100, 100); + + + for (panic::types::uint_t i = 0; i < 5; ++i) + { + std::cout << A2(0,0) << std::endl; + A2 = panic::math::matmul(A1, A2); + } + + panic::tensor::real_matrix B1(25, 100, 100); + panic::neural_network::layer_dense dense(100,10); + std::cout << dense.forward(B1) << std::endl; diff --git a/src/io/print_tensor.cpp b/src/io/print_tensor.cpp index 38dcffa..5026c04 100644 --- a/src/io/print_tensor.cpp +++ b/src/io/print_tensor.cpp @@ -22,7 +22,7 @@ * * Project Name: PANIC * Module Name: io - * File Name: print_tensor.hpp + * File Name: print_tensor.cpp * Revision: 0.1.0 * Date: 21-06-2026 * Author: Michelle Bausager @@ -36,6 +36,7 @@ // INCLUDE DESCRIPTION //----------------------------------------------------------------------------------------------------- #include // for std::cout, std::endl +//#include #include // for panic::tensor::vector #include @@ -64,7 +65,7 @@ namespace panic { //-------------------------------------------------------------------------------------------------------------------------- void print_vector(const panic::tensor::uint_vector& v){ std::cout << "["; - for (panic::uint_t i = 0; i < v.size()-1; ++i){ + for (panic::types::uint_t i = 0; i < v.size()-1; ++i){ std::cout << v[i] << ", "; } std::cout << v[v.size()-1]<< "]" << std::endl; @@ -72,7 +73,7 @@ void print_vector(const panic::tensor::uint_vector& v){ } void print_vector(const panic::tensor::int_vector& v){ std::cout << "["; - for (panic::uint_t i = 0; i < v.size()-1; ++i){ + for (panic::types::uint_t i = 0; i < v.size()-1; ++i){ std::cout << v[i] << ", "; } std::cout << v[v.size()-1]<< "]" << std::endl; @@ -80,7 +81,7 @@ void print_vector(const panic::tensor::int_vector& v){ } void print_vector(const panic::tensor::real_vector& v){ std::cout << "["; - for (panic::uint_t i = 0; i < v.size()-1; ++i){ + for (panic::types::uint_t i = 0; i < v.size()-1; ++i){ std::cout << v[i] << ", "; } std::cout << v[v.size()-1]<< "]" << std::endl; @@ -98,9 +99,9 @@ void print_vector(const panic::tensor::real_vector& v){ //-------------------------------------------------------------------------------------------------------------------------- void print_matrix(const panic::tensor::uint_matrix& A){ std::cout << "["; - for (panic::uint_t i = 0; i < A.rows(); ++i){ + for (panic::types::uint_t i = 0; i < A.rows(); ++i){ std::cout << "["; - for (panic::uint_t j = 0; j < A.cols(); ++j){ + for (panic::types::uint_t j = 0; j < A.cols(); ++j){ std::cout << A(i,j) << ", "; } if (i < A.rows()-1){ @@ -113,9 +114,9 @@ void print_matrix(const panic::tensor::uint_matrix& A){ void print_matrix(const panic::tensor::int_matrix& A){ std::cout << "["; - for (panic::uint_t i = 0; i < A.rows(); ++i){ + for (panic::types::uint_t i = 0; i < A.rows(); ++i){ std::cout << "["; - for (panic::uint_t j = 0; j < A.cols(); ++j){ + for (panic::types::uint_t j = 0; j < A.cols(); ++j){ std::cout << A(i,j) << ", "; } if (i < A.rows()-1){ @@ -128,9 +129,9 @@ void print_matrix(const panic::tensor::int_matrix& A){ void print_matrix(const panic::tensor::real_matrix& A){ std::cout << "["; - for (panic::uint_t i = 0; i < A.rows(); ++i){ + for (panic::types::uint_t i = 0; i < A.rows(); ++i){ std::cout << "["; - for (panic::uint_t j = 0; j < A.cols(); ++j){ + for (panic::types::uint_t j = 0; j < A.cols(); ++j){ std::cout << A(i,j) << ", "; } if (i < A.rows()-1){ diff --git a/src/math/add.cpp b/src/math/add.cpp new file mode 100644 index 0000000..107f9d0 --- /dev/null +++ b/src/math/add.cpp @@ -0,0 +1,563 @@ +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * PANIC + * Portable Algorithms and Numerics In C++ + * + * Scientific computing from scratch, with feeling. + * + * Copyright (c) 2026 Michelle Bausager + * + * This file is part of PANIC. + * + * PANIC is free software licensed under the GNU General Public License v3.0 or later. + * You may redistribute and/or modify it under the terms of the GPL. + * + * PANIC 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 LICENSE file for the full license text. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * Project Name: PANIC + * Module Name: math + * File Name: add.cpp + * Revision: 0.1.0 + * Date: 25-06-2026 + * Author: Michelle Bausager + * + * Description: + * Functions to add panic::tensors togther; + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + +//--------------------------------------------------------------------------------------------------------------------------- +// INCLUDE DESCRIPTION +//----------------------------------------------------------------------------------------------------- + +#include +#include +//#include // for panic::tensor::real_matrix + +//--------------------------------------------------------------------------------------------------------------------------- +// DEFINE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// VARIABLE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- +static const panic::types::uint_t add_omp_min_work = 10000; + +//--------------------------------------------------------------------------------------------------------------------------- +// FUNCTION PROTOTYPE +//--------------------------------------------------------------------------------------------------------------------------- + +namespace panic { + namespace math { + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a constant to a vector +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::vector& a, const T k, panic::tensor::vector& c){ + + if (!c.resize(a.size())){ + return false; + } + + PANIC_OMP_PARALLEL_FOR_IF(a.size() > add_omp_min_work) + for (panic::types::uint_t i = 0; i < a.size(); ++i){ + c[i] = a[i] + k; + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add(const panic::tensor::vector& a, + const panic::types::uint_t k, + panic::tensor::vector& c +); +template bool add(const panic::tensor::vector& a, + const panic::types::int_t k, + panic::tensor::vector& c +); +template bool add(const panic::tensor::vector& a, + const panic::types::real_t k, + panic::tensor::vector& c +); + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a constant to a vector +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::vector add(const panic::tensor::vector& a, const T k){ + panic::tensor::vector c(a.size()); + + if (!add(a, k, c)){ + return panic::tensor::vector(); + } + + return c; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::types::uint_t k +); +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::types::int_t k +); +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::types::real_t k +); + + + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a vector to a vector +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::vector& a, const panic::tensor::vector& b, panic::tensor::vector& c){ + + if (a.size() != b.size()){ + return false; + } + + if (!c.resize(a.size())){ + return false; + } + + PANIC_OMP_PARALLEL_FOR_IF(a.size() > add_omp_min_work) + for (panic::types::uint_t i = 0; i < a.size(); ++i){ + c[i] = a[i] + b[i]; + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add(const panic::tensor::vector& a, + const panic::tensor::vector& b, + panic::tensor::vector& c +); +template bool add(const panic::tensor::vector& a, + const panic::tensor::vector& b, + panic::tensor::vector& c +); +template bool add(const panic::tensor::vector& a, + const panic::tensor::vector& b, + panic::tensor::vector& c +); + + + + + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a vector to a vector +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::vector add(const panic::tensor::vector& a, const panic::tensor::vector& b){ + panic::tensor::vector c(a.size()); + + if (!add(a, b, c)){ + return panic::tensor::vector(); + } + + return c; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::tensor::vector& b +); +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::tensor::vector& b +); +template panic::tensor::vector + add(const panic::tensor::vector& a, + const panic::tensor::vector& b +); + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a constant to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::matrix& A, const T k, panic::tensor::matrix& C){ + + panic::types::uint_t rows = A.rows(); + panic::types::uint_t cols = A.cols(); + panic::types::uint_t work = rows*cols; + + if ( !C.resize(rows, cols) ){ + return false; + } + + + PANIC_OMP_PARALLEL_FOR_IF(work > add_omp_min_work) + for (panic::types::uint_t i = 0; i < rows; ++i){ + for (panic::types::uint_t j = 0; j < cols; ++j){ + C(i,j) = A(i,j) + k; + } + + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add(const panic::tensor::matrix& A, + const panic::types::uint_t k, + panic::tensor::matrix& C +); +template bool add(const panic::tensor::matrix& A, + const panic::types::int_t k, + panic::tensor::matrix& C +); +template bool add(const panic::tensor::matrix& A, + const panic::types::real_t k, + panic::tensor::matrix& C +); + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a constant to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add(const panic::tensor::matrix& A, const T k){ + panic::tensor::matrix C; + + if (!add(A, k, C)){ + return panic::tensor::matrix(); + } + + return C; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::types::uint_t k +); +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::types::int_t k +); +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::types::real_t k +); + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a matrix to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add(const panic::tensor::matrix& A, const panic::tensor::matrix& B, panic::tensor::matrix& C){ + + panic::types::uint_t rows = A.rows(); + panic::types::uint_t cols = A.cols(); + panic::types::uint_t work = rows*cols; + + if ( (rows != B.rows()) || (cols != B.cols())){ + return false; + } + + if ( !C.resize(rows, cols) ){ + return false; + } + + + PANIC_OMP_PARALLEL_FOR_IF(work > add_omp_min_work) + for (panic::types::uint_t i = 0; i < rows; ++i){ + for (panic::types::uint_t j = 0; j < cols; ++j){ + C(i,j) = A(i,j) + B(i,j); + } + + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); +template bool add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); +template bool add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); + + + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add +// +// Description: +// Adds a matrix to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add(const panic::tensor::matrix& A, const panic::tensor::matrix& B){ + panic::tensor::matrix C; + + if (!add(A, B, C)){ + return panic::tensor::matrix(); + } + + return C; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); +template panic::tensor::matrix + add(const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_rowwise +// +// Description: +// Adds a vector row-wise to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add_rowwise(const panic::tensor::matrix& A, const panic::tensor::vector& b, panic::tensor::matrix& C){ + + panic::types::uint_t rows = A.rows(); + panic::types::uint_t cols = A.cols(); + panic::types::uint_t work = rows*cols; + + if ( cols != b.size() ){ + return false; + } + + if ( !C.resize(rows, cols) ){ + return false; + } + + + PANIC_OMP_PARALLEL_FOR_IF(work > add_omp_min_work) + for (panic::types::uint_t i = 0; i < rows; ++i){ + for (panic::types::uint_t j = 0; j < cols; ++j){ + + C(i,j) = A(i,j) + b[j]; + } + + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); +template bool add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); +template bool add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_rowwise +// +// Description: +// Adds a vector row-wise to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add_rowwise(const panic::tensor::matrix& A, const panic::tensor::vector& b){ + panic::tensor::matrix C; + + if (!add_rowwise(A, b, C)){ + return panic::tensor::matrix(); + } + + return C; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::matrix + add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); +template panic::tensor::matrix + add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); +template panic::tensor::matrix + add_rowwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); + + + + + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_colwise +// +// Description: +// Adds a vector coloumn-wise to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +bool add_colwise(const panic::tensor::matrix& A, const panic::tensor::vector& b, panic::tensor::matrix& C){ + + panic::types::uint_t rows = A.rows(); + panic::types::uint_t cols = A.cols(); + panic::types::uint_t work = rows*cols; + + if ( rows != b.size() ){ + return false; + } + + if ( !C.resize(rows, cols) ){ + return false; + } + + + PANIC_OMP_PARALLEL_FOR_IF(work > add_omp_min_work) + for (panic::types::uint_t i = 0; i < rows; ++i){ + const T temp = b[i]; + for (panic::types::uint_t j = 0; j < cols; ++j){ + + C(i,j) = A(i,j) + temp; + } + + } + + return true; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template bool add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); +template bool add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); +template bool add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b, + panic::tensor::matrix& C +); + + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::add_colwise +// +// Description: +// Adds a vector coloumn-wise to a matrix +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix add_colwise(const panic::tensor::matrix& A, const panic::tensor::vector& b){ + panic::tensor::matrix C; + + + if (!add_colwise(A, b, C)){ + return panic::tensor::matrix(); + } + + return C; +} +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- +template panic::tensor::matrix + add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); +template panic::tensor::matrix + add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); +template panic::tensor::matrix + add_colwise(const panic::tensor::matrix& A, + const panic::tensor::vector& b +); + + + + + + } // namespace math +} // namespace panic diff --git a/src/math/matmul.cpp b/src/math/matmul.cpp new file mode 100644 index 0000000..5a695bc --- /dev/null +++ b/src/math/matmul.cpp @@ -0,0 +1,169 @@ +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * PANIC + * Portable Algorithms and Numerics In C++ + * + * Scientific computing from scratch, with feeling. + * + * Copyright (c) 2026 Michelle Bausager + * + * This file is part of PANIC. + * + * PANIC is free software licensed under the GNU General Public License v3.0 or later. + * You may redistribute and/or modify it under the terms of the GPL. + * + * PANIC 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 LICENSE file for the full license text. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * Project Name: PANIC + * Module Name: math + * File Name: matmul.cpp + * Revision: 0.1.0 + * Date: 24-06-2026 + * Author: Michelle Bausager + * + * Description: + * Functions to print out tensors with std::cout << x std::endl; + * + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + +//--------------------------------------------------------------------------------------------------------------------------- +// INCLUDE DESCRIPTION +//----------------------------------------------------------------------------------------------------- +#include +#include // for panic::tensor::real_matrix +#include + +//--------------------------------------------------------------------------------------------------------------------------- +// DEFINE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------------- +// VARIABLE DESCRIPTION +//--------------------------------------------------------------------------------------------------------------------------- +static const panic::types::uint_t matmul_omp_min_work = 10000; + +//--------------------------------------------------------------------------------------------------------------------------- +// FUNCTION PROTOTYPE +//--------------------------------------------------------------------------------------------------------------------------- + +namespace panic { + namespace math { + + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::matmul +// +// Description: +// Multiply two matrices into C. +//-------------------------------------------------------------------------------------------------------------------------- +template +bool matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B, panic::tensor::matrix& C){ + + const panic::types::uint_t rows = A.rows(); + const panic::types::uint_t cols = B.cols(); + const panic::types::uint_t inner = A.cols(); + + + // Dimention mismacth + if( inner != B.rows()){ + C.resize(0,0); + return false; + } + + // In-place case: matmul(A, B, A) or matmul(A, B, B) + // This is not allowed since operation is unsafe. + // Use A = matmul(A, B) or B = matmul(A, B) instead. + if (&C == &A || &C == &B){ + return false; + } + + + if (!C.resize(rows, cols)){ + return false; + } + + const panic::types::uint_t work = rows*cols*inner; + + + PANIC_OMP_PARALLEL_FOR_IF(work > matmul_omp_min_work) + for (panic::types::uint_t i = 0; i < rows; ++i){ + for (panic::types::uint_t j = 0; j < cols; ++j){ + T sum = static_cast(0); + for (panic::types::uint_t k = 0; k < inner; ++k){ + sum += A(i,k) * B(k,j); + } + C(i,j) = sum; + } + } + return true; +} + +//-------------------------------------------------------------------------------------------------------------------------- +// Function Name : panic::math::matmul +// +// Description: +// Multiply two matrices and returns the result. +//-------------------------------------------------------------------------------------------------------------------------- +template +panic::tensor::matrix matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B){ + + panic::tensor::matrix C; + + if (!matmul(A,B,C)){ + return panic::tensor::matrix(); + } + + return C; +} + + +//--------------------------------------------------------------------------------------------------------------------------- +// EXPLICIT TEMPLATE DECLARATION +//--------------------------------------------------------------------------------------------------------------------------- + +//-------------------------------------------------------------------------------------------------------------------------- +// Function : bool matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B, panic::tensor::matrix& C) +template bool matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); + +template bool matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); + +template bool matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B, + panic::tensor::matrix& C +); + +//-------------------------------------------------------------------------------------------------------------------------- +// Function : panic::tensor::matrix matmul(const panic::tensor::matrix& A, const panic::tensor::matrix& B) +template panic::tensor::matrix matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); + +template panic::tensor::matrix matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); + +template panic::tensor::matrix matmul( + const panic::tensor::matrix& A, + const panic::tensor::matrix& B +); + + + } // namespace math +} // namespace panic diff --git a/src/neural_network/layer/layer.cpp b/src/neural_network/layer/layer.cpp deleted file mode 100644 index 0c0c7ba..0000000 --- a/src/neural_network/layer/layer.cpp +++ /dev/null @@ -1,329 +0,0 @@ -/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * - * PANIC - * Portable Algorithms and Numerics In C++ - * - * Scientific computing from scratch, with feeling. - * - * Copyright (c) 2026 Michelle Bausager - * - * This file is part of PANIC. - * - * PANIC is free software licensed under the GNU General Public License v3.0 or later. - * You may redistribute and/or modify it under the terms of the GPL. - * - * PANIC 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 LICENSE file for the full license text. - * - * SPDX-License-Identifier: GPL-3.0-or-later - * - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * - * Project Name: PANIC - * Module Name: neural_network - * File Name: layer_dense.cpp - * Revision: 0.1.0 - * Date: 23-06-2026 - * Author: Michelle Bausager - * - * Description: - * Defines the dense layers used in neural network - * - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - -//--------------------------------------------------------------------------------------------------------------------------- -// INCLUDE DESCRIPTION -//--------------------------------------------------------------------------------------------------------------------------- -#include -#include - -//--------------------------------------------------------------------------------------------------------------------------- -// DEFINE DESCRIPTION -//--------------------------------------------------------------------------------------------------------------------------- - -//--------------------------------------------------------------------------------------------------------------------------- -// TYPE DESCRIPTION -//--------------------------------------------------------------------------------------------------------------------------- - -//--------------------------------------------------------------------------------------------------------------------------- -// VARIABLE DESCRIPTION -//--------------------------------------------------------------------------------------------------------------------------- -static const panic::uint_t vector_omp_min_size = 10000; - -//--------------------------------------------------------------------------------------------------------------------------- -// FUNCTION PROTOTYPE -//--------------------------------------------------------------------------------------------------------------------------- -namespace panic{ - namespace tensor{ - - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Creates an empty vector. -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector() { - length = 0; - data = 0; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Creates a vector with size allocation and initializes all values to zero. -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(panic::uint_t size){ - length = size; - - if (length == 0){ - data = 0; - return; - } - - data = new T[length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ - data[i] = static_cast(0); - } - -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Creates a vector with size allocation and initializes all values. -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(panic::uint_t size, T value){ - length = size; - - if (size == 0){ - data = 0; - return; - } - - data = new T[size]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ - data[i] = value; - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Copy-contructor, makes a deep copy of another vector like this: -// vector a(3); -// vector b = a; -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(const vector& other){ - length = other.length; - - if (length == 0){ - data = 0; - return; - } - - data = new T[length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ - data[i] = other.data[i]; - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Deconstructor Name : panic::tensor::vector::~vector -// -// Description: -// Deletes the data and releases the memory. -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::~vector(){ - delete[] data; - - data = 0; - length = 0; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator= -// -// Description: -// Copy-assignment. Copies from another vector like this: -// vector a(5); -// vector b(3); -// b = a; -//-------------------------------------------------------------------------------------------------------------------------- -template -vector& vector::operator=(const vector& other){ - if (this == &other){ - return *this; - } - - T* new_data = 0; - - if (other.length > 0){ - new_data = new T[other.length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < other.length; ++i){ - new_data[i] = other.data[i]; - } - } - - delete[] data; - - data = new_data; - length = other.length; - - return *this; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::resize -// -// Description: -// Returns the length/size of the vector -//-------------------------------------------------------------------------------------------------------------------------- -template -panic::uint_t vector::size() const{ - return length; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::resize -// -// Description: -// Resizes the vector to new length and keeps old values -//-------------------------------------------------------------------------------------------------------------------------- -template -bool vector::resize(panic::uint_t new_size){ - if (new_size == length){ - return true; - } - - if (new_size == 0){ - data = 0; - length = 0; - - return true; - } - - T* new_data = new T[new_size]; - panic::uint_t copy_size = length; - - if (new_size < length){ - copy_size = new_size; - } - - PANIC_OMP_PARALLEL_FOR_IF(copy_size > vector_omp_min_size) - for (panic::uint_t i = 0; i < copy_size; ++i){ - new_data[i] = data[i]; - } - - PANIC_OMP_PARALLEL_FOR_IF(copy_size - new_size > vector_omp_min_size) - for (panic::uint_t i = copy_size; i < new_size; ++i){ - new_data[i] = static_cast(0); - } - - delete[] data; - - data = new_data; - length = new_size; - - return true; - -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::fill -// -// Description: -// Fills te vector with a value -//-------------------------------------------------------------------------------------------------------------------------- -template -bool vector::fill(T value){ - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ - data[i] = value; - } - - return true; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator[] -// -// Description: -// Lets you read and write v[index] -//-------------------------------------------------------------------------------------------------------------------------- -template -T& vector::operator[](panic::uint_t index){ - return data[index]; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator[] -// -// Description: -// Lets you read v[index] from a const vector -//-------------------------------------------------------------------------------------------------------------------------- -template -const T& vector::operator[](panic::uint_t index) const{ - return data[index]; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::at -// -// Description: -// Lets you read and write v.at(index) with index bounse -//-------------------------------------------------------------------------------------------------------------------------- -template -T& vector::at(panic::uint_t index){ - - if (index >= length){ - return data[length-1]; - } - - return data[index]; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::at -// -// Description: -// Lets you read v[index] from a const vector with index bounse -//-------------------------------------------------------------------------------------------------------------------------- -template -const T& vector::at(panic::uint_t index) const{ - if (index >= length){ - return data[length-1]; - } - return data[index]; -} - - - -//--------------------------------------------------------------------------------------------------------------------------- -// EXPLICIT TEMPLATE INSTANTIATION -//--------------------------------------------------------------------------------------------------------------------------- - -template struct vector; -template struct vector; -template struct vector; - - - } // namespace tensor -} // namespace panic \ No newline at end of file diff --git a/src/neural_network/layer/layer_dense.cpp b/src/neural_network/layer/layer_dense.cpp index 0c0c7ba..9534b71 100644 --- a/src/neural_network/layer/layer_dense.cpp +++ b/src/neural_network/layer/layer_dense.cpp @@ -35,8 +35,10 @@ //--------------------------------------------------------------------------------------------------------------------------- // INCLUDE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -#include +#include #include +#include +#include //--------------------------------------------------------------------------------------------------------------------------- // DEFINE DESCRIPTION @@ -49,97 +51,37 @@ //--------------------------------------------------------------------------------------------------------------------------- // VARIABLE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -static const panic::uint_t vector_omp_min_size = 10000; +static const panic::types::uint_t layer_dense_omp_min_size = 10000; //--------------------------------------------------------------------------------------------------------------------------- // FUNCTION PROTOTYPE //--------------------------------------------------------------------------------------------------------------------------- namespace panic{ - namespace tensor{ + namespace neural_network{ //-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector +// Constructor Name : panic::neural_network::layer_dense // // Description: -// Creates an empty vector. +// Creates an empty layer. //-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector() { - length = 0; - data = 0; +layer_dense::layer_dense() { + weights.resize(0,0); + biases.resize(0); + outputs.resize(0,0); } //-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector +// Constructor Name : panic::neural_network::layer_dense // // Description: -// Creates a vector with size allocation and initializes all values to zero. +// Creates an empty layer. //-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(panic::uint_t size){ - length = size; - - if (length == 0){ - data = 0; - return; - } - - data = new T[length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ - data[i] = static_cast(0); - } - -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Creates a vector with size allocation and initializes all values. -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(panic::uint_t size, T value){ - length = size; - - if (size == 0){ - data = 0; - return; - } - - data = new T[size]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ - data[i] = value; - } -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Constructor Name : panic::tensor::vector::vector -// -// Description: -// Copy-contructor, makes a deep copy of another vector like this: -// vector a(3); -// vector b = a; -//-------------------------------------------------------------------------------------------------------------------------- -template -vector::vector(const vector& other){ - length = other.length; - - if (length == 0){ - data = 0; - return; - } - - data = new T[length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ - data[i] = other.data[i]; - } +layer_dense::layer_dense(panic::types::uint_t input_size, panic::types::uint_t neurons) { + weights.resize(input_size, neurons); + biases.resize(neurons); + outputs.resize(0,0); } //-------------------------------------------------------------------------------------------------------------------------- @@ -148,182 +90,56 @@ vector::vector(const vector& other){ // Description: // Deletes the data and releases the memory. //-------------------------------------------------------------------------------------------------------------------------- -template -vector::~vector(){ - delete[] data; - - data = 0; - length = 0; -} +//template +//vector::~vector(){ +// delete[] data; +// +// data = 0; +// length = 0; +//} //-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator= +// Function Name : panic::neural_network::layer_dense.forward // // Description: -// Copy-assignment. Copies from another vector like this: -// vector a(5); -// vector b(3); -// b = a; +// Calculated the forward pass: +// outputs = inputs * weights + biases //-------------------------------------------------------------------------------------------------------------------------- -template -vector& vector::operator=(const vector& other){ - if (this == &other){ - return *this; +bool layer_dense::forward(const panic::tensor::real_matrix& inputs){ + + if (inputs.cols() != weights.rows()){ + return false; } - T* new_data = 0; - - if (other.length > 0){ - new_data = new T[other.length]; - - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < other.length; ++i){ - new_data[i] = other.data[i]; - } + if (!outputs.resize(inputs.rows(), weights.cols())){ + return false; } - delete[] data; - - data = new_data; - length = other.length; - - return *this; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::resize -// -// Description: -// Returns the length/size of the vector -//-------------------------------------------------------------------------------------------------------------------------- -template -panic::uint_t vector::size() const{ - return length; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::resize -// -// Description: -// Resizes the vector to new length and keeps old values -//-------------------------------------------------------------------------------------------------------------------------- -template -bool vector::resize(panic::uint_t new_size){ - if (new_size == length){ - return true; + if (!panic::math::matmul(inputs, weights, outputs)){ + return false; } - if (new_size == 0){ - data = 0; - length = 0; - - return true; - } - - T* new_data = new T[new_size]; - panic::uint_t copy_size = length; - - if (new_size < length){ - copy_size = new_size; - } - - PANIC_OMP_PARALLEL_FOR_IF(copy_size > vector_omp_min_size) - for (panic::uint_t i = 0; i < copy_size; ++i){ - new_data[i] = data[i]; - } - - PANIC_OMP_PARALLEL_FOR_IF(copy_size - new_size > vector_omp_min_size) - for (panic::uint_t i = copy_size; i < new_size; ++i){ - new_data[i] = static_cast(0); - } - - delete[] data; - - data = new_data; - length = new_size; - - return true; - -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::fill -// -// Description: -// Fills te vector with a value -//-------------------------------------------------------------------------------------------------------------------------- -template -bool vector::fill(T value){ - PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ - data[i] = value; + if (!panic::math::add_rowwise(outputs, biases, outputs)){ + return false; } return true; } + //-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator[] +// Function Name : panic::neural_network::layer_dense.backward // // Description: -// Lets you read and write v[index] +// Calculated the backward pass: +// ?? //-------------------------------------------------------------------------------------------------------------------------- -template -T& vector::operator[](panic::uint_t index){ - return data[index]; +bool layer_dense::backward(const panic::tensor::real_matrix& dinputs){ + + + return true; } -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::operator[] -// -// Description: -// Lets you read v[index] from a const vector -//-------------------------------------------------------------------------------------------------------------------------- -template -const T& vector::operator[](panic::uint_t index) const{ - return data[index]; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::at -// -// Description: -// Lets you read and write v.at(index) with index bounse -//-------------------------------------------------------------------------------------------------------------------------- -template -T& vector::at(panic::uint_t index){ - - if (index >= length){ - return data[length-1]; - } - - return data[index]; -} - -//-------------------------------------------------------------------------------------------------------------------------- -// Function Name : panic::tensor::vector::at -// -// Description: -// Lets you read v[index] from a const vector with index bounse -//-------------------------------------------------------------------------------------------------------------------------- -template -const T& vector::at(panic::uint_t index) const{ - if (index >= length){ - return data[length-1]; - } - return data[index]; -} - - - -//--------------------------------------------------------------------------------------------------------------------------- -// EXPLICIT TEMPLATE INSTANTIATION -//--------------------------------------------------------------------------------------------------------------------------- - -template struct vector; -template struct vector; -template struct vector; - } // namespace tensor -} // namespace panic \ No newline at end of file +} // namespace panic diff --git a/src/tensor/matrix.cpp b/src/tensor/matrix.cpp index 29edb09..548495d 100644 --- a/src/tensor/matrix.cpp +++ b/src/tensor/matrix.cpp @@ -49,7 +49,7 @@ //--------------------------------------------------------------------------------------------------------------------------- // VARIABLE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -static const panic::uint_t matrix_omp_min_size = 10000; +static const panic::types::uint_t matrix_omp_min_size = 10000; //--------------------------------------------------------------------------------------------------------------------------- // FUNCTION PROTOTYPE @@ -79,7 +79,7 @@ matrix::matrix() { // Creates a matrix with size allocation and initializes all values to zero. //-------------------------------------------------------------------------------------------------------------------------- template -matrix::matrix(panic::uint_t rows, panic::uint_t cols){ +matrix::matrix(panic::types::uint_t rows, panic::types::uint_t cols){ n = rows; m = cols; length = n*m; @@ -92,7 +92,7 @@ matrix::matrix(panic::uint_t rows, panic::uint_t cols){ data = new T[length]; PANIC_OMP_PARALLEL_FOR_IF(length > matrix_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = static_cast(0); } @@ -105,7 +105,7 @@ matrix::matrix(panic::uint_t rows, panic::uint_t cols){ // Creates a matrix with size allocation and initializes all values. //-------------------------------------------------------------------------------------------------------------------------- template -matrix::matrix(panic::uint_t rows, panic::uint_t cols, T value){ +matrix::matrix(panic::types::uint_t rows, panic::types::uint_t cols, T value){ n = rows; m = cols; length = n*m; @@ -118,7 +118,7 @@ matrix::matrix(panic::uint_t rows, panic::uint_t cols, T value){ data = new T[length]; PANIC_OMP_PARALLEL_FOR_IF(length > matrix_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = value; } } @@ -145,7 +145,7 @@ matrix::matrix(const matrix& other){ data = new T[length]; PANIC_OMP_PARALLEL_FOR_IF(length > matrix_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = other.data[i]; } } @@ -186,8 +186,8 @@ matrix& matrix::operator=(const matrix& other){ if (other.length > 0){ new_data = new T[other.length]; - PANIC_OMP_PARALLEL_FOR_IF(length > matrix_omp_min_size) - for (panic::uint_t i = 0; i < other.length; ++i){ + PANIC_OMP_PARALLEL_FOR_IF(other.length > matrix_omp_min_size) + for (panic::types::uint_t i = 0; i < other.length; ++i){ new_data[i] = other.data[i]; } } @@ -209,7 +209,7 @@ matrix& matrix::operator=(const matrix& other){ // Returns the length/size of the matrix //-------------------------------------------------------------------------------------------------------------------------- template -panic::uint_t matrix::rows() const{ +panic::types::uint_t matrix::rows() const{ return n; } @@ -220,7 +220,7 @@ panic::uint_t matrix::rows() const{ // Returns the length/size of the matrix //-------------------------------------------------------------------------------------------------------------------------- template -panic::uint_t matrix::cols() const{ +panic::types::uint_t matrix::cols() const{ return m; } @@ -231,7 +231,7 @@ panic::uint_t matrix::cols() const{ // Resizes the matrix to new dimentions and keeps old values //-------------------------------------------------------------------------------------------------------------------------- template -bool matrix::resize(panic::uint_t new_n, panic::uint_t new_m){ +bool matrix::resize(panic::types::uint_t new_n, panic::types::uint_t new_m){ if ((new_n == n) && (new_m == m)){ return true; @@ -247,22 +247,22 @@ bool matrix::resize(panic::uint_t new_n, panic::uint_t new_m){ return true; } - panic::uint_t new_length = new_n*new_m; + panic::types::uint_t new_length = new_n*new_m; T* new_data = new T[new_length]; - panic::uint_t copy_size = length; + panic::types::uint_t copy_size = length; if (new_length < length){ copy_size = new_length; } PANIC_OMP_PARALLEL_FOR_IF(copy_size > matrix_omp_min_size) - for (panic::uint_t i = 0; i < copy_size; ++i){ + for (panic::types::uint_t i = 0; i < copy_size; ++i){ new_data[i] = data[i]; } PANIC_OMP_PARALLEL_FOR_IF(new_length - copy_size > matrix_omp_min_size) - for (panic::uint_t i = copy_size; i < new_length; ++i){ + for (panic::types::uint_t i = copy_size; i < new_length; ++i){ new_data[i] = static_cast(0); } @@ -286,7 +286,7 @@ bool matrix::resize(panic::uint_t new_n, panic::uint_t new_m){ template bool matrix::fill(T value){ PANIC_OMP_PARALLEL_FOR_IF(length > matrix_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = value; } @@ -300,7 +300,7 @@ bool matrix::fill(T value){ // Lets you read and write A(2,3) //-------------------------------------------------------------------------------------------------------------------------- template -T& matrix::operator()(panic::uint_t index_n, panic::uint_t index_m){ +T& matrix::operator()(panic::types::uint_t index_n, panic::types::uint_t index_m){ return data[index_n*m + index_m]; } @@ -312,7 +312,7 @@ T& matrix::operator()(panic::uint_t index_n, panic::uint_t index_m){ // Lets you read A(2,3) from a const matrix //-------------------------------------------------------------------------------------------------------------------------- template -const T& matrix::operator()(panic::uint_t index_n, panic::uint_t index_m) const{ +const T& matrix::operator()(panic::types::uint_t index_n, panic::types::uint_t index_m) const{ return data[index_n*m + index_m]; } @@ -321,9 +321,9 @@ const T& matrix::operator()(panic::uint_t index_n, panic::uint_t index_m) con // EXPLICIT TEMPLATE INSTANTIATION //--------------------------------------------------------------------------------------------------------------------------- -template struct matrix; -template struct matrix; -template struct matrix; +template struct matrix; +template struct matrix; +template struct matrix; } // namespace tensor diff --git a/src/tensor/vector.cpp b/src/tensor/vector.cpp index 8bd034a..4e79961 100644 --- a/src/tensor/vector.cpp +++ b/src/tensor/vector.cpp @@ -49,7 +49,7 @@ //--------------------------------------------------------------------------------------------------------------------------- // VARIABLE DESCRIPTION //--------------------------------------------------------------------------------------------------------------------------- -static const panic::uint_t vector_omp_min_size = 10000; +static const panic::types::uint_t vector_omp_min_size = 10000; //--------------------------------------------------------------------------------------------------------------------------- // FUNCTION PROTOTYPE @@ -77,7 +77,7 @@ vector::vector() { // Creates a vector with size allocation and initializes all values to zero. //-------------------------------------------------------------------------------------------------------------------------- template -vector::vector(panic::uint_t size){ +vector::vector(panic::types::uint_t size){ length = size; if (length == 0){ @@ -88,7 +88,7 @@ vector::vector(panic::uint_t size){ data = new T[length]; PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ + for (panic::types::uint_t i = 0; i < size; ++i){ data[i] = static_cast(0); } @@ -101,7 +101,7 @@ vector::vector(panic::uint_t size){ // Creates a vector with size allocation and initializes all values. //-------------------------------------------------------------------------------------------------------------------------- template -vector::vector(panic::uint_t size, T value){ +vector::vector(panic::types::uint_t size, T value){ length = size; if (size == 0){ @@ -112,7 +112,7 @@ vector::vector(panic::uint_t size, T value){ data = new T[size]; PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < size; ++i){ + for (panic::types::uint_t i = 0; i < size; ++i){ data[i] = value; } } @@ -137,7 +137,7 @@ vector::vector(const vector& other){ data = new T[length]; PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = other.data[i]; } } @@ -177,7 +177,7 @@ vector& vector::operator=(const vector& other){ new_data = new T[other.length]; PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < other.length; ++i){ + for (panic::types::uint_t i = 0; i < other.length; ++i){ new_data[i] = other.data[i]; } } @@ -197,7 +197,7 @@ vector& vector::operator=(const vector& other){ // Returns the length/size of the vector //-------------------------------------------------------------------------------------------------------------------------- template -panic::uint_t vector::size() const{ +panic::types::uint_t vector::size() const{ return length; } @@ -208,7 +208,7 @@ panic::uint_t vector::size() const{ // Resizes the vector to new length and keeps old values //-------------------------------------------------------------------------------------------------------------------------- template -bool vector::resize(panic::uint_t new_size){ +bool vector::resize(panic::types::uint_t new_size){ if (new_size == length){ return true; } @@ -221,19 +221,19 @@ bool vector::resize(panic::uint_t new_size){ } T* new_data = new T[new_size]; - panic::uint_t copy_size = length; + panic::types::uint_t copy_size = length; if (new_size < length){ copy_size = new_size; } PANIC_OMP_PARALLEL_FOR_IF(copy_size > vector_omp_min_size) - for (panic::uint_t i = 0; i < copy_size; ++i){ + for (panic::types::uint_t i = 0; i < copy_size; ++i){ new_data[i] = data[i]; } PANIC_OMP_PARALLEL_FOR_IF(copy_size - new_size > vector_omp_min_size) - for (panic::uint_t i = copy_size; i < new_size; ++i){ + for (panic::types::uint_t i = copy_size; i < new_size; ++i){ new_data[i] = static_cast(0); } @@ -255,7 +255,7 @@ bool vector::resize(panic::uint_t new_size){ template bool vector::fill(T value){ PANIC_OMP_PARALLEL_FOR_IF(length > vector_omp_min_size) - for (panic::uint_t i = 0; i < length; ++i){ + for (panic::types::uint_t i = 0; i < length; ++i){ data[i] = value; } @@ -269,7 +269,7 @@ bool vector::fill(T value){ // Lets you read and write v[index] //-------------------------------------------------------------------------------------------------------------------------- template -T& vector::operator[](panic::uint_t index){ +T& vector::operator[](panic::types::uint_t index){ return data[index]; } @@ -280,7 +280,7 @@ T& vector::operator[](panic::uint_t index){ // Lets you read v[index] from a const vector //-------------------------------------------------------------------------------------------------------------------------- template -const T& vector::operator[](panic::uint_t index) const{ +const T& vector::operator[](panic::types::uint_t index) const{ return data[index]; } @@ -291,7 +291,7 @@ const T& vector::operator[](panic::uint_t index) const{ // Lets you read and write v.at(index) with index bounse //-------------------------------------------------------------------------------------------------------------------------- template -T& vector::at(panic::uint_t index){ +T& vector::at(panic::types::uint_t index){ if (index >= length){ return data[length-1]; @@ -307,7 +307,7 @@ T& vector::at(panic::uint_t index){ // Lets you read v[index] from a const vector with index bounse //-------------------------------------------------------------------------------------------------------------------------- template -const T& vector::at(panic::uint_t index) const{ +const T& vector::at(panic::types::uint_t index) const{ if (index >= length){ return data[length-1]; } @@ -320,9 +320,9 @@ const T& vector::at(panic::uint_t index) const{ // EXPLICIT TEMPLATE INSTANTIATION //--------------------------------------------------------------------------------------------------------------------------- -template struct vector; -template struct vector; -template struct vector; +template struct vector; +template struct vector; +template struct vector; } // namespace tensor