diff --git a/CMakeLists.txt b/CMakeLists.txt index 795df3edb4..7e93ba32fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ IF(BUILD_GRAPHICS) IF(FORGE_FOUND) ADD_DEFINITIONS(-DGLEW_MX -DWITH_GRAPHICS) - INCLUDE("${CMAKE_MODULE_PATH}/FindGLEWmx.cmake") + FIND_PACKAGE(GLEWmx REQUIRED) INCLUDE_DIRECTORIES( ${FORGE_INCLUDE_DIRECTORIES} diff --git a/CMakeModules/FindForge.cmake b/CMakeModules/FindForge.cmake index 9ad5cde73f..117451da97 100644 --- a/CMakeModules/FindForge.cmake +++ b/CMakeModules/FindForge.cmake @@ -73,9 +73,9 @@ FIND_LIBRARY(FORGE_LIBRARY NAMES forge HINTS "${FORGE_PACKAGE_DIR}/lib") -INCLUDE("${CMAKE_MODULE_PATH}/FindGLEWmx.cmake") +FIND_PACKAGE(GLEWmx REQUIRED) -IF(GLEWmx_FOUND AND OPENGL_FOUND) +IF(GLEWMX_FOUND AND OPENGL_FOUND) IF(FORGE_INCLUDE_DIRECTORIES) SET(FORGE_INCLUDE_DIRECTORIES ${FORGE_INCLUDE_DIRECTORIES} ${GLEW_INCLUDE_DIR} CACHE INTERNAL "All include dirs required for FORGE'") @@ -90,10 +90,10 @@ IF(GLEWmx_FOUND AND OPENGL_FOUND) FIND_PACKAGE_HANDLE_STANDARD_ARGS(FORGE DEFAULT_MSG FORGE_LIBRARIES FORGE_INCLUDE_DIRECTORIES) MARK_AS_ADVANCED(FORGE_LIBRARIES FORGE_INCLUDE_DIRECTORIES) -ELSE(GLEWmx_FOUND AND OPENGL_FOUND) - IF(NOT GLEWmx_FOUND) +ELSE(GLEWMX_FOUND AND OPENGL_FOUND) + IF(NOT GLEWMX_FOUND) MESSAGE(FATAL_ERROR "GLEW-MX Not Found") ELSEIF(NOT OPENGL_FOUND) MESSAGE(FATAL_ERROR "OpenGL Not Found") ENDIF() -ENDIF(GLEWmx_FOUND AND OPENGL_FOUND) +ENDIF(GLEWMX_FOUND AND OPENGL_FOUND) diff --git a/CMakeModules/FindGLEWmx.cmake b/CMakeModules/FindGLEWmx.cmake index 8231d33e15..587a6ff208 100644 --- a/CMakeModules/FindGLEWmx.cmake +++ b/CMakeModules/FindGLEWmx.cmake @@ -87,5 +87,6 @@ ENDIF(USE_GLEWmx_STATIC) MARK_AS_ADVANCED(GLEWmxs_LIBRARY GLEWmxd_LIBRARY GLEWmx_LIBRARY GLEW_INCLUDE_DIR) INCLUDE(FindPackageHandleStandardArgs) +# Sets GLEWMX_FOUND FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLEWmx DEFAULT_MSG GLEW_INCLUDE_DIR GLEWmx_LIBRARY) diff --git a/CMakeModules/FindLAPACKE.cmake b/CMakeModules/FindLAPACKE.cmake index 5ecf7be55d..2ebd8ddbc5 100644 --- a/CMakeModules/FindLAPACKE.cmake +++ b/CMakeModules/FindLAPACKE.cmake @@ -143,7 +143,7 @@ ELSE(PC_LAPACKE_FOUND) ENDIF(LAPACKE_ROOT_DIR) ENDIF(PC_LAPACKE_FOUND) -IF(LAPACKE_LIB AND LAPACK_LIB) +IF(PC_LAPACKE_FOUND OR (LAPACKE_LIB AND LAPACK_LIB)) SET(LAPACK_LIBRARIES ${LAPACKE_LIB} ${LAPACK_LIB}) ENDIF() IF(LAPACKE_INCLUDES) diff --git a/CMakeModules/build_boost_compute.cmake b/CMakeModules/build_boost_compute.cmake index 03c20435a8..37f8fc3ad3 100644 --- a/CMakeModules/build_boost_compute.cmake +++ b/CMakeModules/build_boost_compute.cmake @@ -1,9 +1,9 @@ # If using a commit, remove the v prefix to VER in URL. # If using a tag, don't use v in VER # This is because of how github handles it's release tar balls -SET(VER 0.5) -SET(URL https://github.com/boostorg/compute/archive/v${VER}.tar.gz) -SET(MD5 69a52598ac539d3b7f6005a3dd2b6f58) +SET(VER boost-1.61.0) +SET(URL https://github.com/boostorg/compute/archive/${VER}.tar.gz) +SET(MD5 7e1c433b48825d8cb2effa963823aec8) SET(thirdPartyDir "${CMAKE_BINARY_DIR}/third_party") SET(srcDir "${thirdPartyDir}/compute-${VER}") diff --git a/src/api/c/median.cpp b/src/api/c/median.cpp index b5c033f461..a8268f5ff4 100644 --- a/src/api/c/median.cpp +++ b/src/api/c/median.cpp @@ -27,14 +27,30 @@ template static double median(const af_array& in) { dim_t nElems = getInfo(in).elements(); - double mid = (nElems + 1) / 2; - af_seq mdSpan[1]= {af_make_seq(mid-1, mid, 1)}; dim4 dims(nElems, 1, 1, 1); af_array temp = 0; AF_CHECK(af_moddims(&temp, in, 1, dims.get())); const Array input = getArray(temp); + // Shortcut cases for 1 or 2 elements + if(nElems == 1) { + T result; + AF_CHECK(af_get_data_ptr((void*)&result, in)); + return result; + } else if(nElems == 2) { + T result[2]; + AF_CHECK(af_get_data_ptr((void*)&result, in)); + if (input.isFloating()) { + return division(result[0] + result[1], 2.0); + } else { + return division(result[0] + result[1], 2.0); + } + } + + double mid = (nElems + 1) / 2; + af_seq mdSpan[1]= {af_make_seq(mid-1, mid, 1)}; + Array sortedArr = sort(input, 0); af_array sarrHandle = getHandle(sortedArr); @@ -66,6 +82,13 @@ template static af_array median(const af_array& in, const dim_t dim) { const Array input = getArray(in); + + // Shortcut cases for 1 element along selected dimension + if(input.dims()[dim] == 1) { + Array result = copyArray(input); + return getHandle(result); + } + Array sortedIn = sort(input, dim); int dimLength = input.dims()[dim];