diff --git a/clic/include/core/clesperanto.hpp b/clic/include/core/clesperanto.hpp index d875ed012..b3eafd683 100644 --- a/clic/include/core/clesperanto.hpp +++ b/clic/include/core/clesperanto.hpp @@ -148,6 +148,9 @@ class Clesperanto auto GradientY(const Image & source, const Image & destination) -> void; + auto + GradientZ(const Image & source, const Image & destination) -> void; + auto Greater(const Image & source1, const Image & source2, const Image & destination) -> void; diff --git a/clic/include/tier1/cleGradientZKernel.hpp b/clic/include/tier1/cleGradientZKernel.hpp new file mode 100644 index 000000000..3af3dfcaa --- /dev/null +++ b/clic/include/tier1/cleGradientZKernel.hpp @@ -0,0 +1,32 @@ +#ifndef __TIER1_CLEGRADIENTZKERNEL_HPP +#define __TIER1_CLEGRADIENTZKERNEL_HPP + +#include "cleOperation.hpp" + +namespace cle +{ + +class GradientZKernel : public Operation +{ +public: + explicit GradientZKernel(const ProcessorPointer & device); + + auto + SetInput(const Image & object) -> void; + + auto + SetOutput(const Image & object) -> void; +}; + +inline auto +GradientZKernel_Call(const std::shared_ptr & device, const Image & src, const Image & dst) -> void +{ + GradientZKernel kernel(device); + kernel.SetInput(src); + kernel.SetOutput(dst); + kernel.Execute(); +} + +} // namespace cle + +#endif // __TIER1_CLEGradientZKERNEL_HPP diff --git a/clic/src/core/clesperanto.cpp b/clic/src/core/clesperanto.cpp index 9165f78e6..7aa134606 100644 --- a/clic/src/core/clesperanto.cpp +++ b/clic/src/core/clesperanto.cpp @@ -228,6 +228,12 @@ Clesperanto::GradientY(const Image & source, const Image & destination) -> void GradientYKernel_Call(this->GetDevice(), source, destination); } +auto +Clesperanto::GradientZ(const Image & source, const Image & destination) -> void +{ + GradientZKernel_Call(this->GetDevice(), source, destination); +} + auto Clesperanto::Greater(const Image & source1, const Image & source2, const Image & destination) -> void { diff --git a/clic/src/tier1/cleGradientZKernel.cpp b/clic/src/tier1/cleGradientZKernel.cpp new file mode 100644 index 000000000..a82e3fd3c --- /dev/null +++ b/clic/src/tier1/cleGradientZKernel.cpp @@ -0,0 +1,27 @@ +#include "cleGradientZKernel.hpp" + +namespace cle +{ + +GradientZKernel::GradientZKernel(const ProcessorPointer & device) + : Operation(device, 2) +{ + std::string cl_header_ = { +#include "cle_gradient_z.h" + }; + this->SetSource("gradient_z", cl_header_); +} + +auto +GradientZKernel::SetInput(const Image & object) -> void +{ + this->AddParameter("src", object); +} + +auto +GradientZKernel::SetOutput(const Image & object) -> void +{ + this->AddParameter("dst", object); +} + +} // namespace cle diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d5ff9b832..a5377072d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -202,6 +202,12 @@ target_link_libraries(gradient_x_test PRIVATE CLIc::CLIc) set_target_properties(gradient_x_test PROPERTIES FOLDER "Tests") target_compile_features(gradient_x_test PRIVATE cxx_std_17) +add_executable(gradient_z_test gradient_z_test.cpp) +add_dependencies(gradient_z_test CLIc) +target_link_libraries(gradient_z_test PRIVATE CLIc::CLIc) +set_target_properties(gradient_z_test PROPERTIES FOLDER "Tests") +target_compile_features(gradient_z_test PRIVATE cxx_std_17) + add_executable(masked_voronoi_labeling_test masked_voronoi_labeling_test.cpp) add_dependencies(masked_voronoi_labeling_test CLIc) target_link_libraries(masked_voronoi_labeling_test PRIVATE CLIc::CLIc) @@ -434,6 +440,7 @@ add_test(NAME detect_maxima_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} C add_test(NAME difference_of_gaussian_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND difference_of_gaussian_test) add_test(NAME dilate_sphere_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND dilate_sphere_test) add_test(NAME gradient_x_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND gradient_x_test) +add_test(NAME gradient_z_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND gradient_z_test) add_test(NAME equal_constant_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND equal_constant_test) add_test(NAME equal_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND equal_test) add_test(NAME erode_sphere_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND erode_sphere_test) @@ -556,4 +563,5 @@ set_tests_properties(absolute_test sum_z_projection_test threshold_otsu_test gradient_x_test + gradient_z_test voronoi_otsu_labeling_test PROPERTIES LABELS "KERNELS" WILL_FAIL FALSE) \ No newline at end of file diff --git a/tests/gradient_z_test.cpp b/tests/gradient_z_test.cpp new file mode 100644 index 000000000..bb49899dd --- /dev/null +++ b/tests/gradient_z_test.cpp @@ -0,0 +1,237 @@ + + +#include "clesperanto.hpp" + +#include + +template +auto +run_test(const std::array & shape, const cle::MemoryType & mem_type) -> bool +{ + std::vector input = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + std::vector valid = { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0 }; + + cle::Clesperanto cle; + cle.GetDevice()->WaitForKernelToFinish(); + auto gpu_input = cle.Push(input, shape, mem_type); + auto gpu_output = cle.Create(shape, mem_type); + cle.GradientZ(gpu_input, gpu_output); + auto output = cle.Pull(gpu_output); + return std::equal(output.begin(), output.end(), valid.begin()); +} + +auto +main(int argc, char ** argv) -> int +{ + if (!run_test({ 3, 3, 3 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + /* + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + if (!run_test({ 10, 7, 5 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 7, 5 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + */ + return EXIT_SUCCESS; +} \ No newline at end of file